嗯,我有這樣的代碼字符串文字池
String s = "hello";
String s2 = s + "world";
我知道變量小號存儲在Java堆在字符串文字池。另外我知道變量s2存儲在Java堆中(因爲在本例中'+'創建了一個新對象)。但是我的問題是:將「世界」放入池中還是什麼都不會發生?
嗯,我有這樣的代碼字符串文字池
String s = "hello";
String s2 = s + "world";
我知道變量小號存儲在Java堆在字符串文字池。另外我知道變量s2存儲在Java堆中(因爲在本例中'+'創建了一個新對象)。但是我的問題是:將「世界」放入池中還是什麼都不會發生?
是的。無論何時/無論何時,您都聲明瞭一個字符串字面值,無論其使用情況如何,它顯然都會顯示在該字段中。
由於池中不存在String
「世界」,所以新的String
對象實例化,然後將其放置在池中。
當我們使用雙引號來創建一個String
,首先查找String
與在String
池相同的值,如果發現它只是返回參考否則它會在池的新String
,然後返回參考。
基本上,'s'和's2'只是參考,而真實的物體是「你好」和「世界」。這遵循以下概念:指定字符串是不可變的,而字符串引用不是。所以,是的,因爲「世界」是String對象,除了是一個String文字外,它將被存儲在類似於hello的堆中。還要記住's'和's2'都不會成爲可變字符串引用的堆。
是的,您是對的。 '''作爲PerGen中的變量,'s2'作爲Stack中的變量。 我的意思是,有值分別存儲在池中,只是在堆中。 –
謝謝。但是你可以附加鏈接,我可以在這裏閱讀?) –
@ТимМаркусенко「因爲在運行時動態解析對類,字段和方法的符號引用所需的所有信息都是用字符串常量編碼的,所以常量池實際上包含了平均類文件的最大部分,大約爲60%,事實上,這使得常量池成爲代碼處理問題的簡單目標,字節碼指令本身只佔12%。 https://commons.apache.org/proper/commons-bcel/manual.html不知道是否想要了解更多關於常量池中的字節碼和字符串存儲的信息...... –