hashmap和hashtable的区别

今天面了一个大厂的ai面试,奇了怪了,我投的明明是C++岗位怎么全是Java的问题。还把ai面试后面塞了测评,哪个天才想出来的,虽然是Java的但也记一下吧

HashMap和Hashtable都是Java中常用的存储键值对的集合类,它们都实现了Map接口,但二者之间存在一些显著的区别。

一、线程安全性

  • HashMap:是非线程安全的,即多个线程可以同时访问和修改HashMap,而无需担心线程安全问题。然而,这也意味着在并发环境下,如果不进行适当的同步处理,可能会导致数据不一致的问题。
  • Hashtable:是线程安全的,它通过内部方法上的synchronized关键字来保证线程同步。虽然这提供了线程安全性,但也导致了Hashtable在性能上相对HashMap有所降低。

二、对null值的支持

  • HashMap:允许使用null作为键(key)和值(value)。当使用null作为键时,该键值对总是存储在HashMap的内部数组的第一个位置。
  • Hashtable:不允许使用null作为键或值。如果尝试将null作为键或值添加到Hashtable中,将抛出NullPointerException。

三、继承关系与实现方式

  • HashMap:是AbstractMap类的子类,实现了Map接口。它的底层实现采用了数组加链表的哈希表结构,当链表长度超过一定阈值时,会转化为红黑树以提高查询效率。
  • Hashtable:除了实现Map接口外,还继承了Dictionary抽象类。它的底层实现与HashMap类似,也采用了数组加链表的哈希表结构。

四、初始容量与扩容机制

  • HashMap:默认的初始容量为16,当已用容量超过总容量乘以负载因子(默认为0.75)时,会进行扩容操作,扩容后的容量为当前容量的两倍。
  • Hashtable:默认的初始容量为11,当已用容量超过总容量乘以负载因子(默认为0.75)时,也会进行扩容操作,但扩容后的容量为当前容量加1后再乘以2。

五、遍历方式

  • HashMap:只支持Iterator遍历方式。
  • Hashtable:支持Iterator和Enumeration两种遍历方式。

六、哈希计算方法与性能

  • HashMap:在计算哈希值时,对key的hashCode进行了二次哈希处理,以获得更好的散列效果。这使得HashMap在性能上通常优于Hashtable,特别是在处理大量数据时。
  • Hashtable:直接使用key的hashCode对内部数组的长度进行取模运算来计算哈希值。这种计算方法相对简单,但在处理某些特定类型的数据时,可能会导致哈希冲突的增加。

七、其他特性

  • HashMap:不支持contains(Object value)方法,没有重写toString()方法。同时,它的迭代器是fail-fast的,即当其他线程修改了HashMap的结构时,迭代器会抛出ConcurrentModificationException异常。
  • Hashtable:支持contains(Object value)方法,并且重写了toString()方法。它的枚举器不是fail-fast的,即当其他线程修改了Hashtable的结构时,枚举器不会抛出异常。

综上所述,HashMap和Hashtable在线程安全性、对null值的支持、继承关系与实现方式、初始容量与扩容机制、遍历方式、哈希计算方法与性能以及其他特性等方面都存在显著的区别。在选择使用哪个类时,应根据具体的应用场景和需求进行权衡。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值