Java中的字符串比较和字符串池化

7

在什么情况下应该将 String 作为对象进行比较,而在什么情况下应该使用它们的 equals 方法?为了确保安全,我总是使用 equals,但这似乎不太高效。在什么情况下可以确定 string1 == string2 是安全使用的?


3
String.equals()是高效的。首先检查的是string1 == string2。实际上,Object.equals()会检查这一点。 - Skip Head
当然!我真是太“愚蠢”了。这是一个非常明显的事情要做。正如你所说,它非常有效率。我从来没有想过。真是“丢人”!谢谢! - Albus Dumbledore
3个回答

16

你几乎应该总是使用equals方法。如果:

  • 你已经通过其他方式确保了有不同的值(例如,你正在使用从集合中获取的字符串值,但是出于某些其他原因进行比较)
  • 你知道正在处理编译时字符串常量
  • 你已经手动将字符串进行了内部化

在我的经验中,这种情况并不经常发生。


1
绝对正确的答案。使用“==”而不是equals()是一种过早优化的典型例子。 - DJClayworth
而 String.intern() 在大多数情况下速度太慢,对性能来说几乎没有用处。 - Darron

1
根据我对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

2
第一个比较不会是假的,因为它们不是单独的对象。在Java中,字符串字面量是内部化的。 - sepp2k
在这种情况下,第一个比较应该返回false - String string1 = new("Bob"); String string2 = new("Bob"); - stratwine
我会编辑我的回应,使其更加明确。我之前就想到在Java中可能会遇到这个问题。 - Anthony
1
@stratwine:不,这是不正确的。请参见http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5:每个字符串字面值都是对String类(§4.3.3)的实例(§4.3.1、§12.5)的引用(§4.3)。字符串对象具有恒定的值。字符串字面量或更一般地说,是常量表达式(§15.28)的值,被“interned”以共享唯一实例,使用方法String.intern。 - Dirk
1
答案是正确的,并且第一个比较结果为“false”。"new String(...)"创建了一个新的字符串,这个字符串对象与用 interned 方法创建的“Bob”不是同一个对象。 - DJClayworth
显示剩余2条评论

0
只有在确定对象相同的情况下,才能使用==进行比较。
例如,如果您有一个final static String变量,则可以确保比较是在相同的对象之间进行的。
对于字符串比较,请坚持使用equals

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接