1.数据结构
HashMap: 数组+列表+红黑树
TreeMap: 红黑树
因为数据结构,导致节点的实体类不一样HashMap: 两种 Node 和 TreeNode (支持链表)
static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; }
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { TreeNode<K,V> parent; // red-black tree links TreeNode<K,V> left; TreeNode<K,V> right; TreeNode<K,V> prev; // needed to unlink next upon deletion boolean red; TreeNode(int hash, K key, V val, Node<K,V> next) { super(hash, key, val, next); }
}
TreeMap: (只是红黑树,不支持链表操作)
static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> left; Entry<K,V> right; Entry<K,V> parent; boolean color = BLACK; }
3.数据范围
数据结构不一样,所以数据结构的范围,完全没有可比性
HashMap:
默认数组长度: 16
数组最大长度: 2^30
扩容因子: 0.75f
列表转红黑树阈值: 8
红黑树转列表阈值: 6
列表转红黑树最小数组长度: 64
TreeMap:
没发现有范围控制
线程安全都不是线程安全的
KEY 和 Value 限制HashMap: Key和 Value 都可以为 null ( 如果key 为 null 的话, hashCode = 0 )
TreeMap: Key 不能为 null , Value 可以为 null
HashTable: Key 不能为 null , Value 不能为 null
LinkedHashMap: 由 HashMap实现, 同HashMap
6.实现接口
HashMap:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { TreeMap: (多实现 NavigableMap 接口)
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable
定位HashMap:
通过 hash 算法定位, 针对 hash 冲突的值, 采用列表和红黑树的方式存储, 一定条件下可以相互转换. 红黑树中, 如果 hash 值一样,是通过 key 的 比较方法(可自定义)来计算红黑树所处的位置. 比如 String 类型的Key 是通过 String 类里的 compareTo 方法,直接返回 第一个不同字符的差值.来进行红黑树定位.
TreeMap:
红黑树存储结构, 通过自定义 key 比较器或者默认的比较算法来进行定位红黑树节点的存储位置. ———————————————— 版权声明:本文为博主「张伯毅」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zhanglong_4444/article/details/92762544
