@Override publicinthashCode() { finalintprime=31; intresult=1; result = prime * result + areaCode; result = prime * result + exchange; result = prime * result + extension; return result; }
/** * If u put the param that is not Object and forget use the annotation that name is 'Override', * the equals method loses efficacy and u will find the reason hardly. */ @Override publicbooleanequals(Object o) { if (o == this) returntrue; if (!(o instanceof PhoneNumber)) returnfalse; PhoneNumberpn= (PhoneNumber) o; return pn.extension == extension && pn.exchange == exchange && pn.areaCode == areaCode; }
publicbooleanequals2(Object obj) { if (this == obj) returntrue; if (obj == null) returnfalse; if (getClass() != obj.getClass()) returnfalse; PhoneNumberother= (PhoneNumber) obj; if (areaCode != other.areaCode) returnfalse; if (exchange != other.exchange) returnfalse; if (extension != other.extension) returnfalse; returntrue; }
/** * if u do not rewrite the hashCode method, * u will get the different hashCode when u init the same object, then the hashMap will work unusually. */ publicstaticvoidmain(String... args) { Map<PhoneNumber, String> m = newHashMap<PhoneNumber, String>();
1. 把某个非零长数值,比如说 17,保存在一个叫 result 的 int 类型变量中 2. 对于对象中每一个关键域 f(指 equals 方法中考虑的每个域),完成以下步骤: a. 为该域计算 int 类型的散列码 c:
1 2 3 4 5 6 7 8 9 10
i. 如果该域是 boolean 类型,则计算 (f?0:1) ii. 如果该域是 byte、char、short 或者 int 类型,则计算 (int) f iii. 如果该域是 long 类型,则计算 (int) (f ^ (f >>> 32)) iv. 如果该域是 float 类型,则计算 Float.floatToIntBits(f) v. 如果该域是 double 类型,则计算 Double.doubleToLongBits(f) 得到一个 long 类型的值,然后按照步骤 2.a.iii,对该 long 型值计算散列值 vi. 如果该域是一个对象引用,并且该类的 equals 方法通过递归调用 equals 的方式来比较这个域,则同样对这个域递归调用 hashCode 如果要求一个更为复杂的比较,则为这个域计算一个 "规范表示(canonical representation)",然后针对这个范式表示调用 hashCode 如果这个域的值为 null,则返回 0(也可以设置为其他某个常数,但习惯上使用 0) vii. 如果该域是一个数组,则把每一个元素当做单独的域来处理 也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤 2.b 中的做法把这些散列值组合起来
b. 按照下面的公式,把步骤 a 中计算得到的散列码 c 组合到 result 中:
1
result = 37 * result + c;
3. 返回 result 4. 写完了 hashCode 方法之后,问自己 “是否相等的实例具有相等的散列码”。如果不是的话,找出原因,并修改错误
get // manually integrate access methods to reduce overhead containsKey // same as get() except no need for volatile value read
readObject 中读取流中所有的 Object
1 2 3 4 5 6 7 8
// Read the keys and values, and put the mappings in the table for (;;) { // = while(true) Kkey= (K) s.readObject(); // java.io.ObjectInputStream Vvalue= (V) s.readObject(); if (key == null) break; // 只有达到这个条件,才可以退出这个死循环 put(key, value); }