黑马程序员技术交流社区

标题: 常量池的问题 [打印本页]

作者: kevinmesss.tz    时间: 2014-2-6 12:34
标题: 常量池的问题
本帖最后由 kevinmesss.tz 于 2014-2-7 16:40 编辑

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
quan23355 发表于 2014-2-7 01:14
补充一点就是Integer a = 128自动装箱涉及到底层的操作,而Integer x = new Intefer("123")不涉及到底层操 ...

理解了!谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2