hashcode和equals

来源:互联网 发布:传奇加载物品数据库 编辑:程序博客网 时间:2024/06/05 08:37

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);    }


4、set是不允许重复元素的,他用的是hashmap的key的算法,相当于会先比较对象的hashcode

 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;}@Overridepublic int hashCode() {return this.age*31+this.age;}@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubif(this.hashCode()==obj.hashCode()){return true;}return false;}}

这里输出的结果是: Animal对象的数量:1