请教hashCode的本质
我想请问一下hashCode到底代表什么东西呢,对象的hashcode和内存地址有什么关系啊?
package wukun; public class Stu { private String name; private String sex; public Stu(String name, String sex) { super(); this.name = name; this.sex = sex; } } package wukun; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class HashCodeTest { public static void main(String[] args) { // Set h1 = new HashSet(); // Set h2 = new HashSet(); // // ArrayList a1 = new ArrayList(); // ArrayList a2 = new ArrayList(); // //// a1.add(new String("abc")); //// a2.add(new String("abc")); // // h1.add(a1); // h2.add(a2); // // System.out.println(h1.hashCode()); // System.out.println(h2.hashCode()); // Stu s1 = new Stu("wukun","男"); Stu s2 = new Stu("wukun","男"); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); } } 为什么2个ArrayList的hash码一样,而2个自定义的stu对象的hash码就不一样呢?(主要问这个问题)
public V put(K key, V value) {K k = maskNull(key);int hash = hash(k);int i = indexFor(hash, table.length);for (Entry<K,V> e = table; e != null; e = e.next) {if (e.hash == hash && eq(k, e.key)) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, k, value, i);return null;}
static boolean eq(Object x, Object y) {return x == y || x.equals(y);}
void addEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];table[bucketIndex] = new Entry<K,V>(hash, key, value, e);if (size++ >= threshold)resize(2 * table.length);}
由于String类的hashCode以内容来计算,内容都是"abc",所以计算结果同,而ArrayList又以元素的hashCode来计算,而两个String元素的hashCode相等,所以计算结果也相等,最终导致两个ArrayList的hashCode也相等
而两个Stu对象hashCode不相等是因为它们的hashCode继承自Object父类,这个类的hashCode是一个native方法(C语言实现的),实现逻辑由虚拟机内部产生,综述你可以重写任何对象的hashCode来保证实现你需要的逻辑,而且很明显你已经知道为什么要重写hashCode方法了,这很好!