最近學習java 的基礎知識,碰到Java 覆蓋equals時總要覆蓋hashcode時候有許多疑問,經過和同事直接討論及上網查詢的資料,這里整理下,也好幫助大家理解,代碼中有說明。
具體實現代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
package cn.xf.cp.ch02.item9; import java.util.HashMap; import java.util.Map; public class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber( int areaCode, int prefix, int lineNumber) { rangeCheck(areaCode, 999 , "area code" ); rangeCheck(prefix, 999 , "prefix" ); rangeCheck(lineNumber, 9999 , "line number" ); this .areaCode = ( short ) areaCode; this .prefix = ( short ) prefix; this .lineNumber = ( short ) lineNumber; } private static void rangeCheck( int arg, int max, String name) { if (arg < 0 || arg > max) throw new IllegalArgumentException(name + ": " + arg); } @Override 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; } /* @Override //至于為什么使用31,這個是推薦值,研究表明這個數字用起來性能比較好 public int hashCode() { int result = 17; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * result + lineNumber; return result; } */ //如果一個對象不是經常變動,而且開銷比較大的話,就要考慮吧散列碼緩存在對象內部 //用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的最的值。 private volatile int hashcode; @Override public int hashCode() { int result = hashcode; if (result == 0 ) { result = 17 ; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * result + lineNumber; hashcode = result; } return result; } public static void main(String[] args) { Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>(); m.put( new PhoneNumber( 707 , 867 , 5309 ), "Jenny" ); //這里不會返回jenny哦,會返回null,這個是因為put對象吧他們放到不同的散列桶中 System.out.println(m.get( new PhoneNumber( 707 , 867 , 5309 ))); } } |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://www.cnblogs.com/cutter-point/p/5854714.html