日期:2014-05-20  浏览次数:20622 次

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?

"=="之间的比较是否是比较两个基本类型变量的值,如果是引用类型,是否比较的是栈内存中的地址是否一致?
------解决方案--------------------
它俩指向的是同一个常量地址
------解决方案--------------------
引用:
Quote: 引用:

它俩指向的是同一个常量地址

我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb”
                                 String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
                                 String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”

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》吧,被字符串问题折磨得死去活来的。