JDK源码分析(三)——HashMap 上(基于JDK7) (4)

  remove方法根据传入的键从HashMap移除键值对,并返回键值对的值。

public V remove(Object key) { //调用removeEntryForKey方法 Entry<K,V> e = removeEntryForKey(key); return (e == null ? null : e.value); } final Entry<K,V> removeEntryForKey(Object key) { int hash = (key == null) ? 0 : hash(key); int i = indexFor(hash, table.length); Entry<K,V> prev = table[i]; Entry<K,V> e = prev; while (e != null) { Entry<K,V> next = e.next; Object k; //如果找到了,就将键值对从链表删除,这里面一大串就是单链表的删除元素 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { modCount++; size--; if (prev == e) table[i] = next; else prev.next = next; e.recordRemoval(this); return e; } prev = e; e = next; } return e; } 判断 isEmpty() public boolean isEmpty() { //HashMap的size为0,则为空 return size == 0; } containsKey(Object key) public boolean containsKey(Object key) { //直接调用getEntry方法,判断返回的键值对是否为null return getEntry(key) != null; } containsValue(Object value) public boolean containsValue(Object value) { //判断value是否为null,如果是调用containsNullValue方法 if (value == null) return containsNullValue(); //遍历寻找 Entry[] tab = table; for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (value.equals(e.value)) return true; return false; } private boolean containsNullValue() { Entry[] tab = table; for (int i = 0; i < tab.length ; i++) for (Entry e = tab[i] ; e != null ; e = e.next) if (e.value == null) return true; return false; } 总结

  HashMap基于数组加单向链表实现、以Key-Value键值对存储数据,在不考虑哈希冲突的情况下能够以O(1)的复杂度进行存储、查询、删除元素,它通过巧妙的设计结合了ArrayList和LinkedList的优点。HashMap是线程不安全的,所以不建议在多线程环境下使用。JDK8中对HashMap的实现进行了改进,加入了红黑树的设计,将在下一篇文章中介绍。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzzgg.html