Java内存机制
Case#
Integer int1 = 30; Integer int2 = 30; Integer int3 = 0; System.out.println(int1 == int2);// true System.out.println(int1 == int2 + int3);// true
>>用Integer int1 = 30;这种方式声明一个Integer对象时会先在对象池中找有没有值为30的对象,如果有直接拿来用,如果没有则重新创建一个对象放入对象池中。java中“==”是比较值,int1和int2引用的同一个对象,内存地址相同,所以int1==int2结果为true。
>>至于int1==int2+int3,因为涉及到运算,所以都是取的各个Integer对象的intValue,也就是比较的30==30+0,所以为true。
Case#
Integer int4 = new Integer(30); Integer int5 = new Integer(30); Integer int6 = new Integer(0); System.out.println(int4 == int5);// false System.out.println(int4 == int5 + int6);// true
>>而Integer int4 = new Integer(30);这种方式是重新创建一个Integer对象,不会放入对象池中,所以int4和int5是两个不同对象的引用,int4==int5结果为false。
>>至于int4==int5+int6,因为涉及到运算,所以都是取的各个Integer对象的intValue,也就是比较的30==30+0,所以为true。
Case#
Integer int7 = 128; Integer int8 = 128; System.out.println(int7 == int8);// false
>>对象池中对象的值的在[-128,127]之间,超过此范围的不会在对象池中缓存。因此判断int7==int8,结果为false。
Case#
int int1 = 30; Integer int2 = 30; Integer int3 = new Integer(30); System.out.println(int1 == int2);// true System.out.println(int2 == int3);// false System.out.println(int1 == int3);// true>>由于int1为基本类型,所以在比较时int2自动进行了解箱操作,相当于30==30;所以结果为true.
>>由于int2存放在对象池中,而int3则不在对象池中,所以两者的内存地址不相同,结果为false.
>>由于int1为基本类型,所以在比较时int3自动进行了解箱操作,相当于30==30;所以结果为true.
Case#
String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); // true>>通过str1 = "abc"这种方式是先在栈中创建一个对String类的对象引用变量str1,然后查找对象池中有没有存放"abc",如果没有,则将"abc"存放进对象池,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。因此结果是true.
Case#
String str11 = new String("abc"); String str21 = new String("abc"); System.out.println(str11 == str21); // false