好程序员Java培训分享int和Integer的区别
好程序员Java培训分享int和Integer的区别,在说int和Integer的区别之前,先要弄清楚两个问题:
一、Java基本数据类型及其封装类
二、Java自动拆箱和自动装箱
Java自动拆箱和自动装箱
1、自动装箱
自动装箱其实就是将基本数据类型转换为引用数据类型(对象)
2、自动拆箱
自动拆箱其实就是将引用数据类型转化为基本数据类型
int和Integer的区别
分析
int
Integer
int与Integer的区别
相同值下的int和Integer的比较结果
分析
int
int是Java的基本数据类型。
Integer
Integer继承了Object类,是对象类型,是int的包装类。
int与Integer的区别
值的存储
int存储在栈中
Integer对象的引用存储在栈空间中,对象的数据存储在堆空间中。
初始化
int初始化值为0。
Integer初始化值为null。
传参
int是值传递,栈中的数据不可变。
Integer对象是引用传递,引用不可变,但是引用指向的堆空间地址中的值是可以改变的。
泛型支持
泛型不支持int,但是支持Integer。
运算
int可以直接做运算,是类的特性。
Integer的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型int。
int是基本数据类型,Integer是引用数据类型;
int默认值是0,Integer默认值是null;
int类型直接存储数值,Integer需要实例化对象,指向对象的地址。
相同值下的int和Integer的比较结果
两个通过new生成的变量,结果为false。
int和Integer的值比较,若两者的值相等,则为true。
(注意:在比较时,Integer会自动拆箱为int类型,然后再做比较。)
new生成的Integer变量 和 非new生成的Integer变量比较,,结果为false。
(注意:new生成的Integer变量的值在堆空间中,非new生成的Integer变量的值在在常量池中。)
(注意:非new生成的Integer变量,会先判断常量池中是否有该对象,若有则共享,若无则在常量池中放入该对象;也叫享元模式,后面再说。)
两个非new生成的Integer对象比较,则结果为true。
(注意:此处需要一个前提:值的范围在-128 ~ 127之间。
涉及到Java对int与Integer的自动装箱和拆箱的一种模式:享元模式—flyweight,为了加强对简单数字的重复利用。
在赋值时,其实是执行了Integer的valueOf()方法。
当值在-128 ~ 127之间时,Java会进行自动装箱,然后会对值进行缓存,如果下次再有相同的值,会直接在缓存中取出使用。缓存是通过Integer的内部类IntegerCache来完成的。
当值超出此范围,会在堆中new出一个对象来存储。
PS:自动装箱与拆箱是在JDK1.5中出现的。
)
内部类IntegerCache
通过此类可以缓存简单数字。
缓存的数大小可以由-XX:AutoBoxCacheMax =控制。
jvm初始化时,Java.lang.Integer.IntegerCache.high属性可以设置并保存在私有系统属性中。
规定了low属性的值:-128
来看个例子
1:a == b吗? 废话,肯定不相等。两个new出来的对象地址不一样。
2:c == d吗? 这个也是废话,都是基本数据类型的值肯定相等。
3:现在的关键问题是e == f吗?g == h吗?
答案是:e == f; g != h。为什么会出现这种情况?因为ava在进行编译时Integer g = 130会被编译成Integer.valueOf(130),这个可以通过反编译class文件看到。而通过Integer源码可以得出,Integer.valueOf()方法会在数值-128~127之间会对Integer进行缓存,不会再重新new一个,所以e==f;当数值二大于127或者小于-128的时候则会重新new一个,所以g != h。
Integer的valueOf方法如下
4:c == e吗,i == j吗?
答案都是相等的。因为封装类和基本数据类型进行比较的时候,Java会自动拆箱,然后比较数值是否相等。
综上,我们可以得出几个结论:
1、都是封装类,都是new出来的,肯定不相等。因为对象的内存地址不一样。
2、都是封装类,都不是new出来的,如果值在-128~127之间,那就相等,否则不相等。
3、如果是封装类和基本类型进行比较,只要数值相等那就相等,否则就不相等。因为封装类和基本数据类型进行比较的时候会有一个自动拆箱操作。
4、都是基本数据类型,如果数值相等,那就相等;否则不相等。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。