Integer和int的区别
来源:互联网 发布:js python开发网页游戏 编辑:程序博客网 时间:2024/06/16 21:07
在谈到Integer与int的区别时,估计大多数人只会说到以下几点:
(1)Ingeter是int的包装类,是一个类,int是基本类型(注意Integer作为方法参数时传递的还是值,不是地址,请看总结第五点)。
(2)int的初值为0,Ingeter的初值为null。
(3)int 是在栈里创建的,Integer是在堆里创建的。栈里创建的变量要比在堆创建的速度快得多。效率上面int完胜。
但是在涉及比较、装箱拆箱和缓存等操作时还有很多可探究的地方。下面我结合代码来总结一下。
首先看代码:
public class IntegerTest { public static void main(String[] args) { int i = 21; Integer t1 = 21; Integer t2 = new Integer(21); System.out.println(i == t1); //true,int与Integer(无论new是否)相比,Integer都会自动拆箱与int相比,都相等 System.out.println(i == t2); //true System.out.println(t1 == t2); //false,Integer(常量池中)和new Integer对象(堆中)相比,地址永远不相等 Integer m1 = 127;//在编译这句时会被翻译成Integer m1 = Integer.valueOf(127),执行int的装箱过程,源码请看后面 Integer m2 = 127; System.out.println(m1 == m2); //true,两个非new的Integer对象相比,在-128~127中进行缓存,这个范围则相等 Integer n1 = 128; Integer n2 = 128; System.out.println(n1 == n2); //false,不在-128~127这个范围则不会缓存,不相等 Integer g1 = new Integer(2); Integer g2 = new Integer(2); System.out.println(g1 == g2); //false,两个都是new出来的Integer永远不相等,在堆中的两个不同地址 }}输出结果:
truetruefalsetruefalsefalse
总结:
(1)int与Integer(无论new是否)相比,Integer都会自动拆箱与int相比,都相等。
(2)Integer(常量池中)和new Integer对象(堆中)相比,地址永远不相等。
(3)两个非new的Integer对象相比,在-128~127中进行缓存,这个范围则相等。(重点)
Java在编译Integer m1= 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127),这是int的装箱过程,请看valueOf函数式源码:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) // i>=-128 && i<=127 return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer m1= 127时,会将127进行缓存,下次再写Integer m2= 127时,就会直接从缓存中取,就不会new了。m1==m2的结果为true,而n1 == n2结果为false。
(4)两个都是new出来的Integer永远不相等,在堆中的两个不同地址。
(5)Integer作为一个类,作为方法参数传递时,传递的还是值,而不是地址。请看具体Demo:
public class IntegerValue { public static void fun(Integer i){ i=i+2; } public static void main(String[] args) { Integer p = new Integer(5); fun(p); System.out.println(p); }}输出结果:5,表示Integer传递的是值,不会修改原有对象的值。
(6)在前面我们讲到拆箱装箱过程,请注意:在==比较时只会经历拆箱过程,在=赋值时会出现拆箱和装箱过程。
- int 和 Integer 的区别
- int 和 Integer 的区别
- int和Integer的区别
- int和Integer的区别
- int 和 integer的区别
- Integer和int的区别
- Integer 和 int 的区别
- int和integer的区别
- int和Integer的区别
- int 和integer的区别
- int 和 Integer的区别
- int 和integer的区别
- int 和integer的区别
- Integer和Int的区别
- int 和integer的区别
- int 和integer的区别
- Int 和integer的区别
- int 和Integer的区别
- Codeforces 742 C Arpa's loud Owf and Mehrdad's evil plan
- 申请评分卡模型的构建(一)——数据清洗
- 函数模板和类模板 程序举例及个别心里体会
- 传统运维将被DevOps干掉吗?
- JavaScript基础(七) ---- 日期、定时器
- Integer和int的区别
- dubbo消费者注册服务与发现服务源码
- iOS如何实现语音播报及后台播放
- java基础 细节补充
- PHP学习2
- 又是一道贪心题 活动选择
- 使用SPM绑定执行计划
- Win10自带虚拟机hyper-v安装centos7后改变默认分辨率的方法
- Linux-02VMware安装rhel7.3