天天看點

JAVA學習筆記(5)_____String對象比較的一些個人見解

首先,我們來看一段程式

你們認為輸出結果是什麼呢?

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.