Hashtable,HashMap,TreeMap 区别?

前言:

java为数据结构中的映射定义了一个接口java.Util.Map,而Hashtable、HashMap、TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键只能映射一个值。

HashMap

HashMap是一个最常用的Map,它根据键的HashCode值储存数据,根据键值可以直接获取到它的值,具有很快的访问速度。HashMap最多只允许一条记录的键值为null;但是允许多条记录的值为null。因为如果相同,新的key,value将覆盖掉旧的。HashMap不支持线程的同步,即任意时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。HashMap中的数组默认大小为16,扩容规则为之前容量的两倍。

Hashtable

首先讲一哈儿Hashtable为什么没有使用驼峰命名法。因为HashTable是JAVA早期提供的一个哈希表实现,那个时候还不支持驼峰命名,等支持的时候想重写它发现有很多第三方应用已经使用二楼Hashtable这个名字,要重写比较困难,所以一直就未改动,它和HashMap行为大致相同,主要区别在于Hashtable是线程安全的,而且不支持null键和值。Hashtable中的默认数组大小是11,扩容规则为:old*2+1(原数组大小的两倍加一)。

TreeMap

TreeMap是基于红黑树实现,元素有序且非线程安全的。
TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储键值对时,需要根据key对节点进行排序。

TreeMap的两种排序方式:

  • 自然排序: TreeMap的所有key必须实现Comparable接口,而且所有的可以应该是同一个类的对象,否则会抛出ClassCastException(类转换异常)。
  • 定制排序: 创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有的key进行排序。

LinkedHashMap

LinkedHashMap使用双向链表来维护键值对的次序(只考虑key的次序),该链表负责维护Map的迭代顺序,与插入顺序一致。

Hashtable,HashMap,TreeMap 区别?

  1. 父类不同,HashMap继承了AbstractMap,Hashtable继承Dictionary抽象类,两者均实现Map接口。
  2. Hashtable不允许有null值(键和值都不允许),HashMap允许一个null键和任意数量的null值,如果put多个null键,则会覆盖掉旧的键值对。
  3. Hashtable的方法是同步的,HashMap的方法不是同步的。这是主要区别。所以意味着:Hashtable线程安全,但是它效率较低;而HashMap不是线程安全的,它的效率较高。如果对于同步性和遗留代码的兼容性没有任何要求,建议使用HsahMap。因为在Hashtable的源码中,除构造函数外,它所有的public方法申明中都有synchronized关键字,而HashMap中没有。
  4. HashMap中containsValue(Object value)和Hashtable中的contains(Object value)功能相同。
  5. Hashtable中的数组默认大小为11,扩容规则为old*2+1。HashMap中的默认数组大小是16,而且一定是2的倍数。
  6. TreeMap主要用作排序,自然排序也可以自定义排序。

参考文章1:HashMap,HashTable,TreeMap区别和用法
参考文章2:Java集合中HashMap、TreeMap和HashTable区别是什么?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值