1.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")有什麼不同?
String a = "abc"
當運算式執行的時候,會首先去記憶體中的字串池中去找,看有沒有ABC這個字串,如果沒有的畫,就在字串池中建立一個,等String b = "abc"時,則a,b其實是指向了同一片記憶體位址空間,
而String a = new String("abc")則不會去字串池中尋找,是直接建立一個"abc",所以String b = new String("abc")時,它會再建立一個,所以這時a,b指向的是不同的記憶體空間。
String在堆裡的存在形式遵循copy on write原則,
String a ="abc"
String b ="abc"
當在聲明 a = "abc"時,會在堆中分配一塊記憶體給"abc",比如把引用地址記為:0Xff09,
而當在聲明b = "abc"時,JVM發現"abc"在堆中已經存在了,所以就會直接把引用地址0Xff09付值給b,所以a==b,
當用new String("")時,記憶體中的引用地址都是建立的 ,所以不同
請高人告知以下三段代碼的輸出是什嗎?為什嗎?(關健是告之為什麼)
第一段代碼:
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();
}
}
第一段代碼:和第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 所以是兩個值相等的新字串