簡體   English   中英

字符串池與常量池

[英]String pool vs Constant pool

讓我們看看下面的代碼片段:

  String s1 = "Hello";
  String s2 = "Hello"; 

由於實習,兩個變量都引用相同的 object。 由於字符串是不可變的,因此只創建了一個 object,並且都引用了同一個 object。

constant pool也是一個東西,里面存放着一個class中聲明的所有常量(整數、字符串等)。它是特定於每個class的。

 System.out.println("Hello");  // I believe this Hello is different from above.

問題:

  1. string pool是指常量池中一個常量字符串object的池嗎?
  2. 如果是,字符串池是在整個應用程序中通用還是特定於 class?

我的問題是,

  1. 字符串池是指常量池中的常量字符串對象池嗎?

不。

“常量池”是指類文件中特殊格式的字節集合,它對 Java 類加載器有意義。 其中的“字符串”是序列化的,它們不是 Java 對象。 還有很多種常量,不僅僅是字符串。

第 4.4 章常量池表

Java 虛擬機指令不依賴於類、接口、類實例或數組的運行時布局。 相反,指令引用constant_pool表中的符號信息。

相比之下,“字符串池”是在運行時使用的(不僅僅是在類加載時),只包含字符串,字符串池中的“字符串”是java對象。 “字符串池”是從java.lang.String實例到用於實習字符串的java.lang.String實例的線程安全弱映射。

第 3.10.5 章。 字符串文字

字符串文字是對String類實例的引用(第 4.3.1 節,第 4.3.3 節)。

此外,字符串字面量始終引用類String同一個實例。 這是因為字符串文字 - 或者更一般地說,作為常量表達式(第 15.28 節)的值的字符串 - 使用方法String.intern被“嵌入”以便共享唯一實例。

只有一個字符串池,所有字符串字面量都會被自動插入。
此外,還有其他用於自動裝箱等的池。

常量池是為類放置這些文字的地方。

constans_pool(all constans, including Strings) 是class文件中的一個數據結構(out of JVM)。 當 class 文件加載到 JVM 時,然后 constans_pool -> run-time constans_pool(General),在 hotspot & SE8:

  1. constans_pool中的字符串會存儲在Heap中,我們稱之為string-pool; https://openjdk.org/jeps/122 https://wiki.openjdk.org/display/HotSpot/Caching+Java+Heap+Objects
  2. constans_pool中的其他數據將存儲在native-memory(Metaspace)中,我們稱之為run-time constans_pool(Special)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM