HashMap相关细节

来源:互联网 发布:红三兵炒股软件下载 编辑:程序博客网 时间:2024/05/19 09:40

HashMap是一种键值对(K-V)形式的存储结构.

  • KEY AND VALUE 都可以为空
  • KEY 重复会覆盖, VALUE 可以重复
  • 无序(不会按照PUT进去的顺序读)
  • 线程不安全
static class Entry<K,V> implements Map.Entry<K,V> {    final K key;    V value;    Entry<K,V> next;    int hash;    ...}

Entry组成的是一个单向链表

public static void main(String[] args){     Map<String, String> map = new HashMap<String, String>();     map.put("111", "111");     map.put("222", "222");}

在new 的时候,如果没有指定大小那么就默认16个 ,即创建了16个键和值都是null的entry

空的Key会默认放在第0位的数组位置上

由于HashCode是Object的方法,因此每个对象都有一个HashCode,对这个HashCode做一次hash计算。防止生成糟糕的hashcode

每一个新增的Entry都位于table[1]上

根据key的hash找到待删除的键值对位于table的哪个位置上
记录一个prev表示待删除的Entry的前一个位置Entry,e可以认为是当前位置
从table[i]开始遍历链表,假如找到了匹配的Entry,要做一个判断,这个Entry是不是table[i]:
(1)是的话,也就是第14行~第15行,table[i]就直接是table[i]的下一个节点,后面的都不需要动

(2)不是的话,也就是第16行~第17行,e的前一个Entry也就是prev,prev的next指向e的后一个节点,也就是next,这样,e所代表的Entry就被踢出了,e的前后Entry就连起来了

HashMap并没有插入的概念。

糟糕的HashCode意味着的是Hash冲突

HashMap和Hashtable
Hashtable是线程安全的
Hashtable不允许空的value

原创粉丝点击