看完hashSet的源码,你肯定会来一句,我靠,因为HashSet居然是HashMap实现的,吓尿了,
温习一下类图,画一个:
源码走一波:
构造方法
public HashSet() {
map = new HashMap<E,Object>();
}
add方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
remove方法
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
源码是在hashMap里面,大概思路是通过key(即为当前的o)找到数组下标,然后通过遍历找到key相等的数据,然后对链表做删除操作,可以自己手动写一个;
boolean containsKey(Object key)
public boolean contains(Object o) {
return map.containsKey(o);
}
//下面是hashMap的方法
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
//通过key找到索引,然后遍历链表,找到key相等的数据返回
final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}
了解hashMap的数据结构,看这些一看就懂。。。