HashSet中的add方法
源代码如下:
由源代码(HashSet类中add方法)可以看出PRESENT是常量类型(由fina修饰,全部大写),map是HashMap类型的:public boolean add(E e) { return map.put(e, PRESENT)==null; }
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); }
public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted }
执行代码:
HashSet<String> set = new HashSet<>(); set.add("Tom");
执行第一行代码时,调用了无参构造方法---->上面的HashSet()HashMap()
执行第二行代码时,调用add方法存储数据。证明了HashSet存储的数据实质存储的是HashMap中key的值。HashSet存储的值不允许重复实际上是因为HashMap中key的值不允许重复。
hash方法中不同数据类型的参数的区别:
hashSet中add方法源码:
public boolean add(E e) { return map.put(e, PRESENT)==null; }
hashMap中put方法源码:
public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }
hashMap中hash方法
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
一层层剖析,可知:添加的Tom分别传到了参数 E e、K key、hash(key)中。
引用类型
将String类型的值传到参数中,代码如下:
import java.util.HashSet; public class Test { static int hash(Object key