请考虑以下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.对于较大的整数,您甚至可以获得与对较小整数不同的代码,而不必查看整数值!
这是预期的行为.
Object.equals() 考虑对象标识(即一个对象只等于它自己),这是你可以为通用对象做的唯一事情.
Integer覆盖依赖于整数值的方法,因为具有相同值的两个Integer对象在逻辑上相等.许多其他类也会覆盖,equals()因为它是标准API的核心机制,并且很多功能,例如在集合框架中依赖于它.
你为什么对这种行为感到困惑?大多数人只会被==操作员混淆,而不是那样(它的工作原理Object.equals()).
| 归档时间: |
|
| 查看次数: |
22056 次 |
| 最近记录: |