Java中的內存可以分為堆(heap)、棧(stack)、方法區(method area)、程序計數器(program counter register)等幾個部分。其中方法區和永久域指的是同一個區域,Java虛擬機(JVM)用這個區域來存儲被加載的類的信息、常量、靜態變量、編譯器即時編譯的代碼等等。
public class Example{ public static void main(String[] args){ String str1 = "hello"; String str2 = "world"; } }
上面這段代碼中的str1和str2都是在堆(heap)中分配的內存空間,它們分別存儲了"hello"和"world"這兩個字符串常量的地址。而當我們在方法區中字符串常量池中創建一個新的字符串常量時。
String str3 = "hello world";
此時,Java虛擬機會先去字符串常量池中搜索是否有相同值的字符串常量,如果有則直接返回舊的引用,否則將新的字符串常量添加到字符串常量池中。
總的來說,Java中的永久域和方法區是相同的一個區域,它用來存儲類的信息、常量、靜態變量、即時編譯的代碼等等。而字符串常量池則是方法區中的一個特殊部分,用來存儲字符串常量。