我们都知道,==是用来比较引用的(物理上的相等),而equals方法是用来比较值的(逻辑上的相等),在许多时候需要重写equals方法来实现我们的需求,比如把对象放到容器中,然后去查找对象。在重写equals 方法时要遵循一些契约:自反性:对于非空引用x而言,x.equals(x ...
我们都知道,==是用来比较引用的(物理上的相等),而equals方法是用来比较值的(逻辑上的相等),在许多时候需要重写equals方法来实现我们的需求,比如把对象放到容器中,然后去查找对象。
在重写equals 方法时要遵循一些契约:
- 自反性:对于非空引用x而言,x.equals(x) 必须为true
- 对称性:对于非空引用x和y,如果x.equals(y)为true,那么y.equals(x)必须也为true
- 传递性:对于非空引用x,y和z,如果x.equals(y)为true,并且y.equals(z)为true,那么x.equals(z)必须也为true
- 持久性:对于非空引用x和y,如果x.equals(y) 为true,那么当在x和y并未被修改的情况下,无论执行多少次x.equals(y),这个结果都为true
- null-false: 对于非空引用x,x.equals(null) 始终为false
反例:
破坏自反性
1 public class AntiReflexive { 2 3 private String str; 4 public String getStr() { 5 return str; 6 } 7 8 public void setStr(String str) { 9 this.str = str;10 }11 12 public boolean equals(Object o) {13 if (!(o instanceof AntiReflexive)) {14 return false;15 }16 17 AntiReflexive ar = (AntiReflexive)o;18 return this.str.equals(ar.str.toLowerCase()); // tolowercase 导致了自反性的破坏19 }20 21 public static void main(String[] args) {22 AntiReflexive ar1 = new AntiReflexive();23 ar1.setStr("Hello world");24 25 System.out.println(ar1.equals(ar1));26 }27 }
原标题:重写equals方法
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。