您的位置:首页 > 编程语言 > Java开发

equal() and hashCode()方法

2016-11-14 22:50 225 查看

equal() and hashCode()方法

1. equal() 和hashCode()方法都是基类Object的方法

其源码如下:

public boolean equals(Object obj) {
return (this == obj);
}

//hashCode method
/*Returns a hash code value for the object. This method is
supported for the benefit of hash tables such as those provided by {@link java.util.HashMap}.*/

public native int hashCode();


因此,equal()方法就是直接比较对象的地址,对于hashCode(),Java采用了哈希表的原理。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。

2. 那么问题来了? 为什么重写equal()方法的时候通常需要重写hashCode()方法呢?

equal()方法是比较对象是否相等的,hashCode()方法是在当对象存入集合如HashSet对象,以及HashMap对象、HashTable等里面用的,这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就覆盖,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

比如String方法里重写了equal()方法:

//String重写的equal方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
//hashCode()方法
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;

for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}


例子:

package com.demo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Equal {

public static void main(String[] args) {
Map<String,String> maps = new HashMap<String,String>();
maps.put("1", "zhangsan");
maps.put("1", "lisi");
maps.put("2", "wangwu");
maps.put("2", "zhaoliu");
maps.put("3", "zhaoliu");

Iterator<Map.Entry<String, String>> iterator = maps.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey()+entry.getValue());
}
}
}
//输出结果:
// 1lisi
// 2zhaoliu
// 3zhaoliu


3.总之

1、equal()是判断两个对象是否相同的

2、hashCode()是在HashSet、HashMap等中用的

3. 通常equal() 和hashCode()要保证对象的一致性。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hashcode equals Java 源码