Java中equals()方法的行为

siv*_*636 11 java

请考虑以下Java代码:

    Object a = new Integer(2);
    Object b = new Integer(2);
    System.out.println(a.equals(b));

    Object x = new Object();
    Object y = new Object();
    System.out.println(x.equals(y));
Run Code Online (Sandbox Code Playgroud)

第一个打印语句打印true,第二个打印false.

如果这是故意的行为,这有助于如何用Java编程?

如果这不是故意行为,这是Java中的缺陷吗?

Bor*_*lid 27

我将以保留方式回答您的问题,但如果问题的目的是让您学习并且您的解决方案是问StackOverflow,那么您应该知道自己在伤害自己.除此之外......

这种行为是故意的.

比较内存地址的默认equals()方法,这意味着所有对象彼此不同(只返回对同一对象的两个引用).java.lang.Objecttrue

java.lang.Integer覆盖此比较的的IntegerS,SO两个不同的Integer小号都表示两个比较相等的数量.如果你使用了==相反的话,你会得到false两种情况.

Java中的标准做法是覆盖equals返回true具有相同逻辑值的对象的方法,即使它们是在不同时间(或甚至使用不同的参数)创建的.如果你没有办法提问,那么让对象代表数字并不是很有用,"这两个东西是否代表相同的值?".

顺便说一下,这是一个切线,Java实际上Integer为小值保留了对象的缓存.所以有时你可能会得到两个Integer对象,即使你从两个不同的来源获得它们==也会返回true.对于较大的整数,您甚至可以获得与对较小整数不同的代码,而不必查看整数值!


Mic*_*rdt 7

这是预期的行为.

Object.equals() 考虑对象标识(即一个对象只等于它自己),这是你可以为通用对象做的唯一事情.

Integer覆盖依赖于整数值的方法,因为具有相同值的两个Integer对象在逻辑上相等.许多其他类也会覆盖,equals()因为它是标准API的核心机制,并且很多功能,例如在集合框架中依赖于它.

你为什么对这种行为感到困惑?大多数人只会被==操作员混淆,而不是那样(它的工作原理Object.equals()).