HashMap和HashTable区别

1 HashMap底层原理

HashMap是无序的,底层是hash表(数组+单项链表+红黑树)

LinkedHashMap是由有序的;数组+双向链表

Hash表在jdk8前是数组+链表,数组+链表+红黑树

HashMap有加载因子0.75,默认长度为16,自动桶数(数组大小)一倍扩容(超过12扩容,小于8恢复)

链表长度大于8从链表到红黑树,小于8从红黑树到链表

2 HashTable底层原理

底层:hash表结构(数组+链表),使用无参构造创建对象时,默认长度11的数组,加载因子0.75,Hashtable<Object, Object> hashtable = new Hashtable<>();

3 HashMapHashTable区别

1) HashMap是非线程安全的,在多线程环境下,HashMap会产生线程安全问题;而HashTable中的大部分方法都使用synchronized关键字来确保线程同步,因此HashTable是线程安全的,不过性能比HashMap低些。

2) HashMap继承了AbstractMap,HashTable继承了Dictionary抽象类,两者都实现了Map接口

3) HashMap的初始容量为16,HashTable的初始容量为11

4) HashMap扩容机制为扩容两倍,而HashTable扩容机制为两倍-1

5) HashTable不会转换红黑树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HashMapHashtable 都是用于存储键值对的数据结构,它们在功能上非常相似,但也存在一些区别。 1. 线程安全性:Hashtable 是线程安全的,即多个线程可以同时访问一个 Hashtable 实例而不需要额外的同步措施。而 HashMap 不是线程安全的,如果多个线程同时访问一个 HashMap 实例,可能会导致数据不一致的问题。如果需要在多线程环境下使用,可以考虑使用 ConcurrentHashMap。 2. null 键和 null 值:Hashtable 不允许键或值为 null,如果尝试将 null 键或 null 值放入 Hashtable 中,会抛出 NullPointerException。而 HashMap 允许键和值为 null,可以正常存储和获取 null 值。 3. 继承关系:Hashtable 是 Dictionary 类的子类,而 HashMap 是 AbstractMap 类的子类。由于继承关系的不同,导致它们在实现上有一些差异。 4. 迭代顺序:HashMap 不保证迭代顺序,即遍历 HashMap 的键值对时,不一定按照插入顺序或者其他顺序进行遍历。而 Hashtable 的迭代顺序是按照插入顺序进行的。 5. 性能:由于 Hashtable 是线程安全的,它在多线程环境下的性能可能会受到一定影响。而 HashMap 在单线程环境下的性能通常会更好。 总的来说,如果在单线程环境下使用,并且需要允许键或值为 null,可以优先选择使用 HashMap。如果在多线程环境下使用,或者需要保证迭代顺序,可以考虑使用 Hashtable

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值