菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一致性相等

  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一致。

posted on 2019-07-03 19:11  好吧,就是菜菜  阅读(349)  评论(0编辑  收藏  举报