hashmap
1 Map接口
JAVA提供的JAVA.util.Map接口下有四个实现类 hashmap treemap hashtable linkedhashmap. 分别如下。
hashmap ,根据键值的hashcode存储数据,具有随机性。
最多允许一个键值为null,可以允许多个value为null。
多个线程同时写可能会导致数据不一致。可以使用 collections. synchronizedmap,和 concurrenthashmap实现线程安全。
treemap 实现了sortedmap接口,把保存的记录根据键值进行默认的升序排序,也可自定义为降序。当用iterator进行遍历时,得到的结果是根据键值进行排序的。
linkedhashmap 。hashmap的一个子类,是根据插入的顺序进行排序的。
hashtable 是遗留类,线程安全,使用synchronized关键字进行同步。不建议使用,可用concurrenthashmap(使用分段锁)代替。
2 hashmap的原理
在JAVA1.7中底部是数组加链表。数组是桶table,根据index=hashcode(key)&(table.length-1),当发生键值冲突的时候,采用链地址法。采用头节点插入法。index所处值为空时,将当前值作为链表的头节点。在jdk1.8中,当链表的长度大于八的时候,会转换为红黑树。当table数组长度不足时,会进行扩容操作。当红黑树长度低于六的时候会转换为链表。
红黑树
根节点和叶子结点都是黑色的
红色节点的子节点一定是黑色节点
任何一节点到叶子节点的黑色节点个数都一样。
原文:https://www.cnblogs.com/bowenqianngzhibushiwo/p/11644124.html