我一直认为Java中有两种类型的相等性:
- 值相等:使用
.equals()
方法测试两个对象在非空对象引用上实现等价关系。 - 引用相等:使用
==
运算符测试两个原始类型或内存位置是否相等。
以下页面更详细地描述了这些语言基础知识。
- Wikibooks Java编程:Java Programming/Comparing Objects
- xyzws Java EE常见问题解答:What are the differences between the equality operator and the equals method?
- Java平台API:Javadoc for Object.equals()
- Java语言规范:Equality Operators
null
对象引用的值相等会发生什么。隐含的假设是应该抛出NullPointerException
,但ObjectUtils.equals()方法并不会这样做,它可能被认为是最佳实践的实用方法。让我担心的是Apache Commons似乎已经通过后门有效地引入了Java的第三种相等度量,并且已经混乱的情况可能变得更加复杂。我称之为第三种相等度量,因为它尝试测试值相等性,当失败时则退而求其次,测试引用相等性。Apache Commons的相等性测试与值相等性和引用相等性有许多相似之处,但也有明显的不同。
我是否有理由担心并尽可能避免使用
ObjectUtils.equals()
?是否有理由认为
ObjectUtils.equals()
提供了其他两种相等度量的有用结合?