[英]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.
問題:
string pool
是指常量池中一個常量字符串object的池嗎?我的問題是,
- 字符串池是指常量池中的常量字符串對象池嗎?
不。
“常量池”是指類文件中特殊格式的字節集合,它對 Java 類加載器有意義。 其中的“字符串”是序列化的,它們不是 Java 對象。 還有很多種常量,不僅僅是字符串。
Java 虛擬機指令不依賴於類、接口、類實例或數組的運行時布局。 相反,指令引用
constant_pool
表中的符號信息。
相比之下,“字符串池”是在運行時使用的(不僅僅是在類加載時),只包含字符串,字符串池中的“字符串”是java對象。 “字符串池”是從java.lang.String
實例到用於實習字符串的java.lang.String
實例的線程安全弱映射。
字符串文字是對
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:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.