欢迎关注WX公众号:“程序猿补课班”,分享Java相关技术知识,学习经验,面试经验等。小伙伴快来补课吧!
正文开始
1.说说常见的集合有哪些吧?
- Collection接口的子接口包括:Set接口和List接口
- Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap等
- Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
- List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
2.List 和 Set,Map 的区别 ?
| List | Set | Map |
|---|---|---|
| 允许重复元素 | 不能存放重复元素 | 键值对存储,键必须惟一,值能够重复 |
| 能够插入多个null元素 | 只可以一个null元素 | 键只可以一个null,值能够有多个null |
| 有序 | 无序 | 无序 |
3.HashSet和TreeSet有什么区别?
| HashSet | TreeSet |
|---|---|
| 底层是由哈希表实现的 | 底层是由红黑树实现 |
| 元素没有顺序 | 元素有顺序性 |
4.Arraylist与LinkedList 区别 ?
| Arraylist | LinkedList |
|---|---|
| 基于动态数组的数据结构 | 基于链表的数据结构 |
| 查询快 | 更新快 |
5.说一说 HashMap 底层数据结构?
HashMap 底层是 数组 + 链表 + 红黑树 的数据结构。
6.HashMap中PUT方法的流程?
- 通过key计算出一个hashcode
- 通过hashcode与“与操作”计算出一个数组下标
- 在把put进来的key,value封装为一个entry对象
- 判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
- 如果该下标对应的位置不为空,则需要把entry插入到链表中
- 并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
- 如果是JDK7,则使用头插法
- 如果是JDK8,则会遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中
7.什么是哈希冲突?
当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)
8.hash 冲突时怎么办?
- hash 冲突指定是 key 值的 hashcode 计算相同,但 key 值不同的情况。
- 如果桶中的元素原本只有一个或已经是链表了,新增元素直接追加到链表尾部;
- 如果桶中元素已经是链表,并且链表个数大于等于 8 时,此时有两种情况:
- 如果数组大小小于 64,数组再次扩容,链表不会转化为红黑树;
- 如果数组大小大于 64 时,链表就会转化为红黑树。
- 这里不仅仅判断了链表元素个数大于等于 8,还判断了数组大小,数组容量小于 64 没有立即转化的原因,猜测主要是因为红黑树占用的空间比链表大很多,转化也比较耗时,所以数组容量小的情况下冲突严重,我们可以先尝试扩容,看看能否通过扩容来解决冲突的问题。
9.HashMap是怎么解决哈希冲突的?
开放定址法、链地址法(拉链法)、再哈希法、建立公共溢出区等方法 参考:
10.HashSet是如何保证数据不可重复的?
由于HashMap的K值本身就不允许重复,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V,那么在HashSet中执行这一句话始终会返回一个false,导致插入失败,这样就保证了数据的不可重复性;