HashSet源码解析
1、属性
//底层使用了HashMap来存储元素,所以元素不可能出现重复 private transient HashMap<E,Object> map; //用来填充底层数据结构HashMap中的value,因为HashSet只用key存储数据。 private static final Object PRESENT = new Object();
2、构造器
//无参构造 public HashSet() { map = new HashMap<>(); }
public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); }
public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); }
public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) modified = true; return modified; }
最后这个构造方法,与前面那个有所不同,因为它是由LinkedHashSet实现的。
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
添加和删除都是HashMap中的操作,而想遍历元素的话,就需要使用迭代器依次遍历:
3、添加
public boolean add(E e) { return map.put(e, PRESENT)==null; }
4、删除
public boolean remove(Object o) { return map.remove(o)==PRESENT; }
注意:HashSet中的元素存储是无序的,因为是根据hash值来存储。
相关推荐
瓜牛呱呱 2020-11-12
柳木木的IT 2020-11-04
yifouhu 2020-11-02
lei0 2020-11-02
源码zanqunet 2020-10-28
源码zanqunet 2020-10-26
一叶梧桐 2020-10-14
码代码的陈同学 2020-10-14
lukezhong 2020-10-14
lzzyok 2020-10-10
anchongnanzi 2020-09-21
clh0 2020-09-18
changcongying 2020-09-17
星辰大海的路上 2020-09-13
abfdada 2020-08-26
mzy000 2020-08-24
shenlanse 2020-08-18
zhujiangtaotaise 2020-08-18
xiemanR 2020-08-17