產生雙引號,我嘗試執行下面的代碼行生成。我的理解是#1和#2都應該在字符串池中生成字符串,因此在執行過程中不應該有任何區別,但是當我分析堆轉儲時,如果在字符串池中生成intern()字符串(可以通過有限數量的字符串對象來解釋),但是在堆上生成#1字符串的情況下(因爲堆轉儲中存在大量字符串對象),並且系統比以前的情況快。有人可以解釋爲什麼它是這樣嗎?我正在使用Java 6來執行下面的代碼行。萬一字符串中使用沒有得到的字符串池
import java.util.LinkedList;
public class LotsOfStrings {
private static final LinkedList<String> LOTS_OF_STRINGS = new LinkedList<String>();
public static void main(String[] args) throws Exception {
int iteration = 0;
while (true) {
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 1000; j++) {
String s= "String " + j;
LOTS_OF_STRINGS.add(s); // #1
//LOTS_OF_STRINGS.add(new String("String " + j).intern()); //#2
}
}
iteration++;
System.out.println("Survived Iteration: " + iteration);
Thread.sleep(100);
}
}
堆轉儲對象的截圖,如果在的情況下,實習生 intern
堆轉儲對象截圖#1
字符串僅當它的可用池接到一個字符串池參考否則其創造堆的字符串。 – Nir
在內環它應產生的第一執行1000唯一字符串字符串0 .... ....到字符串999。在此之後,應在內部循環的所有後續執行作爲第一字符串執行期間創建的不是程序使用的參考參考應該在字符串池中可用? – Vyas