Integer m = 128 ;Integer n = 128 ;m==n 为false因为是两个对象所以内存地址不同
Integer a = 127 ; Integer b = 127 ; a==b为true 因为数值在byte范围内就会从常量池中去 而不开辟新空间
那么为什么
Integer x = new Intefer("123") ;
Integer y = new Intefer(123) ;
x==y却是false 123小于128应该在常量池中的啊
(x,y一个构造函数有"" 一个没有 有什么区别)作者: quan23355 时间: 2014-2-7 01:03
凡是用new关键字创建对象时,都是在堆内存中创建一个全新的对象并赋于一个全新的地址值,与常量池无关。Integer a = 128与Integer x = new Intefer("123")不同的是Integer a = 128在jdk1.5以后有一个自动装箱的动作,在底层自动new Intefer("128")创建对象并把地址值付给a引用。但底层为了节省内存空间,执行自动装箱的动作时会判断是否是常用数据,如果是常用数据并且在常量池中没有该数据的对像,在常量池中创建对象并把地址值赋给引用变量,如果常量池中存在该常用数据的对象,就直接把地址值赋给引用变量了,而不需要再次创建了,节省了内存空间。作者: quan23355 时间: 2014-2-7 01:14
补充一点就是Integer a = 128自动装箱涉及到底层的操作,而Integer x = new Intefer("123")不涉及到底层操作,与常量池也就没有任何关系作者: kevinmesss.tz 时间: 2014-2-7 12:18