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 を比較 SethashSet = 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());