关于hashcode和equals方法

来源:互联网 发布:python 求平均值 编辑:程序博客网 时间:2024/05/17 17:46

前段时间去参加了一个JAVA竞赛,初赛的时候,遇到一道题目,要求我们写一个Person类,另外题目中有一小段代码,大概是

set.add(new Person("张三",21));

起初的时候,并没有注意到所给出的这段代码的真实意图,于是,很自然就写出下面这个Person类

public class Person{    private String name;    private int age;    public Person(){    }    public Person(String name,int age){        this.name = name;        this.age = age;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

自己本身也用不好JDK提供的集合类,水平方面等等的原因,最后在交卷前还是没能想出无法通过的原因,后来认真学习下了HashSet的用法和原理,终于知道了原因所在,因为我没重写hashCode方法和equals方法!

我们都知道,HashSet中的元素是没有重复的,但是对于自己定义的类,如果要实现无重复,就要重写hashCode和equals方法,在我们往HashSet里面添加对象的时候,在add()的方法内部,它首先调用该对象的hashCode()方法(hashCode方法用来计算该对象的哈希码),如果返回的哈希码与集合已存在对象的哈希码不一致,则add()方法认定该对象没有与集合中的其它对象重复,那么该对象将被添加进集合中。如果hashCode()方法返回的哈希码与集合已存在对象的哈希码一致,那么将调用该对象的equals方法,进一步判断其是否为同一对象。之所以在进行了hashcode(哈希码)的比较后,又调用equals()方法进行比较,是因为虽然HashSet采用的是通过hashcode来区分对象,但是在java中hashcode会重码,通过hashCode()和equals()方法就能快速且准确的判断在集合中是否存在与添加对象相同的对象。,

所以,Person类应该像下面这样写才比较正确

public class Person {    private String name;    private int age;    public Person() {    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + age;        result = prime * result + ((name == null) ? 0 : name.hashCode());        return result;    }    public boolean equals(Object o) {        if (o == null) {            return false;        }        if (this == o) {            return true;        }        //判断对象o是否是Person类的实例        if (getClass() != o.getClass()) {            return false;        }        Person other = (Person) o;        if (age != other.age) {            return false;        }        if (name == null) {            if (other.name != null) {                return false;            }        } else if (!name.equals(other.name)) {            return false;        }        return true;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}


hashCode方法的重写也是有讲究的,写得不好的话,会出现重码率比较高的情况,对于这一块,我也不清楚该怎样写才最好。JAVA之路还很遥远,有时候,一些简单的问题就能把自己难倒,要怪,就能怪自己基础不扎实,仍需努力!

0 0