The HIRO Says

If you smell what The HIRO is cooking!!!

BigDecimal で見る hashCode() と compareTo() の違い

java.math.BigDecimal クラスを使用すると、hashCode() と compareTo() の違いが分かりやすいと思います。


実装

    BigDecimal number1 = new BigDecimal("0");
    BigDecimal number2 = new BigDecimal("0.0");

    // ★a.equals(b) = true ならば a.compareTo(b) == 0 という規約に違反している!
    assertFalse(number1.equals(number2));
    assertEquals(
            0,
            number1.compareTo(number2));

    // HashSet:equals()/hashCode() で element を比較
    Set hashSet = new HashSet();
    hashSet.add(number1);
    hashSet.add(number2);
    // ★number1 と number2 は equal ではないため、サイズが2になる。
    assertEquals(
            2,
            hashSet.size());

    // TreeSet:compareTo() で element を比較
    Set treeSet = new TreeSet();
    treeSet.add(number1);
    treeSet.add(number2);
    // ★number1 と number2 を compareTo するとゼロであるため、サイズが1になる。
    assertEquals(
            1,
            treeSet.size());