關於String pool的理解

2021-09-01 10:28:42 字數 2522 閱讀 6941

字串物件是一種特殊的物件.string類是乙個不可變的類..也就說,string物件一旦建立就不允許修改

string類有乙個對應的string池,也就是 string pool.每乙個內容相同的字串物件都對應於乙個pool裡的物件.

1 看下面一段**.

string s = new string(「abc」);

string s1 = 「abc」;

string s2 = new string(「abc」);

system.out.println(s == s1);

system.out.println(s == s2);

system.out.println(s1 == s2);

請問 前面三條語句分別建立了幾個物件,分別是什麼.後面的輸出分別是什麼

(1)string s = new string(「abc」); 這句,建立了兩個物件..其內容都是」abc」.注意,s不是物件,只是引用.只有new生成的才是物件.

建立的流程是,首先括號裡的」abc」先到string pool裡看有沒」abc」這個物件,沒有則在pool裡建立這個物件..所以這裡就在pool建立了乙個」abc」物件.然後 通過new語句又建立了乙個」abc」物件..而這個物件是放在記憶體的堆裡. .這裡的s指向堆裡的物件.

(2) string s1 = 「abc」; 這條語句,s1當然還是引用.沒啥可說的.後面的」abc」.其實就是上面括號裡的」abc」.執行的是相同的操作.即 在pool裡查詢有沒」abc」這個物件.沒有則建立乙個…很顯然,第一條語句在pool裡已經建立了乙個」abc」.所以這條語句沒有建立物件,s1指向的是pool中的」abc」

(3)string s2 = new string(「abc」); 這條語句,其實和第一條是一樣的,但是,因為第一條已經在pool中建立了」abc」這個物件,所以,這條語句建立了乙個物件.s2指向的是堆裡的」abc」.注意,雖然內容都是」abc」,s與s2表示的是不同的物件

(4)接下來就很好說了.下面的三個==判斷.(注意,==永遠是判斷記憶體位址是否相等) s與s1,乙個指向堆裡的物件,乙個指向pool裡的.很明顯是不同的物件.s與s2.上面說了,雖然都是指向堆裡的物件,內容也是」abc」,但是也不是相同的物件.s1與s2.乙個指向pool,乙個指向堆.也不是相同的物件.所以三個都返回false.

2 第二個問題

string s = new string(「abc」);

string s1 = 「abc」;

string s2 = new string(「abc」);

system.out.println(s == s1.intern());

system.out.println(s == s2.intern());

system.out.println(s1 == s2.intern());

求最後輸出是什麼

解答.最後的答案是 false false true

intern()方法.按照jdk的幫助文件來說,是返回字串物件的規範化表示形式。通俗一點說,就是返回對應這個字串內容的那個pool裡的物件.這樣說也許還看不太明白,那可以拿具體例子來說

s1.intern().他的執行流程是,在pool裡去查詢s1對應的內容(也就是」abc」).如果找到,則返回pool裡的物件.如果沒有(老實說,我沒想到有哪種情況是沒有的),則在pool建立這個物件,並返回…

這樣就很容易理解了.s1.intern返回的是pool裡的」abc」物件.與s這個堆裡的物件肯定不同,返回false.同理,s與s2.intern()也肯定不同,返回false.第三個,s1與s2.intern().其中s2.intern()返回的是pool中的」abc」物件,而s1也是指向pool中的」abc」物件.所以返回的是true:

3第三個問題

string hello = 「hello」;

string hel = 「hel」;

string lo = 「lo」;

system.out.println(hello == 「hel」 + 「lo」);

system.out.println(hello == 「hel」 + lo);

求輸出的結果

解答 true false

首先,上面已經說明了,hello hel lo這三個都是指向pool中的物件..

現在我們考慮」hel」 + 「lo」 按照內容來說,兩個相加也就是」hello」.這個時候,這個會返回pool中的」hello」物件.所以,hello == 「hel」 + 「lo」 返回的是true .

而」hel」 + lo 雖然內容也是」hello」,但是它將在堆裡面生成乙個」hello」物件,並返回這個物件…所以這裡的結果是false

總結一下就是,如果加號兩邊的是字面值(字面值就是直接在」"裡寫的值,比如上面的」hel」與」lo」),那麼將在pool裡查詢有沒對應內容的物件(這裡的內容就是」hello」),並返回pool裡的物件.這和hello是一樣的….

如果加號兩邊不滿足上面的條件(比如,兩邊的值是引用值或者堆裡的字串物件).那麼將不會再pool裡查詢」hello」,而是直接在堆裡生成乙個新的物件…

關於this的理解

this是乙個關鍵字,它不允許更改或者賦值,任何函式只要作為方法呼叫時實際上都會傳入乙個隱式的實參 這個實參是乙個物件,方法呼叫的母體就是這個物件 this 1.當函式作為乙個方法呼叫時 呼叫的母體就是該物件 2.當作普通函式呼叫時 呼叫的母體是window 3.閉包裡面的this var obj ...

關於getchar的理解

最近在看k r的c語言程式設計,看到有個地方很不是理解,查閱了較多的資料後才恍然大悟,記錄一下先。程式是比較常見的從控制台獲得一行,並返回這行的長度。程式如下 int getline char s,int lim 開始對getchar這個函式不是很理解,為什麼每次迴圈都讀取乙個 char 既然我是個...

關於委託的理解

學習c 有一段時間了,對委託一直不是很理解,試著說一下。委託是對方法的傳遞呼叫,即把方法像引數一樣傳遞。我們知道,方法具有引數。這個引數可以是基本資料型別,如int,double等,也可以是引用型別 即類 包括系統自帶的和自定義的。例如,我們有個方法add,它的引數是兩個int型別整數。int ad...