Java内存机制

 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
>>通过str11 = new String("abc")是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 因此结果是false.
Case#
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1 == str2);// false
System.out.println(str1.equals(str2));// true
>>Java中"=="是比较值,因为str1引用的是对象池的对象,而str2则不是对象池中的对象,所以两者内存值不同.结果为false.
>>equals比较的是所引用对象 堆中 的值是否相同.这里都是"abc",所以结果是true.

Case#

String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
String s5 = s3 + "";
System.out.println(s3 == s5);// false
System.out.println(s3.equals(s5));// true
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
>>当字符串进行"+"操作时会生成一个新的字符串,无论是空字符串与否,相当于s4 = new String(s1 + s2);由于"=="是比较两者栈中值是否相同,而这里s3引用的是对象池中的对象,而s4是新建的对象,并不在对象池中, 所以结果为false.

>>equals比较的是所引用对象堆中的值是否相同.这里都是"java",所以结果是true.

Case#

你可能感兴趣的:(java内存)