2013-07-17 72 views
0

我對字符串池實際包含的內容有點困惑。字符串作爲池中的對象還是作爲參考?

當我們說String s = "abc",這是否意味着在編譯期間,字符串對象被放入字符串池中,還是被放入的引用?

+0

字符串對象 –

+0

轉到救援人員到場鏈接 [http://stackoverflow.com/questions/3801343/what-is-string-pool-in-java][1] [1 ]:http://stackoverflow.com/questions/3801343/what-is-string-pool-in-java –

回答

1

每次創建一個字符串這種方式時,JVM檢查該對象是否是字符串常量池。如果是這樣,將返回參考到「池」實例。如果不是這樣,一個新的實例初始化並放在池:

  ----------- String s = "Hello"; 
      | 
      ٧ 
+-------------------+ 
|  "Hello"  | 
+-------------------+ 
     pool 
0

你所談論的游泳池是在堆和所有存在的引用都存在堆棧(未堆)。創建字符串時String s = "abc";將字符串字符串「abc」放置在字符串池中,除了使用new創建String對象的情況外,所有其他引用都將指向該字面值(在此情況下單獨的內存空間將分配在堆上)。

0

字符串池指的是內存中定義字符串的位置。字符串池具有對要重用的常量的引用。字符串池是什麼讓這種情況發生:

String a = "a" + "b"; 
String b = "ab"; 
if(a == b) { 
System.out.println("this will print"); 
} 

一個== B就評估爲真,因爲編譯器看到這兩個字符串和串B爲等於「AB」所以這個字符串存儲在字符串池和字符串a和字符串b指向這一個引用。

1

字符串池只是字符串文字的緩存。每當我們將字符串文字分配給字符串引用時,文字將在字符串池中搜索並將其分配給引用變量。 在String s="abc"中,JVM將在字符串池中搜索文字​​,並將它分配給引用變量s的引用。

​​
0

「abc」在編譯時定義在這裏,因此會自動實現。此字符串對象將因此轉到字符串實習生池。如果在那裏已經存在,那麼它的引用將被返回。字符串intern池是Java 7以來的主要Java堆的一部分(我們知道堆將包含對象)。