前言
这是最近我通过观看并理解几个集合底层源码后得到的一些高概率面试题以及答案,很重要,建议熟记于心
提示:以下是本篇文章正文内容,下面案例可供参考
一、ArrayList集合底层部分
1、ArrayList 的底层初始化容量为 10
2、ArrayList的底层一维数组的最大长度为:Integer.MAX_VALUE -8; (21亿多-8)其中这个“-8”是用来存储数组的头部信息的
3、ArrayLIst的扩容机制, 为原长度的1.5倍。
二、LinkedList集合底层
1、注意Node节点类(这个不是太大可能性,需要的话可以在B站上看看关于Node节点类的知识,不难 很简单)
三、HashMap(非常重要的部分)
1、JDK1.7版本,HashMap的数据结构是什么?
答:单向链表+ 数组
2、HashMap中数组的默认初始化容量是多少?
答初始容量为(DEFAULT_INITIAL_CAPACITY,DEFAULT_LOAD_FACTOR)为16,必须是2的幂。
3、什么叫作Hash桶?
答:数组中的单向链表
4、HashMap的数组长度为什么必须是2的幂?
答:计算元素存在数组中下标的算法:hash值&数组长度-1,如果数组长度不是2的幂,减1过后而精致的某一位可能出现0,导致数组某个位置永远存不到数据
5、HashMap的默认负载因子是多少,作用是什么?
答:负载因子:0.75
作用:数组长度-负载因子=阈值(扩容条件)
6、HashMap的默认负载因子(loadFactor)为什么是 0.75?
答:取得了时间与空间的平衡。
假设负载因子过大,导入数组装满后才扩容,牺牲时间,利用空间。
假设负载因子过小,导致数组装载较少内容就扩容,牺牲空间,利用时间
7、HashMap数组最大长度是多少?为什么是这么多?
答:最大长度为:1<<30,因为数组长度必须是2的幂并且HashMap数组最大长度的变量为int类型为了不超出界限,所以1<<30
8、什么叫作Hash碰撞?
答:两个对象的hash值一样,导致在数组中的下标一样
9、HashMap何时扩容?
元素个数>=阈值,并且存入数据的位置不等于null
10、HashMap的扩容机制是什么?
答:是原来的2倍
11、HashMap存入null键的位置?
答:hash数组下标为0的位置。
12、什么叫作hash回环?
答:Hash回环(也称Hash死循环)出现原因:多线程下,线程1不断添加新的数据导致HashMap扩容(数据的迁移)
线程2:不断地遍历,因此在多线程下要避免这个问题。
13、JDK1.7版本与JDK1.8版本的HashMap的区别?
答:JDK1.7:数组+链表(头插法),通过散列算法获取hash值
JKD1.8:数组+链表+红黑树(尾插法),通过低16位^高16位让hash值更加散列
14、JDK1.8版本HashMap为什么添加红黑树的数据结构?
答:因为链表查询慢,红黑树查询快
15、JDK1.8版本什么时候由 数组+链表变成数组+红黑树
答:当链表长度>8的时候并且数组长度>64,从数组+链表变成数组+红黑树
16、JDK1.8版本为什么链表长度大于8时,变成数组+链表+红黑树
答:因为泊松分布(统计概率学),当红黑树里的数据小于6时,又会将数组+红黑树变成数组+链表
总结
今天的内容为以上部分,后续如有补充我会按时添加进来