equals()和hashCode()方法笔记

1、当向集合中添加对象时,首先计算要增加对象的hashCode码,根据该值得到一个位置用来存放当前的对象,当该位置没有一个对象存在的话,直接将该对象增加进去。如果该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置的对象进行equals方法比较,如果返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的新地址里。如果equals方法返回true,那么集合认为已经存在该对象,不会再让该对象增加到集合中。

2、当重写equals方法时必须重写hashCode方法。如果一个类的两个对象使用equals方法比较时结果为true,那么这两个对象一定具有相同的hashCode。相反,hashCode相同,不一定equals

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        Set<Person> set = new HashSet<Person>();
        set.add(new Person("zhangsan"));
        set.add(new Person("lisi"));
        set.add(new Person("zhangsan"));

        for (Iterator<Person> iter = set.iterator(); iter.hasNext();) {
            System.out.println(iter.next().getName());
        }
    }
}

class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    // 重写hashCode()方法
    @Override
    public int hashCode() {
        return this.name.hashCode();
    }

    // 重写equals() 方法
    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        // 同一个对象直接返回true
        if (obj == this)
            return true;
        if (obj instanceof Person) {
            Person p = (Person) obj;
            if (p.name.equals(this.name))
                return true;
        }
        return false;
    }

}

 

posted @ 2016-08-21 16:31  no_one  阅读(220)  评论(0编辑  收藏  举报