Java HashMap、Hashtable、LinkedHashMap分析

  • Post author:
  • Post category:java


HashMap是基于哈希表来实现的,是结合了数组、链表、红黑树(1.8)来存储对象的。它线程不安全,适合在单线程中使用。

它的默认加载因子为0.75,默认数组大小是16,当数组的容量超过0.75,当前数组容量是<<1(相当于乘以2),扩大1倍,扩充次数过多,会影响性能,每次扩充表示哈希表重新散列(重新计算每个对象的储存位置),尽量避免扩充。

它的存储过程是:把key通过hash()方法计算hash值,然后通过这个hash值对数组长度取余(默认长度为16),这个取余后的值决定对象在数组中的位置,当数组中的这个位置有多个对象时,以链表的结构存储,JDK1.8后,数量大于8时,链表将转换为红黑树结构储存。这是为了取值更快。

Hashtable是基于哈希表来实现的,是结合了数组、链表来存储对象的。它线程安全,适合在多线程中使用。

它的默认加载因子为0.75,默认数组大小是11,当数组的容量超过0.75,当前数组容量是<<1后加1(相当于乘以2加1)。

LinkedHashMap是HashMap的子类,由于HashMap不能保证顺序恒久不变,所以使用了一个双重链表来维护元素添加的顺序
TreeMap是基于红黑树来存储对象的,可以排序和去重,以对象为key时要实现Comparabel或者与Comparator



版权声明:本文为danwufeiyang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。