我们什么时候应该在 String 文字上使用 String 的 intern 方法

新手上路,请多包涵

根据 String#intern()intern 如果在字符串池中找到字符串,方法应该从字符串池中返回字符串,否则将在字符串池中添加一个新的字符串对象,并引用返回此字符串。

所以我试过这个:

 String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

我期待 s1 and s3 are same 将在 s3 被实习时打印,而 s1 and s2 are same 将不会打印。但结果是:两行都被打印出来了。所以这意味着,默认情况下,字符串常量是 intern 的。但如果是这样,那我们为什么需要 intern 方法呢?换句话说,我们什么时候应该使用这个方法?

原文由 Rakesh Juyal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 396
2 个回答

Java 自动实习字符串文字。这意味着在许多情况下,== 运算符对字符串的处理方式与对整数或其他原始值的处理方式相同。

由于字符串文字的实习是自动的, intern() 方法将用于构造的字符串 new String()

使用你的例子:

 String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh");
String s5 = new String("Rakesh").intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}

if ( s1 == s4 ){
    System.out.println("s1 and s4 are same" );  // 3.
}

if ( s1 == s5 ){
    System.out.println("s1 and s5 are same" );  // 4.
}

将返回:

 s1 and s2 are same
s1 and s3 are same
s1 and s5 are same

在除 s4 变量之外的所有情况下,其值是使用 new 运算符显式创建的,其中 intern 未使用其结果的方法返回 JVM 的字符串常量池 的单个不可变实例。

有关详细信息,请参阅 Java 技术“字符串相等性和实习”

原文由 Filipe Miguel Fonseca 发布,翻译遵循 CC BY-SA 4.0 许可协议

在最近的一个项目中,一些巨大的数据结构是用从数据库中读取的数据(因此不是字符串常量/文字)建立的,但有大量的重复。这是一个银行应用程序,到处都出现了像一些中等规模(可能是 100 或 200 家)公司的名称之类的东西。数据结构已经很大,如果所有这些公司名称都是唯一的对象,它们就会溢出内存。相反,所有数据结构都引用了相同的 100 或 200 个 String 对象,从而节省了大量空间。

interned 字符串的另一个小优点是 == 可以用来(成功!)比较字符串,前提是所有涉及的字符串都保证被 intern。除了更精简的语法之外,这也是一种性能增强。 正如其他人所指出的那样,这样做会带来引入编程错误的巨大风险,因此这只能作为万不得已的最后手段。

缺点是驻留字符串比简单地将它扔到堆上需要更多时间,而且驻留字符串的空间可能有限,具体取决于 Java 实现。当您处理已知合理数量且重复很多的字符串时,最好这样做。

原文由 Carl Smotricz 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题