一致性相等
equals的返回结果与{@link java.lang.Comparable} 的返回结果一致.注意.null不是任何类的实例.instance.equals(null)都是false,java.lang.Comparable使用null比较抛出异常.
如果没有实现一致性相等,那么在使用Sorted Set或者Sorted Map时会出现怪异的结果(没有指定比较器).几乎所有java 核心库对{@link java.lang.Comparable} 的实现都是一致性相等,
除了BigDecimal. 精度不同,但是返回的是0,equals返回false.
public static void main(String[] args) { BigDecimal b1 = BigDecimal.valueOf(4); BigDecimal b2 = BigDecimal.valueOf(4.00); System.out.println(b1.compareTo(b2));//0 System.out.println(b1.equals(b2));//false SortedSet<BigDecimal> sets = new TreeSet<>(); sets.add(b1); boolean res = sets.add(b2); System.out.println(res);//false }
另外,相等有几个概念
1:自反性
x.equals(x)永远都是true.
2.传递性
x.equals(y) 是true,y.equals(z) 是true,那么 x.equals(z) 也是true
3.对称性
x.equals(y) 是true 那么 y.equals(x) 也是true
4.一致性
多次调用 x.equals(y) 始终返回 true
或始终返回 false
以上x,y,z均不等于null.
equals和hashcode的协定
1.俩个对象equals如果相等,hashCode必然一致。
2.equals如果不等,不要求hashCode一致。