最近学习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