<java API源码初体验>4---collection集合之HashSet原理分析

来源:互联网 发布:乐高ev3编程 编辑:程序博客网 时间:2024/06/05 01:53

java的HashSet是由HashMap的key组成的,用的增删改查的方法均基于HashMap的key。

根据HashMap保证了key的唯一性。

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

它的add()方法,用的就是HashMap里面的put()方法。
若map中已存在e,则返回false;若不存在,则表示map中没有该key,表示加入成功,返回true。

 public V put(K key, V value) {        if (key == null)            return putForNullKey(value);        int hash = hash(key);        int i = indexFor(hash, table.length);        for (Entry<K,V> e = table[i]; e != null; e = e.next) {            Object k;            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {                V oldValue = e.value;                e.value = value;                e.recordAccess(this);                return oldValue;            }        }        modCount++;        addEntry(hash, key, value, i);        return null;    }

而put方法,是根据key的哈希值,和equals方法来保证唯一性的,如果原key对应数组位置的链表中存在该key值,那么意味着hashcode,e.key.equals(key)均相等,则key不变,只改变key对应的value。若不存在,则将新key插入到链头。

为了保证key的唯一性,我们必须要在加入或进行其他操作之前,必须对key的hashCode(),equals()方法进行重写,并且保证对比的两个对象哈希值相同的情况下,他们的equals方法返回值也为true,保证他们的一致性。这样就可以实现并保证key的不重复了!

0 0
原创粉丝点击