package EffectiveJava;import static java.lang.System.out;// 一個違反對稱性的類class CaseString{private String s;public CaseString(String s) {this.s = s;}@Override //這個方法的目的是為了使CaseString 和 String 可以互操作,但這是做不到的,只會違反的equals的對稱性public boolean equals(Object o) { //該方法違反了對稱性,即CaseString.equals(String) 而 String not equals (CaseString) ,String 只能equals Stringif(o instanceof String)return s.compareToIgnoreCase((String)o)==0;if(o instanceof CaseString)return s.compareToIgnoreCase(((CaseString)o).s)==0;return false;}}public class _3_7_equals {public static void main(String args[]) {CaseString s1 = new CaseString("abc");String s2 = "abc";out.println(s1.equals(s2));out.println(s2.equals(s1));}}/** * 還有一個Point類的經典例子 * Point類(int x,int y) * |———— ColorPoint(int x,int y,Color) * * *//** * 編寫 equals 的步驟 * 1. 用 == 對其進行是否同一對象引用的判斷,有利於效率的提高 * 2. instanceof 類型判斷,相同,true 否則 false ,如果是對於同一介面類型的判斷,如果Collection 集合的判斷,只要繼承了List介面,就可以接下來的判斷了 * 3. 實參轉換成正確的類型 * 4.對類型中的關鍵域進行匹配,如非 Double Float的基本類型,直接== 判斷,如果是Double Float 要將其轉換成 long 或 int 再用 == 進行判斷 * 對於數群組類型的判斷,要遍曆其中的每一個類型進行判斷,可以使用AbstractList 類中的方法 * return (o1==o2) || (o1!=null && o1.equals(o2)) * 5.對於修改equals 方法時,總要修改 hashCode 方法 * 6.equals方法的參數為Object類型,不要將其修改為其他類型,否則的話,則為重載,而不是重寫了 * * * / */