1、hashcode数据结构中的散列表,它的查询时间复杂度是O(1),在java中hashcode()方法是由Object类实现的本地方法,带有native关键字。
public native int hashCode();
2、hashcode一般在java中用于HashMap和HashSet(本质还是调用的hashMap的方法),为了快速的通过key查找到对应的value值。(可以去看hashmap源码分析,主要是put方法和get方法),给一个HashMap源码分析的地址。
http://blog.csdn.net/ghsau/article/details/16843543
3、在java中,使用equals方法会默认先比较对象的hashcode,所以在重写equals方法时,必须先重写hashcode,在比较两个对象是否为同一个对象时,(两个对象的hashcode不一样,则不是同一个对象,hashcode一样,再比较equals方法),默认Object中的equals方法是比较的对象的地址。
public boolean equals(Object obj) { return (this == obj); }
1)如果hashcode一样,再调用equals方法,比较对象的地址,如果不一样,则添加
2)如果hashcode不一样,则不是同一个对象,可以添加
5、测试set
1)正常的添加对象
public static void main(String[] args) { Set<Animal> set = new HashSet(); Animal am1 = new Animal(12); Animal am2 = new Animal(12); set.add(am1); set.add(am2); set.add(new Animal(12)); set.add(new Animal(12)); System.out.println("Animal对象的数量:"+set.size()); }
class Animal{ int age; public Animal(int age){ this.age=age; } public int getAge(){ return age; } }这里输出的结果是: Animal对象的数量:4
2)重写了hashcode和equals(我这里认为年龄一样就是同一个动物对象)
public static void main(String[] args) { Set<Animal> set = new HashSet(); Animal am1 = new Animal(12); Animal am2 = new Animal(12); set.add(am1); set.add(am2); set.add(new Animal(12)); set.add(new Animal(12)); System.out.println("Animal对象的数量:"+set.size()); } } class Animal{ int age; public Animal(int age){ this.age=age; } public int getAge(){ return age; } @Override public int hashCode() { return this.age*31+this.age; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(this.hashCode()==obj.hashCode()){ return true; } return false; } }
这里输出的结果是: Animal对象的数量:1