JDK1.8 HashMap和TreeMap区别,读懂这一篇就够了

 

刚刚被问到HashMap和TreeMap 有什么区别,想了想,就整理一下吧.

 

1.数据结构

HashMap: 数组+列表+红黑树

JDK1.8 HashMap和TreeMap区别,读懂这一篇就够了_第1张图片

TreeMap: 红黑树

JDK1.8 HashMap和TreeMap区别,读懂这一篇就够了_第2张图片

 

2. 因为数据结构,导致节点的实体类不一样

HashMap: 两种 Node 和 TreeNode (支持链表)

static class Node implements Map.Entry {
        final int hash;
        final K key;
        V value;
        Node next;
}

 

 static final class TreeNode extends LinkedHashMap.Entry {
        TreeNode parent;  // red-black tree links
        TreeNode left;
        TreeNode right;
        TreeNode prev;    // needed to unlink next upon deletion
        boolean red;
        TreeNode(int hash, K key, V val, Node next) {
            super(hash, key, val, next);
        }

 }

 

 

 

TreeMap: (只是红黑树,不支持链表操作)

static final class Entry implements Map.Entry {
        K key;
        V value;
        Entry left;
        Entry right;
        Entry parent;
        boolean color = BLACK;
}

 

3.数据范围

数据结构不一样,所以数据结构的范围,完全没有可比性

HashMap:

默认数组长度: 16

数组最大长度: 2^30

扩容因子: 0.75f

列表转红黑树阈值: 8

红黑树转列表阈值: 6

列表转红黑树最小数组长度: 64

TreeMap:

没发现有范围控制

 

4. 线程安全

都不是线程安全的

 

 

5. 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 extends AbstractMap
    implements Map, Cloneable, Serializable {

TreeMap:  (多实现 NavigableMap 接口)

public class TreeMap
    extends AbstractMap
    implements NavigableMap, Cloneable, java.io.Serializable

 

7. 定位

HashMap:

      通过 hash 算法定位, 针对 hash 冲突的值, 采用列表和红黑树的方式存储, 一定条件下可以相互转换. 红黑树中, 如果 hash 值一样,是通过 key 的 比较方法(可自定义)来计算红黑树所处的位置. 比如 String 类型的Key 是通过 String 类里的 compareTo 方法,直接返回 第一个不同字符的差值.来进行红黑树定位.

TreeMap:

红黑树存储结构, 通过自定义 key 比较器或者默认的比较算法来进行定位红黑树节点的存储位置.
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(JAVA)