# Java基础知识面试题每日三道 追梦:第四天

122 阅读2分钟

1.说一下你理解的什么是HashMap?

特性:

储存的是键值对,线程不安全,非Synchronied,储存的比较快,能够接受null。 工作原理: Map的put(key,value)来储存元素,通过get(key)来得到value值,通过hash算法来计算hascode值,用hashCode标识Entry在bucket中存储的位置,储存结构就算哈希表。

2.hashMap与Hashtable区别?

2.1、继承的父类不同

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

2.2、线程安全性不同

Hashtable 线程安全:因为它每个方法中都加入了Synchronize,对整个table加锁

HashMap是线程不安全的:HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。

2.3、是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。 Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

2.4、key和value是否允许null值

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为nullHashtable中,key和value都不允许出现null值。

2.5、两个遍历方式的内部实现上不同

HashMap使用 Iterator。

Hashtable使用Iterator,还使用了Enumeration的方式 。 2.6、hash值不同 HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

2.7、内部实现使用的数组初始化和扩容方式不同

HashTable初始默认容量为11,Hashtable不要求 底层数组的容量一定要为2的整数次幂, Hashtable扩容时,将容量变为原来的2倍加1,

而HashMap初始默认容量为为16,而HashMap则要求一定为2的整数次幂,而HashMap扩容时,将容量变为原来的2倍。

3.HashMap的(底层数据结构)?

在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用[链表]处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低。

而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8),时,将链表转换为[红黑树],这样大大减少了查找时间。

Ps:今天的三道题已经结束了,欣赏一下吧。

B0283279D50E602090A692B5C0BEACB4.jpg