若是肯定一個函數不會被調用,請在函數中直接 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; }