HashMap面试题

1、JDK1.7与JDK1.8HashMap有什么区别和联系

区别:
JDK1.7下:
1)底层所采用的是数组加链表的结构
2)采用头插法
3)扩容方式:直接用其hash值和需要扩容的二进制数进行&(这里的扩容时必须是2的幂次方,因为只有这样其二进制的最后一位才会是1,用来减少哈希冲突),(hash&table.length-1),另其是在插入后进行扩容
4)会先对数组进行初始化,然后进行put
JDK1.8下:
1)底层采用的是数组+链表+红黑树,当链表长度大于8并且数组长度大于64时,会形成红黑树。
红黑树的特点:
每个节点只有两种颜色,红色或是黑色,根节点必须为黑
每个叶子结点都是黑色的空结点
从根结点到叶子结点时不能出现两个连续的红色结点
从任意结点出发,到它下边的子结点的路径包=包含的黑色结点数目相同
2)采用尾插法,原因是在JDK1.7时单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题,而1.8下的尾插法可以解决这个问题
3)扩容方式:计算hash的方法yuJDK1.7有所不同,另其是在插入前进行扩容
4)会先进行put方法,如哦没有初始化,则在put方法内进行初始化

2.说说HashMap的结构(底层数据结构 + put方法描述)

HashMap的底层是由数组+链表+红黑树。
数组在给定下标的查找的时间复杂度为O(1),增添、删除的时间复杂度为O(n)。链表的查找的时间复杂度为O(n),增添删除的时间复杂度为O(1)。哈希表在没有哈希冲突的情况下的查找、增添、删除的时间复杂度为O(1)。
HashMap的主体是一个Entry数组,主干数组的长度一定为2的幂次方。
对于HashMap中的put方法来说,首先可以得到一个index,判断table[index]是否为空,为空则new一个Node放进去,如果不为空则判断其的key值与所要添加的key值是否相同,如果相同则新值替换旧值,如果不同则判断其是否为TreeNode,如果是则进行红黑树的添加,如果不是则进行链表的遍历,比较其key值,如果key值相同则新值覆盖旧值,如果key不同则new一个Node利用尾插法插入链表中,最后判断其长度是否大于8,大于转化为红黑树,不大于则比较++size和threshold的值,如果size>threshold,则需要扩容。
在这里插入图片描述

3.说说HashMap的扩容过程

HashMap只有在内部数组无法装载更多对象时,即size>threshold时需要对数组进行二倍扩容。
对原数组中的数据进行重新rehash。
rehash的结果,该值在原数组和新数组的位置相同或该值在新数组中的位置等于该值在原数组中的位置加上原数组的长度。

4.HashMap中可以使用自定义类型作为其key和value吗?

可以
如果是自定义的比较器时需要重写equals()方法和hashCode()方法。

5.HashMap中table.length为什么需要是2的幂次方

例如:给定值为8,在数组长度为4的表中
hash&length-1
0000 1000 & 0000 0011 =0000 0000 index=0
hash&length
0000 1000 & 0000 0100 =0000 0000 index=0
给定值为4
hash&length-1
0000 0100 &0000 0011 =0000 0100 index=4
hash&length
0000 0100 &0000 0100 =0000 0100 index

6.HashMap与HashTable的区别和联系?

  • 相同点:
    都实现了Map接口,保存了Key-Value(键值对)
  • 不同点:
    1.HashMap继承AbstractMap类,而HashTable继承Dictionary类。
    2.HashMap是线程不安全的,是非Synchronize(同步)的,而HashTable是线程安全的,是Synchronize的。
    3.HashTable中key和value都不允许为null,HashMap中空值可以作为Key,也可以有一个/多个Key的值为空值。
    4.HashMap的hash数组默认长度大小为16,扩容方式为2的指数,HashTable的hash数组默认长度大小为11,扩容方式为两倍加一。

7.HashMap与WeakHashMap的区别和联系?

相同点:
1)HashMap和WeakHashMap都继承AbstractMap
2)HashMap和WeakHashMap都实现了Map接口
3)HashMap和WeakHashMap都保存了key-value键值对
4)HashMap和WeakHashMap一般用于单线程中,是非线程安全的
5)HashMap和WeakHashMap最多只允许一条key为Null,允许多条value为Null
6)HashMap和WeakHashMap添加、删除操作时间复杂度都是O(1)。
7)HashMap和WeakHashMap都是非Synchronize(同步)的
不同点:
1)HashMap的键是"强键",weakHashMap中的键是"弱键"(当弱键被垃圾回收GC回收时,其对应的键值也会从WeakHashMap中删除)
2)

8.HashMap和LinkedHashMap的区别与联系?

相同点:
1)HashMap和LinkedHashMap添加、删除操作时间复杂度都是O(1)
2)HashMap和LinkedHashMap最多只允许一条key为Null,允许多条value为Null
不同点:
1)HashMap继承AbstractMap,LinkedHashMap继承HashMap
2)HashMap基于Key-Value的散列表,LinkedHashMap是基于双向链表散列
3)HashMap在遍历时是无序的,LinkedHashMap遍历时按照插入的顺序或者访问的顺序进行遍历

9.HashMap和TreeMap的区别与联系?

相同点:
1)HashMap(JDK1.8下)和TreeMap都是基于数组加链表实现的
2)HashMap和TreeMap都是非线程安全的
不同点:
1)HashMap继承于抽象类AbstractMap,并且实现Map接口,TreeMap实现SortedMap接口
2)HashMap遍历时,取得的数据完全是随机的,TreeMap默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的
3)HashMap添加、删除操作时间复杂度都是O(1),TreeMap添加、删除操作时间复杂度都是O(log(n))
4)HashMap最多只允许一条key为Null,允许多条value为Null,TreeMap只允许value为Null,key不能为Null

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值