Effective Java 读书笔记(2)
8,在重写equals方法时要遵守一些约定。并不是每个类都需要重写equals方法,但是如果你需要,记得要遵守自反性,对称性,一致性,传递性。如果父类可以被实例化,而子类又增加了值域,那么equals方法肯定会有问题,所以,多用组合,少用继承。Java类库里就有这样的例子,java.sql.Timestamp继承了java.util.Date并增加了一个值域nanos,破坏了对称性。
Date d = new Date(); Timestamp ts1 = new Timestamp(d.getTime()); System.out.println(d.equals(ts1));//true System.out.println(ts1.equals(d));//false
BigDecimal d1 = new BigDecimal("1.0"); BigDecimal d2 = new BigDecimal("1.00"); HashSet<BigDecimal> set1 = new HashSet<>(); set1.add(d1); set1.add(d2); System.out.println(set1.size());//2 TreeSet<BigDecimal> set2 = new TreeSet<>(); set2.add(d1); set2.add(d2); System.out.println(set2.size());//1