effective------equals , hashCode
覆盖equals时总是覆盖hashCode:你都认为他们是同一个东西了,当然应该放到同一个桶中。。。public boolean equals(Object o){ if(o == this) return true; if(!(o instanceof PhoneNumber))return false; PhoneNumber pn = (PhoneNumber)o; return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode;}下面是构建高效hashCode的原则:1.把某个非零的常数值,比如17,保存在一个名为result的int类型的变量中。2。 对于对象的每个关键域f(指equals方法中涉及的每个域),完成以下步骤: a. 为该域计算int类型的散列码c: i. 如果该域是boolean类型,则计算(f?1:0). ii. 如果该域是byte,char,short,int类型,则计算(int)f. iii. 如果该域是long类型,则计算(int)(f^(f>>>32)). iv. 如果该域是float类型,则计算Float.floatTointBits(f). v.如果该域是double类型,则计算Double.doubleToLongBits(f),然后按照步骤iii,为得到的long类型值计算散列值。 vi.如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方法来比较这个域,则同样为这个域递归调用hashCode,如果需要更复杂的比较,则为这个域计算一个"范式",然后针对这个范式调用hashCode, 如果数组域的值为null,则返回0. vii. 如果该域是一个数组,则要把每一个元素当作单独的域来处理,也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤2.b 中的做法吧这些散列值组合起来。如果数组域中的每个元素都很重要,可以利用发行版本1.5中增加的一个Arrays.hashCode方法。