首先,我們來看一段程式
你們認為輸出結果是什麼呢?
javac 編譯的結果是:true , false , false;
我想很多人看到這要糊塗了,建立的字元串都是“aaa",為什麼比較結果如此迥異呢?嘿嘿,下面是我的一些見解。
這裡要引人字元串池(StringPool)和堆(heap)的概念。
1、對于第一種情況,首先查找StringPool中是否存在“aaa"對象
如果不存在,則在StringPool中建立一個 “aaa"對象, 然後将StringPool中的這個"aaa"對象的位址傳回來,賦給引用變量s,這樣s會指向 StringPool中的這個"aaa"字元串對象;
如果存在,則不建立任何對象,直接将StringPool中這個“aaa"對象位址傳回來,賦給s引用。因為s1、s2指向同一個對象”aaa",是以結果為true.
2、對于第二種情況,首先在StringPool中查找是否有這個對象
如果有,則不在StringPool建立"aaa"對象,直接在堆中(heap)建立"aaa"對象,将"aaa"對象位址傳回 賦給s的引用,導緻s指向了堆中建立的這個"aaa"對象;
如果沒有,則首先在StringPool中建立一個"aaa"對象,然後再在堆中建立一個"aaa"對象,然後将堆中這個”aaa"對象的位址傳回賦給s引用,導緻s指向了堆中所建立的這個 “aaa”。因為s3、s4指向堆中兩個不同的對象,是以結果為false.
3、 對于第三種情況,s5指向字元串池中的對象,s6指向堆中的對象,是以結果為false.