// 举列子
public class HashSetDetail {
public static void main(String[] args) {
Set set = new HashSet();
set.add(12);
set.add("jack");
set.add(23.0);
set.add("daf");
set.add("fwef");
set.add(true);
set.add(null);
System.out.println("=====输出该Set=====");
System.out.println(set);
}
}
首先new对象的时候会调用如下构造器
// 构造器
// 底层原理是HashMap, 值得注意的是 HashSet 是 HashMap 的一个实例
public HashSet() {
map = new HashMap<>();
}
往HashSet中添加元素的时候会调用如下的方法
/* 如果指定的元素尚未存在,则将其添加到此集合。
更正式地说,如果该集合不包含元素e2,则将指定的元素e添加到该集合中,
这样(e==null?e2==null:e.equals(e2))。
如果该集合已经包含元素,则调用将保持该集合不变并返回false。*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
进入put方法
// 将指定值与此映射中的指定键相关联。
// 如果映射之前包含键的映射,则替换旧值。
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
// hash(key)
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
进入putVal方法
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length