a bit of java (from forum)

來源:互聯網
上載者:User

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 所以是兩個值相等的新字串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.