Java HashMap/HashTable/TreeMap

        HashMap和Hashtable都是存储“键值对(key-value)”的散列表,而且都是采用拉链法实现的。

        存储的思想都是:通过table数组存储,数组的每一个元素都是一个Entry;而一个Entry就是一个单向链表,Entry链表中的每一个节点就保存了key-value键值对数据。

        添加key-value键值对:首先,根据key值计算出哈希值,再计算出数组索引(即,该key-value在table中的索引)。然后,根据数组索引找到Entry(即,单向链表),再遍历单向链表,将key和链表中的每一个节点的key进行对比。若key已经存在Entry链表中,则用该value值取代旧的value值;若key不存在Entry链表中,则新建一个key-value节点,并将该节点插入Entry链表的表头位置。

        删除key-value键值对:删除键值对,相比于“添加键值对”来说,简单很多。首先,还是根据key计算出哈希值,再计算出数组索引(即,该key-value在table中的索引)。然后,根据索引找出Entry(即,单向链表)。若节点key-value存在与链表Entry中,则删除链表中的节点即可。

HashMap:非同步,线程不安全,不支持多线程访问;允许K-V为null值;

ConcurentHashTable:同步的,线程安全,支持高并发;

TreeMap:自然顺序或自定义顺序遍历Key,是经过排序的;


Java HashMap/HashTable/TreeMap_第1张图片
拉链法(解决哈希冲突)

你可能感兴趣的:(Java HashMap/HashTable/TreeMap)