".equals"和"=="之间有什么区别?

OVE*_*ONE 65 java equals

我今天换了讲师,他说我用了一个奇怪的代码.(他说最好使用.equals,当我问为什么时,他回答"因为它是!")

所以这是一个例子:

if (o1.equals(o2))
{
 System.out.println("Both integer objects are the same");
}
Run Code Online (Sandbox Code Playgroud)

而不是我习惯的:

if (o1 == o2)
{
  System.out.println("Both integer objects are the same");
}
Run Code Online (Sandbox Code Playgroud)

这两者之间有什么区别.为什么他的方式(使用.equals)更好?

通过快速搜索找到了这个,但我无法理解这个答案:

Jon*_*eet 111

在Java中,==总是只比较两个引用(对于非基元,即) - 即它测试两个操作数是否引用同一个对象.

但是,equals可以覆盖该方法 - 因此两个不同的对象仍然可以相等.

例如:

String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

System.out.println(x == y); // false
System.out.println(x.equals(y)); // true
Run Code Online (Sandbox Code Playgroud)

另外,值得注意的是,任何两个相等的字符串常量(主要是字符串文字,以及通过串联的字符串常量的组合)将最终引用相同的字符串.例如:

String x = "hello";
String y = "he" + "llo";
System.out.println(x == y); // true!
Run Code Online (Sandbox Code Playgroud)

这里xy是同一个字符串的引用,因为y是一个编译时间常数等于"hello".

  • @ingyhere:*对象*不指向任何东西.`==`测试两个*引用*是否引用同一个对象.如果你要抱怨"可怕的措辞",你需要确保使用正确的术语.至于`equals()`是否比较对象状态 - 它*可以*,但它不必,它肯定不会自动.(它可能会考虑*某些*变量是否相等,而不是其他变量.) (7认同)
  • @Nir:是的.在类中,除非您重写Equals,否则它将始终表示引用相等. (3认同)
  • @ingyhere:嗯,我没看到那篇文章是如何相关的.那是在谈论参数传递.被比较的值是*精确*引用.它们不一定是内存位置 - 它们是JVM想要用于引用的任何形式的引用.引用类型变量*的值是*引用.这就是为什么在这种情况下,`==`是*引用相等运算符*.请参阅Java语言规范的15.21.3节:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.21.3.这是非常明确的术语,我正确使用它. (3认同)
  • @ingyhere:"在很多情况下可以想到",是的 - 但不是全部.*那就是挥手.当然可以实现JVM,其中引用值不是*直接存储器位置,而是例如进入大型查找表的条目.你的观点似乎随着时间的推移而改变了,因为指责我错误地使用了"引用"这个词.你现在接受我对单词reference的使用是*完全*与JLS一致,并且被比较的值*是*引用吗? (2认同)

Syl*_*lar 19

==运算符比较对象是否是同一个实例.equals()oerator比较对象状态(例如,如果所有属性都相等).您甚至可以覆盖equals()方法,以便在对象等于另一个对象时定义自己.

  • 请注意,`Object`中`equals()`的默认实现有效地回退到`this == other`.这是一个常见的混淆源,因为除非你使用一个实际以有意义的方式实现`equals()`的类,否则你不会看到差异. (8认同)

joe*_*ely 14

如果你和我各自走进银行,每个人开一个全新的账户,每个存款100美元,然后......

  1. myAccount.equals(yourAccount)true因为它们具有相同的价值,但是
  2. myAccount == yourAccountfalse因为他们不是同一个帐户.

(Account当然,假设课程有适当的定义.;-)

  • 对于==和equals之间的差异,这也是一个非常非常糟糕的解释. (4认同)
  • 那将是一个非常糟糕的平等实现. (3认同)
  • 我喜欢这个比较,哈哈,它说明了为什么你不应该为字符串编码 `==`,因为错误的人可能会得到你的钱,或者你可能根本没有得到你的钱。(无论如何,谁会将钱存储为字符串,哈哈)但这是一个吓唬程序员的好例子。 (2认同)