若是肯定一个函数不会被调用,请在函数中直接 throws UnsupportException,防止程序逻辑出错时还默默执行。 java
在改写类的equals方法时,要实现以下的等价关系: 缓存
以下的equals代码是一个很好的实践: 函数
public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof PhoneNum)) { return false; } PhoneNum pn = (PhoneNum) o; return pn.areaCode == this.areaCode && pn.num == this.num; }
改写equals时,不要忘记同时改写hashCode。在以下程序中,重写了equesl,可是没有重写hashCode,因此输出null,而不是mike。 this
import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { HashMap m = new HashMap(); m.put(new PhoneNum(0, 123456), "mike"); String v = (String) m.get(new PhoneNum(0, 123456)); System.out.println(v); } } class PhoneNum { private final int areaCode; private final int num; PhoneNum(int areaCode, int num) { this.areaCode = areaCode; this.num = num; } public boolean equals(Object o) { if (!(o instanceof PhoneNum)) { return false; } PhoneNum pn = (PhoneNum) o; return pn.areaCode == this.areaCode && pn.num == this.num; } }
实现hashCode时,须要注意: spa
老是要实现toString方法,System.out.println一个对象时,会调用toString方法。 code
改写clone函数会有不少“坑”,建议不该该去改写clone方法。 对象
public Yum(Yum yum);
public static Yum newInstance(Yum yum);
拷贝构造函数有许多优势,好比,能够把类型A拷贝成类型B,而这是clone方法不能实现的。 接口
//该代码经过拷贝构造函数,把LinkedList转换成了ArrayList。 LinkedList<Integer> ll = new LinkedList<Integer>(); ll.add(1); ll.add(2); ArrayList<Integer> al = new ArrayList<Integer>(ll); for (Integer i : al) { System.out.println(i); }
实现compareTo接口时,要注意: 资源
public int compareTo(Object o) { PhoneNum pn = (PhoneNum) o; // 和equals方法不一样,这里强制转化时,不须要作类型检查。compareTo(null)和compareTo("TEST")分别抛出NullPointerException和ClassCastException正是咱们想要的。 int areaCodeDiff = areaCode - pn.areaCode; if (0 != areaCodeDiff) { return areaCodeDiff; } return this.num - pn.num; }