Java创设字符串常量内存分析
Java创建字符串常量内存分析
如下面一段代码打印结果为:true
false
请教大家为何s==s1值为何true?
"=="之间的比较是否是比较两个基本类型变量的值,如果是引用类型,是否比较的是栈内存中的地址是否一致?
------解决方案--------------------
它俩指向的是同一个常量地址
------解决方案--------------------
s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
------解决方案--------------------
当直接String s = "***" 的时候对象中的值是放在常量池中的!!当再次String s1 = "***" 时先看常量池中是否有这个值如果有指向这个值如果没有在创建 String s2 = "****" 的时候是在堆里创建一个新的对象每次都是不同的!!!
------解决方案--------------------
正解!!怒点32个赞
------解决方案--------------------
下面的代码对楼主理解String的存储会有帮助
new出来的对象存在堆中,直接声明的在栈中(具体一点就是在常量池中)
------解决方案--------------------
同一个字符串在常量池中只会有一份,所以,当不同引用指向同一个常量池中的字符串时,他们的地址永远都是一样的。==true
如果是new出来的两个相同的字符串对象,则他们的地址永远不会相同。== false
------解决方案--------------------
楼主看了《think in java》吧,被字符串问题折磨得死去活来的。
如下面一段代码打印结果为:true
false
public static void main(String[] args) {
String s = "acb";
String s1 = "acb";
String s2 = new String("acb");
System.out.println(s == s1);
System.out.println(s == s2);
}
请教大家为何s==s1值为何true?
"=="之间的比较是否是比较两个基本类型变量的值,如果是引用类型,是否比较的是栈内存中的地址是否一致?
------解决方案--------------------
它俩指向的是同一个常量地址
------解决方案--------------------
s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
------解决方案--------------------
当直接String s = "***" 的时候对象中的值是放在常量池中的!!当再次String s1 = "***" 时先看常量池中是否有这个值如果有指向这个值如果没有在创建 String s2 = "****" 的时候是在堆里创建一个新的对象每次都是不同的!!!
------解决方案--------------------
当直接String s = "***" 的时候对象中的值是放在常量池中的!!当再次String s1 = "***" 时先看常量池中是否有这个值如果有指向这个值如果没有在创建 String s2 = "****" 的时候是在堆里创建一个新的对象每次都是不同的!!!
正解!!怒点32个赞
------解决方案--------------------
下面的代码对楼主理解String的存储会有帮助
new出来的对象存在堆中,直接声明的在栈中(具体一点就是在常量池中)
String str1 = "a";//constant pool
String str2 = "b";//constant pool
String str3 = new String("a");//heap
System.out.println(str1 == str3);//false
String str4 = "a"+str2;//heap
String str5 = "a"+"b";//constant pool
String str6 = new String("ab");//heap
String str7 = "ab";//constant pool
System.out.println(str4 == str5);//false
System.out.println(str4.intern() == str5);//true
System.out.println(str4 == str6);//false
System.out.println(str5 == str7);//true
String str8 = str6;//heap
System.out.println(str6 == str8);//true
String str9 = new String("ab");//heap
System.out.println(str6 == str9);//false
------解决方案--------------------
下面的代码对楼主理解String的存储会有帮助
new出来的对象存在堆中,直接声明的在栈中(具体一点就是在常量池中)
String str1 = "a";//constant pool
String str2 = "b";//constant pool
String str3 = new String("a");//heap
System.out.println(str1 == str3);//false
String str4 = "a"+str2;//heap
String str5 = "a"+"b";//constant pool
String str6 = new String("ab");//heap
String str7 = "ab";//constant pool
System.out.println(str4 == str5);//false
System.out.println(str4.intern() == str5);//true
System.out.println(str4 == str6);//false
System.out.println(str5 == str7);//true
String str8 = str6;//heap
System.out.println(str6 == str8);//true
String str9 = new String("ab");//heap
System.out.println(str6 == str9);//false
同一个字符串在常量池中只会有一份,所以,当不同引用指向同一个常量池中的字符串时,他们的地址永远都是一样的。==true
如果是new出来的两个相同的字符串对象,则他们的地址永远不会相同。== false
------解决方案--------------------
楼主看了《think in java》吧,被字符串问题折磨得死去活来的。