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 要旧 |