HashMap的key不会重复,底层是数组,如果key重复了,会hash寻址到同一个index,覆盖原来的value。HashSet基于HashMap,也是无序的、不重复的。
构造一个HashSet
Set<String> set = new HashSet<String>();
HashSet无参构造器
public HashSet() {
map = new HashMap<>();
}
从上可知,HashSet底层就是一个HashMap。
HashSet的add方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
也就是说add添加进的值,其实就是HashSet的key,value其实就是PRESENT,一个空对象。
private static final Object PRESENT = new Object();
HashSet的迭代器
public Iterator<E> iterator() {
return map.keySet().iterator();
}
总结
1)HashMap的key是无序的、不重复的。HashSet也是一样。
2)LinkedHashMap是有序的。LinkedHashSet也是一样。
3)TreeMap是有序的。TreeSet也是一样,默认是根据插入元素的值来排序,可以定制Comparator。
4)Set类型都是不重复的。
5)往HashSet里放入元素,底层就put到HashMap里去;对HashSet进行遍历,就是直接遍历HashMap的key。
6)Set底层的Map,只有key是有值的,value都是null值。
7)HashSet底层是HashMap,有数组,有扩容问题,可以在构造HashSet时就传入数组大小。
8)LinkedHashSet.add(),底层会调用LinkedHashMap.put()方法,该方法会按插入顺序构建链表,后面遍历时,是直接遍历维护好的链表。