1. List,Set,Map的区别
List是有序可重复的
Set是无序不可重复的
Map是通过键值对来操作元素的key是无序不可重复的,value是无序可重复的
2. ArrayList和LinkedList的区别是什么?
ArrayList底层通过动态数组实现的LinkedList底层通过双向链表实现的
ArrayList支持快速随机访问。
ArrayList在查找的效率更高时间复杂度为O(1)
LinkedList在增删的效率更高时间复杂度为O(1)
3.ArrayList的扩容机制
ArrayList初始大小为10每次扩容是之前的1.5倍。当需要扩容时就会创建一个新数组这个新数组就是旧数组的1.5倍然后将旧数组中的元素复制到新数组中。
4. ArrayList和Vector的区别是什么?
ArrayList是非线程安全的Vector是线程安全的通过同步锁来实现线程安全的
ArrayList默认扩容是之前的1.5倍Vector默认扩容2倍
5.HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现?
HashMap在1.7是通过数组+链表来实现的,在1.8的时候使用数组+链表+红黑树来实现的
在1.7的时候采用头插法,在1.8的时候采用尾插法。
6. 为啥要使用红黑树
主要为了降低哈希冲突和解决链表过长的效率问题。红黑树有自平衡性能保证插入和删除保证O(logn)的时间复杂度
7.说一下 HashMap 的实现原理
HashMap在jdk1.7通过数组+链表实现的在jdk1.8使用数组+链表+红黑树实现的,当链表长度大于8数组长度小于64链表就会转为红黑树,当红黑树节点小于8j就会转为链表。
HashMap初始容量为16每次扩容都是之前的2次幂。
8.为啥HashMap每次扩容都是之前的二次幂
HashMap的key通过哈希值来确定位置的他里面用的(length-1)&hash值来替代%操作提高性能
9. HashMap的put方法的具体流程?
首先会确定数组是否为空,若为空就进行初始化大小为16的数组若不为空通过key计算hash值根据hash值计算数组下标,然后判断该数组下标是否有值,如果有值判断key是否相等相等的话进行覆盖,不相等的话判断当前节点是否为红黑树,如果为红黑树转为红黑树节点直接插入,如果为链表遍历链表判断key是否有相等的有的话就直接覆盖没有则在链表尾部插入当链表长度大于8并且数组长度大于64就会转为红黑树。
10.HashMap的扩容操作是怎么实现的?
首先会创建一个新数组是之前的两倍
遍历旧数组中的每个链表和红黑树
如果是链表则重新计算链表中每个元素的下标并放到新数组中
如果是红黑树则先遍历红黑树并计算每个红黑树的节点对应的数组下标的位置然后放到新数组中。
统计数组中的每个位置的元素个数
如果元素个数大于8就会转为红黑树将红黑树的根节点插入到当前位置
如果元素个数小于8就会转为链表将链表插入到当前位置