hashcode&equals续

Java中的equals方法与hashCode方法的区别

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。

java中比较两个对象不是用“==”吗?对于String a=”hello”;String b=”hello”,比较两个字符串是否相等,我们都知道必须用equals方法,而不是用==。 因为a,b是内存中两个不同的对象,他们指向两个内存中不同的地址,只是两个地址存的内容都相同罢了。如果用==比较,则比较的是两个对象的地址,很显然这里返回false,不是我们需要的。如果想返回true,就必须使用equals方法了。在这里String类里对父类Ojbect的equals方法进行了重写(见String类里的equals方法),比较的不再是地址,而是地址里所存的字符串的值。如果不对equals方法重写,调用的就是父类的equals方法,比较的还是两个对象的地址,同调用==一样。

对于值对象,==比较的是两个对象的值,对于引用对象,比较的是两个对象的地址。默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。再举一个例子,现在有一个学生对象,有属性学号跟姓名,现在我新建了一个学生对象,又从数据里查出一个学生对象,这两个对象的学号跟姓名都一样,那这两个对象是不是相等呢?一般情况下,除非你有特殊需求要处理,这两个对象是相等的,可如果用==去比较,返回的结果是错误的。这时候我们就必须重写equlas方法了。如果学号是主键,在equals方法里,我们认为只要学号相同,就可以返回true,具体实现建议参考String类里equals书写风格。

hashCode方法也是可以用来比较两个对象是否相等的。但是我们很少使用,应该说是很少直接使用。hashCode方法返回的是一个int值,可以看做是一个对象的唯一编码,如果两个对象的hashCode值相同,我们应该认为这两个对象是同一个对象。一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。如上面的学生例子,如果学号相同,不管姓名相不相同,返回的hash值一定要是一样的,这时我们的hash值只与学号有关。

String类中的equals方法 与hashCode方法:

01 publicbooleanequals(Object anObject) {
02         if(this== anObject) {
03             returntrue;
04         }
05         if(anObjectinstanceofString) {
06             String anotherString = (String)anObject;
07             intn = count;
08             if(n == anotherString.count) {
09                 charv1[] = value;
10                 charv2[] = anotherString.value;
11                 inti = offset;
12                 intj = anotherString.offset;
13                 while(n-- !=0) {
14                     if(v1[i++] != v2[j++])
15                         returnfalse;
16                 }
17                 returntrue;
18             }
19         }
20         returnfalse;
21     }
22   
23 publicinthashCode() {
24         inth = hash;
25         if(h ==0) {
26             intoff = offset;
27             charval[] = value;
28             intlen = count;
29   
30             for(inti =0; i < len; i++) {
31                 h =31*h + val[off++];
32             }
33             hash = h;
34         }
35         returnh;
36     }

你可能感兴趣的:(hashcode&equals续)