【问题标题】:String comparison and String interning in JavaJava中的字符串比较和字符串实习
【发布时间】:2011-04-22 14:15:48
【问题描述】:

什么时候应该将Strings 比较为对象,什么时候应该使用他们的equals 方法?为了确保,我总是使用equals,但这似乎不是很有效。在什么情况下可以确定string1 == string2 可以安全使用?

谢谢!

【问题讨论】:

  • String.equals() 是有效的。首先检查的是 string1 == string2。 (实际上 Object.equals() 会检查这一点。)
  • 当然!我多么愚蠢。这是一件非常明显的事情。正如你所说的高效。从来没想过。 真丢脸!谢谢!

标签: java string equals string-comparison string-interning


【解决方案1】:

您几乎应该始终使用equals。您可以确定string1 == string2 在以下情况下会起作用:

  • 您已经确保以其他方式获得不同的值(例如,您使用从集合中提取的字符串值,但出于其他原因比较它们)
  • 您知道您正在处理编译时字符串常量
  • 您自己手动插入了字符串

根据我的经验,这种情况确实不会经常发生。

【讨论】:

  • 绝对正确的答案。使用 '==' 因为 equals() 效率低下是过早优化的一个很好的例子。
  • 而且 String.intern() 足够慢,在大多数情况下对性能毫无用处。
【解决方案2】:

根据我对 Java 的了解,string1==string2 仅在对这些对象的引用相同时才会成立。看看下面的案例

String string1 = new String("Bob");
String string2 = new String("Bob");

string1 == string2; // false, they are seperate objects
string1 = string2;  // asigning string1 to string2 object
string1 == string2; // true, they both refer to the same object

【讨论】:

  • 第一次比较将为假,因为它们不是单独的对象。字符串文字是在 Java 中实习的。
  • 在这种情况下,第一次比较应该返回 false - String string1 = new("Bob"); String string2 = new("Bob");
  • 我将编辑我的回复以使其更清晰地定义。我想我可能会在 Java 中遇到这个问题。
  • @stratwine:不,这不是真的。请参阅java.sun.com/docs/books/jls/third_edition/html/…:每个字符串文字都是对 String 类(第 4.3.3 节)实例(第 4.3.1 节、第 12.5 节)的引用(第 4.3 节)。字符串对象有一个常量值。字符串字面量——或者更一般地说,作为常量表达式值的字符串(第 15.28 节)——是“内部”的,以便使用 String.intern 方法共享唯一实例。
  • 答案是正确的,第一次比较是'假'。 "new String(...)" 创建(惊喜)一个新的 String,它与被实习的 "Bob" 不是同一个对象。
【解决方案3】:

如果您确定对象相同,则只能使用== 进行比较。

例如,如果您有一个最终的静态字符串变量,则可能会发生这种情况。您可以肯定会在同一个对象之间进行比较。

坚持使用equals 进行字符串比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多