Kevin Su bio photo

Kevin Su

patience, persevere, and enjoy

Email Github Stackoverflow

前一段时间,项目中有个User的类,在里面实现了equal的方法,来对比两个User对象是否相同.equal方法还是很好理解的,通过里面的每一个字段进行一一比对[其实也不是每一个,应该是你需要比对的字段],来确定这两个对象是否同相同.Object中原有的equal对比的是两个对象的内存地址是否相同…

但是hashCode究竟是什么作用,虽然通过名字知道得出来的是一个散列值.可是具体是干嘛用的呢?

通过查找资料,以下例子能很好地说明一个问题.

public class User {

    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (age != user.age) return false;
        return name.equals(user.name);

    }

//    @Override
//    public int hashCode() {
//        int result = name.hashCode();
//        result = 31 * result + age;
//        return result;
//    }

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

}

这是User实体.其中hashCode被我注释了.

public static void main(String[] args){
        HashSet<User> set = new HashSet<>();

        User user1 = new User("kevin", 26);
        User user2 = new User("kevin", 26);

        set.add(user1);
        set.add(user2);

        System.out.print("count=" + set.size());

    }

通过上面的main方法,不实现hashCode的时候,输出的size为2,实现hashCode的时候,输出的size为1.

从这里可以了解,hashCode的功能类似返回一个地址,但是不是内存存放的地址(只是类似而已),通过这个方法来确认是否同一个对象…

官方文档建议实现equal方法的时候,也需要实现hashCode方法.

至于hashCode应该如何实现,其实可以通过IDE直接生产便可以.eclipse和Android studio都有方法.