HashMap、TreeMap

mac2026-02-02  3

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

最新回复(0)