HashMap和HashTable区别

本文深入探讨了HashMap和HashTable的区别,包括版本、继承、实现方式、容量与扩容、对外接口、是否支持Null键值对及性能比较。重点强调了实际开发中选择使用HashMap的原因及其原理理解的重要性。

HashMap和HashTable区别:

HashMap最大的特点就是无序,原则上来讲并不存在下标的访问方式,只能通过Key来遍历。这也是为什么HashMap效率较高的原因。hash()函数(的算法效率很高)通过Key来查找元素。

hashMap的底层其实就是一个大的数组,Hash:哈希,散列表(就是乱的意思)。回答这个问题着重点记得在HashMap。
1.版本不同

HashMap:JDK1.2之后推出,是新的类。

HashTable:JDK1.0时推出,是旧的类。据说jdk1.8父类已被废除,用的自然少之又少。
两者作者可以忽略,感兴趣自行研究。代码略。自己去敲!

2.继承不同

public class HashMap  extends AbstractMap implements Map

public class Hashtable extends Dictionary implements Map

HashMap继承自AbstractMap类,而Hashtable继承自Dictionary类。但二者都实现了Map接口。

3.实现方式不同,HashMap非线程安全,HashTable线程安全

HashMap:采用异步处理方式,性能较高,非线程安全。允许设置NULL,null key和null value。

HashTable:采用同步的处理方式,性能较低,线程安全。


4.默认容量以及扩容大小不同

HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
HashMap扩容时是当前容量翻倍即:capacity * 2,Hashtable扩容时是容量翻倍+1即:capacity * 2+1

5.对外提供的接口不同

HashMap没有contains方法,但是包括containsValue和containsKey方法;

Hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。

Hashtable比HashMap多提供了elments() 和contains() 两个方法。

elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。

contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。

6.是否支持Null key 和Null value

Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;重复的话就相当于修改覆盖。

HashTable键值对都不能为空,否则包空指针异常。


4.总结

相同点:HashMap和Hashtable的底层实现都是数组+链表结构实现

再问深的话博主也没办法了,只能自行去研究源码和设计者的设计理念了。

不过,答上以上几点基本过关没问题,只要你条理清晰,别让面试官感觉你含糊其辞,半知半懂就行。

其实,博主一直在想为什么面试官那么喜欢问HashMap和HashTable的区别?他们想听到的答案到底是什么?

HashTable早就没多少人用了,为什么还有人关注?其实面试官真正想面试的就是你到底实际中用没用过HashMap,用的时候有没有想过为什么要用它,说白了就是用的时候思考过其原理没有,不要只停留在会用而是知其然知其所以然,考察的是你在实际开发中有没有举一反三的能力,以小见大。

一个简单的面试题能看出面试者工作中很多的东西。大家想过吗,好好思考一下,你会收获更多。

hashmap

线程不安全,异步

允许有null的键和值

效率稍高

方法不是Synchronize的要提供外同步

有containsvalue和containsKey方法

HashMap 是Java1.2 引进的Map interface 的一个实现

HashMap是Hashtable的轻量级实现

hashtable

线程安全,同步

不允许有null的键和值

效率稍低

方法是是Synchronize的

有contains方法方法

Hashtable 继承于Dictionary 类 是JAVA1.0引进的

Hashtable 比HashMap 要旧

 

HashMap Hashtable 都是用于存储键值对的数据结构,它们在功能上非常相似,但也存在一些区别。 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值