Java常量池的一点理解

关于网上的一个面试题,求输出结果:
  1. /** 
  2.  *  
  3.  * @author DreamSea 2011-11-19 
  4.  */ 
  5. public class IntegerTest { 
  6.     public static void main(String[] args) {     
  7.         objPoolTest(); 
  8.     } 
  9.  
  10.     public static void objPoolTest() { 
  11.         Integer i1 = 40
  12.         Integer i2 = 40
  13.         Integer i3 = 0
  14.         Integer i4 = new Integer(40); 
  15.         Integer i5 = new Integer(40); 
  16.         Integer i6 = new Integer(0); 
  17.          
  18.         System.out.println("i1=i2\t" + (i1 == i2)); 
  19.         System.out.println("i1=i2+i3\t" + (i1 == i2 + i3)); 
  20.         System.out.println("i4=i5\t" + (i4 == i5)); 
  21.         System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));     
  22.          
  23.         System.out.println();         
  24.     } 
输出的结果
i1=i2true
i1=i2+i3   true
i4=i5false
i4=i5+i6true
一些理解: 首先什么是常量池 ?
根据百度的回答,常量池是JVM中的一块特殊的存储空间。用于存储类、接口、方法中的常量以及一些字符串常量;当然也可以扩充执行器产生的常量也会放入常量池中。在编译时期就已经确定,是已存在的.class文件中的一部分数据。
也就是说,在程序运行还没有动态输入数据时,就已经存在了,这样大大提高了程序运算的效率。

说说以上几题的原因和Integer 
首先 == 两边如果是对象,比较的是两个对象的引用即地址,而不是其值。 i4 跟 i5 是两个不同的对象 所以输出false
i1跟i2相等,是因为 Integer中有一块代码块作常量池用,存放-128~127间的常量值, 所以在这之间的每个数不会另外开辟一个地址,也就是说i1和i2是同一个对象,所以 输出 true
第二个 i1==i2+i3 为什么返回的是 true,那是因为java有拆箱的特性,i1,i2,i3本来都是对象,但是在运算中都先自动转换成int类型再进行比较,这时候 ==两边 比较的是运算值,所以相等 ,第四个 也是一样道理。

那么思考 如果是 Integer i1 = 128;   Integer i2 = 128;System.out.println(i1==i2) 会是什么结果呢?
没错,程序输出  false , 因为 128不在Integer的常量池中了。

再来简单说说String的常量池
String s1 = "hello";
String s2 = "hello"
String s3 = new String("hello");
System.out.println( s1 ==s2);
System.out.println( s1 ==s3);   会是什么结果 ? 
答案 : 
true
false
用new String()创建的字符串是一个对象不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。 
OK再来一个 

String s4 = "he"+new String("llo");
System.out.println( s1 == s4);   

结果 ?
答案是  false , 所以只要是在String中new了一下便是一个新的对象了,两个对象不相等,结果一定是false。























郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。