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

String 的疑惑。String a = "abc" 和String a = new String("abc")不同?
测试代码如下:
String   a   =   "abc ";
String   b   =   "abc ";
System.out.println(a   ==   b);
输出:true
==========================
String   a   =   new   String( "ade ");
String   b   =   new   String( "ade ");
System.out.println(a   ==   b);
输出:false

请问:String   a   =   "abc "   和String   a   =   new   String( "abc ")有什么不同?

*****************************************************************
另外:请高人告知以下三段代码的输出是什么?为什么?(关健是告之为什么)
第一段代码:
HashMap   map   =   new   HashMap();
String   a   =   "ade ";
String   b   =   "ade ";
map.put(a,   new   Boolean(true));
map.put(b,   new   Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());

第二段代码:
HashMap   map   =   new   HashMap();
String   a   =   new   String( "ade ");
String   b   =   new   String( "ade ");
map.put(a,   new   Boolean(true));
map.put(b,   new   Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());

第三段代码:
HashMap   map   =   new   HashMap();
MyString   a   =   new   MyString( "ade ");
MyString   b   =   new   MyString( "ade ");
map.put(a,   new   Boolean(true));
map.put(b,   new   Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());

其中MyString定义如下:
public   class   MyString   {
String   str;
public   MyString(String   str){
this.str   =   str;
}
@Override
public   int   hashCode()   {
return   str.hashCode();
}

}


谢谢!


------解决方案--------------------
String a = "abc " 和String a = new String( "abc "),前者和后者的堆的地址不同,故尔不一样的,如果是它们的内容是一样的
------解决方案--------------------
String a = "abc "
当表达式执行的时候,会首先去内存中的字符串池中去找,看有没有ABC这个字符串,如果没有的画,就在字符串池中创建一个,等String b = "abc "时,则a,b其实是指向了同一片内存地址空间,
而String a = new String( "abc ")则不会去字符串池中查找,是直接创建一个 "abc ",所以String b = new String( "abc ")时,它会再创建一个,所以这时a,b指向的是不同的内存空间
------解决方案--------------------
第一段代码:和第2段代码,一样,都是输出false.

因为a.equals(b).
hashmap 的key 比的是equals 而不是==

第三段代码,是true false.

同理 这里里面a.equals(b)=false.


____________________________

String a = "abc ";
String b = "abc ";
System.out.println(a == b);
输出:true
==========================
String a = new String( "ade ");
String b = new String( "ade ");
System.out.println(a == b);


前面的,a跟b指向同一个字符串
后面的,因为用了new 所以是两个值相等的新字符串
------解决方案--------------------
String在堆里的存在形式遵循copy on write原则,
String a = "abc "
String b = "abc "

当在声明 a = "abc "时,会在堆中分配一块内存给 "abc ",比如把引用地址记为:0Xff09,