【问题标题】:Should we use String.intern in jdk 7 and +我们应该在 jdk 7 和 + 中使用 String.intern
【发布时间】:2015-03-24 11:34:20
【问题描述】:

我不认为我应该在 jdk7 和 + 中使用 String.intern() ,因为以下原因。
Java 自动实习生字符串文字。这意味着在许多情况下,== 运算符对字符串的工作方式与它对整数或其他原始值的工作方式相同。
由于 String 文字的实习是自动的,因此 intern() 方法将用于使用 new String() 构造的字符串

String s1 = "Rakesh";

String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh"); // why would i do this?
String s5 = new String("Rakesh").intern(); // looks stupid , better create like s1

s1,s2, s3 ,s4 指向同一个东西。

你的cmets请

【问题讨论】:

  • s1,s2, s3 ,s4 指向同一个东西。 不,它没有。Do System.out.println(s3 == s5);和 System.out.println(s2 == s4); .更好地理解 String 将帮助你理解所有对象之间的区别。
  • 使用 intern() 的理由很少。在 18 年的 Java 编程中,我从未遇到过它有用的情况。我确实看到它使用过一次,但使用不当,影响性能。
  • @ms ,它是 s1,s2,s3 和 s5 。不是 s4
  • 为什么我的问题被否决了?这个问题通过示例非常清楚,而且它是一个有用的问题

标签: java string


【解决方案1】:
String s3 = "Rakesh".intern();

这什么都不做 - 表示字符串字面量的 String 对象已经在字符串池中,所以 intern() 在这里什么都不做,只是返回已经在池中的字符串。同String s3 = "Rakesh";

String s4 = new String("Rakesh"); // why would i do this?

没有理由通过将字符串文字传递给构造函数来以这种方式创建String 对象。 String 对象是不可变的,永远不需要以这种方式显式创建字符串文字的副本。

String s5 = new String("Rakesh").intern(); // looks stupid , better create like s1

您已经在评论中自己回答了这个问题。

我的建议:忘记 intern() 方法 - 或将其留在脑海深处的某个地方。在您将要编写的 99.9% 的 Java 程序中,您不需要此方法。此方法仅适用于非常特殊的极少数情况。

【讨论】:

    【解决方案2】:

    请阅读Java 文档。

    当调用intern方法时,如果池中已经包含一个 字符串等于此 String 对象,由下式确定 equals(Object) 方法,则池中的字符串为 回来。否则,此 String 对象将添加到 池并返回对此 String 对象的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多