Java中==、equals和hashCode的分析

发表于:2010-5-21 10:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:weager    来源:51Testing软件测试网采编

#
java
#
Java

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

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

《2023软件测试行业现状调查报告》独家发布~

精彩评论

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号