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()要保证对象的一致性。。。。
相关文章推荐
- java hashcode()和equal()方法比较
- 为什么重写equal方法必须重写getHashCode?
- HashSet(overwrite hashcode、equals方法、源码)
- equals and hashcode method in hibernate framework
- java hashCode()方法equals()和==
- HashCode and Equals method in Java object – A pragmatic concept
- CODE:扩展方法ToJSON() and ParseJSON()
- understand equal and gethashcode
- master and slave have equal MySQL server UUIDs 解决方法
- Java HashCode方法
- Java equals() and hashCode() Contract[转]
- Equals and Hash Code in Java(Sun认证重点试题)
- JAVA 基础之 equals and HashCode
- Equals and HashCode in Hibernate
- master and slave have equal MySQL server UUIDs 解决方法
- hashcode and equals
- hashCode equal避免的几个误区
- Java compareTo, equals and hashcode
- Java equals() and hashCode() Contract
- hashcode and equals