现在的位置: 首页 > 综合 > 正文

HashSet(overwrite hashcode、equals方法、源码)

2018年02月05日 ⁄ 综合 ⁄ 共 1120字 ⁄ 字号 评论关闭

当使用Hashset时,hashCode方法就会得到调用,判断已经存储在集合中的对象的hashcode值是否与增加的对象的hashcode值一致;如果不一致,直接加进去,如果一致,再进行equals方法的比较,equals方法如果返回true表示对象已经加入了,就不会增加新的对象,否则加进去

 

同名的人不要增加到HashSet中

HashSet set = new HashSet();
set.add(new Person("zhangsan"));
set.add(new Person("zhangsan"));

 

class Person {
    private String name;
    Person(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
   
}

 

 

HashSet的源码(HashSet的底层是HashMap实现)

public HashSet() {
    map = new HashMap<E,Object>();
}

 

/*

当时有add的方法将对象加到Set中时,实际上是将该对象为底层所维护的map对象的key,而value则是同一个对象(该对象没有起什么作用)

*/

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

 

 

抱歉!评论已关闭.