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