如何將堆區數據移動到字符串常量池?如何將堆區數據移動到字符串常量池?
String s3 = new String("Test");
final String s4 = s3.intern();
System.out.println(s3 == s4);//fasle(i need true)
我不希望創建新的對象,因此剛剛從堆削減對象並將其粘貼在字符串常量池的
如何將堆區數據移動到字符串常量池?如何將堆區數據移動到字符串常量池?
String s3 = new String("Test");
final String s4 = s3.intern();
System.out.println(s3 == s4);//fasle(i need true)
我不希望創建新的對象,因此剛剛從堆削減對象並將其粘貼在字符串常量池的
你是不是堆的數據移動到字符串常量池,當你調用intern
,你是隻需在常量池中添加另一個新字符串(如果它不存在於常量池中(因爲已添加到常量池-1行中)。
您可能要更改您的代碼:
public static void main(String[] args) {
String s3 = new String("Test");
s3 = s3.intern();
String s4 = "Test";
System.out.println(s3 == s4);//fasle(i need true)
}
在上面的代碼你指定參考S3的實習值再次S3。接下來,您將在S4中從String常量池中獲取相同的對象。
我想將堆區數據移動(剪切)到字符串常量池?但是當我使用實習生時只是複製對象.. –
我不想創建新對象,所以只需從堆中剪下對象並將其粘貼到字符串常量池中 –
@ShivarajMc - 好吧,一旦GC運行,堆中的字符串'Test'就會符合GC的條件。因此,你間接地做了一些剪切粘貼相同的對象有一些延遲 – TheLostMind
'System.out.println(s3.equals(s4))'。換句話說,不要比較參考,比較數據。我沒有發現需要比較'String'引用(除了'null'),如果你認爲你需要它,你可能設計錯了你的程序。爲了回答你的問題,'s3.intern()'創建一個新的對象,因此引用將不會相等。 – ajb
我不想創建新對象,所以只需從堆中剪下對象並將其粘貼到字符串常量池中即可。 –
幾乎Java中的所有東西都是一個對象。 Java不是微軟的Word,你不能在不創建新對象的情況下「剪切和粘貼」數據。你真的需要回頭研究Java的基礎知識。 – ajb