Update 10. 重写equals方法时遵守通用约定.md

This commit is contained in:
Joe 2018-10-09 11:39:24 +08:00 committed by GitHub
parent 21680a3164
commit 52ccfe71a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,10 +27,10 @@ public boolean equals(Object o) {
当你重写 equals 方法时必须遵守它的通用约定。Object 的规范如下:
equals 方法实现了一个等价关系equivalence relation。它有以下这些属性:
- **自反性:**对于任何非空引用 x`x.equals(x)` 必须返回 true。
- **对称性:**对于任何非空引用 x 和 y如果且仅当 `y.equals(x)` 返回 true 时 `x.equals(y)` 必须返回 true。
- **传递性:**对于任何非空引用 x、y、z如果 `x.equals(y)` 返回 true`y.equals(z)` 返回 true`x.equals(z)` 必须返回 true。
- **一致性:**对于任何非空引用 x 和 y如果在 equals 比较中使用的信息没有修改,则 `x.equals(y)` 的多次调用必须始终返回 true 或始终返回 false。
- **自反性:** 对于任何非空引用 x`x.equals(x)` 必须返回 true。
- **对称性:** 对于任何非空引用 x 和 y如果且仅当 `y.equals(x)` 返回 true 时 `x.equals(y)` 必须返回 true。
- **传递性:** 对于任何非空引用 x、y、z如果 `x.equals(y)` 返回 true`y.equals(z)` 返回 true`x.equals(z)` 必须返回 true。
- **一致性:** 对于任何非空引用 x 和 y如果在 equals 比较中使用的信息没有修改,则 `x.equals(y)` 的多次调用必须始终返回 true 或始终返回 false。
- 对于任何非空引用 x`x.equals(null)` 必须返回 false。
除非你喜欢数学,否则这看起来有点吓人,但不要忽略它!如果一旦违反了它,很可能会发现你的程序运行异常或崩溃,并且很难确定失败的根源。套用约翰·多恩 (John Donne) 的说法,没有哪个类是孤立存在的。一个类的实例常常被传递给另一个类的实例。许多类,包括所有的集合类,都依赖于传递给它们遵守 equals 约定的对象。