四、哈希表+映射+集合
1.注意:LinkedHashMap和HashMap有以下不同
1)HashMap实现了Map接口,是无序的,不保存元素的插入顺序,在内部也不保证按照元素的大小顺序排列。
HashMap存值的时候会根据key的hashCode()来计算存储的位置(位置是散列的,所以说其无序)。
其实HashMap还是有序的,只是它是按照key的hashCode()求出的散列码排的序。
2)LinkedHashMap是HashMap的子类,其操作和HashMap相同。
LinkedHashMap不允许重复的元素,但是保留插入元素的顺序。
当对LinkedHashMap进行迭代时,他按照元素添加的顺序返回。
2.Hash相关操作的时间复杂度
Hash Table基于严格平衡的红黑树
对于Hash,当算出的散列码值相同时,就会被排到一个链表中,最糟糕的情况就是所有元素都在一个链表中,时间复杂度也就由O(1)变成O(n)了。
解释如下图:
3.Java中的一些方法
1)HashSet部分源码
HashSet底层实现是基于HashMap的,可参考源码如下:
/** * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75). */ public HashSet() { map = new HashMap<>(); }
2)HashMap部分方法源码
(1)get()
public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }
(2)put()
public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }