java中==、equals和hashCode的分析

代码
1
2  public class Equals_HashCode {
3 public static void main(String[] args) {
4 // 1. '=='是用来比较两个变量(基本类型和对象类型)的值是否相等的,
5 // 如果两个变量是基本类型的,那很容易,直接比较值就可以了
6 // 如果两个变量是对象类型的,那么它还是比较值,
7 // 只是它比较的是这两个对象在栈中的引用(即地址)
8 // 对象是放在堆中的,栈中存放的是对象的引用(地址)。
9 // 由此可见'=='是对栈中的值进行比较的。
10 // 如果要比较堆中对象的内容是否相同,那么就要重写equals方法了
11 // 2. Object类中的equals方法就是用'=='来比较的:
12 // public boolean equals(Object obj) {
13 // return (this == obj);
14 // }
15 // 所以如果没有重写equals方法,equals和==是等价的。
16 // 通常我们会重写equals方法,让equals比较两个对象的内容,而不是比较对象的引用(地址)
17 // 因为往往我们觉得比较对象的内容是否相同比比较对象的引用(地址)更有意义
18 // 3. Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看)
19 // 所以如果没有重写hashCode方法,任何对象的hashCode都是不相等的。
20 // 通常在集合类的时候需要重写hashCode方法和equals方法,
21 // 因为如果需要给集合类(比如:HashSet)添加对象,
22 // 那么在添加之前需要查看给集合里是否已经有了该对象,
23 // 比较好的方式就是用hashCode。
24 // 4. 注意的是String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法
25 // 这两个方法是根据对象的内容来比较和计算hashCode的。(详细可以查看jdk下的String.java源代码)
26 // 所以只要对象的基本类型值相同,那么hashcode就一定相同。
27 // 5. equals()相等的两个对象,hashcode()一定相等;
28 // equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
29 // 换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。
30 // (我的理解是由于哈希码在生成的时候产生冲突造成的)。
31 // 反过来:hashcode()不等,一定能推出equals()也不等;
32 // hashcode()相等,equals()可能相等,也可能不等。
33 // 在object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值),
34 // 而object类中的equals()方法比较的也是两个对象的引用(地址值),
35 // 如果equals()相等,说明两个对象地址值也相等,
36 // 当然hashcode()也就相等了;
37
38
39
40 String a = new String("str");
41 String b = new String("str");
42 System.out.println(a==b);
43 System.out.println(a.equals(b));
44 System.out.println(a.hashCode());
45 System.out.println(b.hashCode());
46 System.out.println();
47 // false
48 // true
49 // 114225
50 // 114225
51 // (使用equals比较结果为是因为String类中重写了equals方法,
52 // 其方法体是比较String中每个字符是否相等。
53 // 二者的hashcode相同是因为String类重写了hashcode方法,
54 // 其方法体是根据String中所有字符计算出一个int作为hashcode)
55
56 class A{
57 String str;
58 int i;
59 public A(String str, int i) {
60 super();
61 this.str = str;
62 this.i = i;
63 }
64 }
65 A aA = new A("str",1);
66 A bA = new A("str",1);
67 System.out.println(aA==bA);
68 System.out.println(aA.equals(bA));
69 System.out.println(aA.hashCode());
70 System.out.println(bA.hashCode());
71 System.out.println();
72 // false
73 // false
74 // 6413875
75 // 21174459
76 // (由于类A没有重写equals和hashCode,
77 // 所以其equals和hashCode依然是使用Object类的equals和hashCode方法)
78
79 class B{
80 String str;
81 public B(String str){
82 this.str = str;
83 }
84 }
85 B aB = new B("str");
86 B bB = new B("str");
87 System.out.println(aB==bB);
88 System.out.println(aB.equals(bB));
89 System.out.println(aB.hashCode());
90 System.out.println(bB.hashCode());
91 System.out.println();
92 // false
93 // false
94 // 827574
95 // 17510567
96
97 class C{
98 int i;
99 public C(int i){
100 this.i = i;
101 }
102 }
103 C aC = new C(1);
104 C bC = new C(1);
105 System.out.println(aC==bC);
106 System.out.println(aC.equals(bC));
107 System.out.println(aC.hashCode());
108 System.out.println(bC.hashCode());
109 System.out.println();
110 // false
111 // false
112 // 27744459
113 // 28737396
114 }
115
116 }
117

 

如有不对的地方敬请指出~~

posted @ 2010-05-18 13:07  weager  阅读(986)  评论(1编辑  收藏  举报
我的新家:戎码一生