2016-09-30 60 views
-5

如何将堆区数据移动到字符串常量池?如何将堆区数据移动到字符串常量池?

 String s3 = new String("Test"); 
     final String s4 = s3.intern(); 
     System.out.println(s3 == s4);//fasle(i need true) 

我不希望创建新的对象,因此刚刚从堆削减对象并将其粘贴在字符串常量池的

+0

'System.out.println(s3.equals(s4))'。换句话说,不要比较参考,比较数据。我没有发现需要比较'String'引用(除了'null'),如果你认为你需要它,你可能设计错了你的程序。为了回答你的问题,'s3.intern()'创建一个新的对象,因此引用将不会相等。 – ajb

+0

我不想创建新对象,所以只需从堆中剪下对象并将其粘贴到字符串常量池中即可。 –

+0

几乎Java中的所有东西都是一个对象。 Java不是微软的Word,你不能在不创建新对象的情况下“剪切和粘贴”数据。你真的需要回头研究Java的基础知识。 – ajb

回答

0

你是不是堆的数据移动到字符串常量池,当你调用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常量池中获取相同的对象。

+0

我想将堆区数据移动(剪切)到字符串常量池?但是当我使用实习生时只是复制对象.. –

+0

我不想创建新对象,所以只需从堆中剪下对象并将其粘贴到字符串常量池中 –

+0

@ShivarajMc - 好吧,一旦GC运行,堆中的字符串'Test'就会符合GC的条件。因此,你间接地做了一些剪切粘贴相同的对象有一些延迟 – TheLostMind

相关问题