苏州网站关键词优化推广,蓝牙小程序开发教程,外贸网站建设智能建站,wordpress的安装界面本人今年参加了很多面试#xff0c;也有幸拿到了一些大厂的offer#xff0c;整理了众多面试资料#xff0c;后续还会分享众多面试资料#xff0c;感兴趣的朋友可收藏关注。由于时间有限#xff0c;只能每天整理一点#xff0c;分享一点儿#xff01; 现分享如下#xf…本人今年参加了很多面试也有幸拿到了一些大厂的offer整理了众多面试资料后续还会分享众多面试资料感兴趣的朋友可收藏关注。由于时间有限只能每天整理一点分享一点儿 现分享如下
1. HashMap原理
HashMap是非常频繁面试问的题目一定要好好理解最好是查看源码吃透它。
HashMap的底层实现是使用数组链表/红黑树。 HashMap内部维护了一个存储数据的Entry数组HashMap采用链表解决冲突每一个Entry本质上是一个单向链表。当准备添加一个key-value对时首先通过hash(key)方法计算hash值然后通过indexFor(hash,length)求该key-value对的存储位置计算方法是先用hash0x7FFFFFFF后再对length取模这就保证每一个key-value对都能存入HashMap中当计算出的位置相同时由于存入位置是一个链表则把这个key-value对插入链表头
在jdk1.8之后hashmap已经优化了hashmap的单链表当数据存储到8位之后内部采用红黑树结构来存储数据这样会比单链表更快。
2. 常考点
Q1Table的初始化 通过阅读源码可发现HashMap有四种构造方式 · 根据指定的initialCapaccity和loadFactor实例化一个空对象; · 通过指定的 initialCapacity 和 默认的 loadFactor(0.75) 实例化一个空的 HashMap 对象 · 通过默认的initialCapacty和模型的loadFactor(0.75)实例化一个空的HashMap · 通过指定的Map对象实例化一个HashMap对象
通过源码可以知道实例化的时候未进行table的初始化而什么时候初始化呢一般情况下在第一次对table进行put时调用resize方法时进行table的初始化。(这是一种懒加载思想)。一般情况下初始化table.length16, 阈值threadhold12当存放到第13个元素时进行扩容。threadholdcapacity*loadFactor
Q2: table的扩容方式 还是在调用resize()时进行扩容扩容的方式是当sizethreshold时进行扩容扩容之后的 table.length table.lenght2, threshold threshold2
Q3: Table的length为什么是2的n次幂 是为了能利用位运算来求 key 的下标而 h(length-1) 是为了充分利用 table 的空间并减少 key 的碰撞
Q4: Table的取模运算为什么是e.hash (capacity-1) 因为一般的取模运算是e.hash % capacity而e.hash (capacity-1) e.has%capacity
3. Hashmap和Hashtable的异同
1相同点 · 两者都是基于哈希表实现的每一个元素是一个key-value对内部通过单链表解决访问冲突容量不足时会自动增长。 · 两者都实现了序列化Serializable接口支持序列化实现了Cloneable接口可被克隆。
2不同点 · HashMap是非线程安全的Hashtable是线程安全的 · HashMap的key和value允许为null而HashTable不允许。