关于网上的一个面试题,求输出结果:
- /**
- *
- * @author DreamSea 2011-11-19
- */
- public class IntegerTest {
- public static void main(String[] args) {
- objPoolTest();
- }
-
- public static void objPoolTest() {
- Integer i1 = 40;
- Integer i2 = 40;
- Integer i3 = 0;
- Integer i4 = new Integer(40);
- Integer i5 = new Integer(40);
- Integer i6 = new Integer(0);
-
- System.out.println("i1=i2\t" + (i1 == i2));
- System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));
- System.out.println("i4=i5\t" + (i4 == i5));
- System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));
-
- System.out.println();
- }
- }
输出的结果
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。