浅谈java中的常量池

Integer i01 = 59;
​int i02 = 59;
​Integer i03 = Integer.valueOf(59);
​Integer i04 = new Integer(59);
​System.out.println(i01 == i02);//true
​System.out.println(i01 == i03);//true//
​System.out.println(i03 == i04);//false //两个new出来的对象何时都不会相等
​System.out.println(i02 == i04);//true //int 和Integer 怎么比都是相等的,因为Integer在比较之前会先拆箱成int
对于前三行,Java在编译的时候会直接将代码封装成Integer i01 = Integer.valueOf(59);,从而使用常量池中的对象。而第四行,是创建一个新的对象,java会为其分配一个独立的地址,所以不会相等

‘==’问题

八大基本类型间用 == 是比较它们的数值
类之间比较的是它们的引用地址
上例是我在牛客网的练习题,很遗憾的错了,所以记录于此,希望不会再错,

java在编译期讲已确定的一些数据(类、方法、接口等中的常量和字符串常量)保存在常量池中,所以常量池被认为是JVM中的一块特殊的内存空间。

---------

常量池的好处:

常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
(2)节省运行时间:比较字符串时,==比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。(摘自简书:原文链接:http://www.jianshu.com/p/c7f47de2ee80

猜你喜欢

转载自blog.csdn.net/u013130967/article/details/51737433