如何将堆区数据移动到字符串常量池?如何将堆区数据移动到字符串常量池?
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