2017-02-02 70 views
1
public static void main(String[] args) { 
     String[] arr = new String[5]; 
     for (int i = 0; i < arr.length; i++) { 
      arr[i] = "aaa" + i; 
     } 

    System.out.println(arr[0] == "aaa0"); // false 
    String s = "aaa0"; 
    System.out.println(s == arr[0]); // false 
    } 

我有一個關於該主題的幾個問題可以幫助我瞭解字符串游泳池和的String []

  1. 什麼是事實,從字符串字符串數組不會自動去刺背後登錄池,不像字符串文字?

  2. 我是否正確理解只有字符串文字會隱式轉到字符串池?

  3. 我是否正確理解從公共靜態無效的主要該字符串數組(公共靜態無效的主要(字串[] args))沒有去字符串池中呢?

+2

這不是因爲它在一個數組中。這是因爲你正在動態地創建這些'String'('arr [i] =「aaa」+ i')。 – resueman

+2

@mstorkson雖然他正在談論字符串池,所以這是必要的,以顯示他的想法。 – Zircon

+1

@mstorkson在我的情況下,通過==比較來顯示字符串池操作;通過equals(),一切都將是「真正的」 - 字符串池中的字符串和外部字符串。 –

回答

3

編譯器轉換爲循環下的封面!

生成的字節碼將爲每個循環迭代使用一個新的StringBuilder ...產生「新」創建的字符串對象!

含義;在「現實中,你的循環看起來‘更’像:

for (int i = 0; i < arr.length; i++) { 
    StringBuilder builder = new StringBuilder("aaa"); 
    builder.append(i); 
    arr[i] = builder.toString(); 
} 

(見here的理論背景)

這就是原因,使用==比較字符串有這樣一個名聲不好的。因爲它往往會導致意想不到的結果。

而關於你的評論:點不是你正在使用的數組(其中:你應該不是被寫入數組傳遞給主 - 你可以,但這是不好的做法)

+0

Thx爲您的關注!那麼public static void main(String [] args)呢? args字符串arr具有相同的邏輯?或者對於我的問題,編譯器是一些例外情況? –

+0

非常歡迎。我做了一些更新,如果你喜歡我的回答,請考慮在某些時候接受;-) – GhostCat

2

您可以調用intern()方法強制進行字符串池化,即僅存儲每個不同字符串值的一個副本。 檢查了這一點:

public static void main(String[] args) { 
    String[] arr = new String[5]; 
    for (int i = 0; i < arr.length; i++) { 
     arr[i] = ("aaa" + i).intern(); 
    } 

    System.out.println(arr[0] == "aaa0"); 
    String s = "aaa0"; 
    System.out.println(s == arr[0]); 
} 
0

使用equals()如果你想比較內容兩個對象的。這裏有更多的解釋

的「==」操作符的

在Java中,當「==」操作符用於比較兩個對象,它 檢查是否對象指記憶中的同一個地方。在 換句話說,它檢查2個對象名是否基本上是 對同一內存位置的引用。

的equals()方法

Equals方法在對象類,從該每 類或者是直接或間接的後代來定義。默認情況下, equals()方法實際上與「==」運算符相同 - 這意味着它會檢查兩個對象是否引用內存中的相同位置。但是,equals方法實際上是爲了比較兩個對象的內容,而不是它們在內存中的位置。

System.out.println(arr[0].equals("aaa0")); // It give you True 
System.out.println(s == arr[0]); // It give you false