面试----集合篇

121 阅读5分钟

数组

查找操作的复杂度

image.png

删除操作的复杂度

image.png

ArrayList

image.png

源码分析

成员变量

image.png

构造方法

第一次添加数据

image.png

添加和扩容操作

调用add方法(这里的size初始为0,因为还没开始扩容),会先调用一个确保数组内部容量的方法,在确保的方法中又调用一个计算容量大小的方法,由于一开始的list声明是用默认构造方法构造的,所以elementData是DEFAULT..,符合计算容量方法的第一个if分支,直接返回一个默认大小10

然后调用扩容方法ensureExplicitCapacity,此时的参数为10,符合if分支,所以执行实际的扩容方法,扩容操作里,由于是第一次添加数据,所以一开始是大小是从0扩容到10.根据计算可以得到newCapacity为10,并且后面还有一部分判断最大容量的逻辑(主要用于完善),最后拷贝一下数组,从而真正的扩容到10

最后将添加的数据存入数组

至于第二次添加数据的扩容操作,可以继续往下看

image.png

第二至十次添加数据

第十次添加数据时size为9(表示ArrayList里已经有9个元素了),此时要添加第十个元素,则size+1=10.根据调用逻辑,发现第十次时仍然不需要扩容,因此第二至十次添加数据是不需要扩容的

image.png

第十一次添加数据

第十一次添加数据,size=10,此后的各种逻辑判断出需要扩容,且扩容到1.5倍即容量为15,此后若是第十六次添加数据,还是扩容到1.5倍

image.png

相关问答

image.png

image.png

如何实现数组和List之间的转换

image.png

asList底层并不涉及创建对象,而是涉及对象的引用,指向的是同一个数组

image.png

toArray底层是拷贝了一个新的数组elementData

image.png

链表

单向链表

image.png

image.png

双向链表

image.png

LinkedList

ArrayList和LinkedList的区别是什么

image.png

image.png

二叉树

概念

image.png

实现方式

image.png

分类:满二叉树、完全二叉树、二叉搜索树、红黑树等

二叉搜索树

image.png

复杂度分析,n为每一行的节点数量,每一行的查找次数为logn

image.png

极端情况 image.png

红黑树

image.png

复杂度

image.png

散列表

image.png

散列冲突

image.png

复杂度

image.png

image.png

image.png

如果使用大量不存在的key,则会导致链表长度过长,这种方式称为DDos攻击,解决方案是使用红黑树

HashMap

HashMap的实现原理

image.png

jdk1.7和jdk1.8的区别

image.png

HashMap1.7 头插法造成死循环的原因

【图解】HashMap1.7 头插法造成死循环的原因_hashmap头插法死循环图解-CSDN博客

了解的哈希冲突解决方法有哪些

image.png

HashMap的put方法具体流程

HashMap常见属性

image.png

Node数组为真正存储数据的数组,其中hash属性用于计算数据在数组中的索引位置,next用于连接链表或者红黑树

image.png

构造方法,构造时默认加载因子为0.75,且未初始化数组

put添加数据流程

image.png

image.png

image.png

image.png

HashMap的put(key,val)和get(key)过程

image.png

hashmap 调用get方法一定安全吗

image.png

HashMap的扩容机制

image.png

image.png

扩容时为什么可以拆分链表

image.png

image.png

HashMap的寻址算法

二次哈希

image.png

当使用的数组足够随机时,key在hashmap的底层数组中分布是均匀的,而如果使用的数组不够随机,key的分布则是不均匀的,甚至如上面所示很极端

image.png

解决方法是使用二次哈希(扰动算法):通过移位和异或使hash分布均匀

image.png

image.png

同时添加数据的真正方法使putVal,其中使用与运算代替取模的性能更好,但数组长度必须是2的n次

HashMap在1.7情况下多线程死循环的问题

这个问题再深入了解一下

image.png

image.png

数组与集合区别,用过哪些

image.png

说说Java中的集合

image.png

Java中的线程安全的集合是什么

image.png

image.png

Collections和Collection的区别

image.png

集合遍历的方法有哪些

image.png

image.png

讲一下java里面list的几种实现,几种实现有什么不同

image.png

Arraylist和LinkedList的区别,哪个集合是线程安全的

image.png

ArrayList线程安全吗?把ArrayList变成线程安全有哪些方法

image.png

为什么ArrayList不是线程安全的,具体来说是哪里不安全

image.png

image.png

ArrayList 和 LinkedList 的应用场景

image.png

CopyonWriteArraylist是如何实现线程安全的

image.png

image.png

HashMap是线程安全的吗

image.png

HashMap一般用什么做Key?为啥String适合做Key呢

image.png

为什么HashMap要用红黑树而不是平衡二叉树

image.png

hashmap key可以为null吗

image.png

重写HashMap的equal和hashcode方法需要注意什么

image.png

重写HashMap的equal方法不当会出现什么问题

image.png

列举HashMap在多线程下可能会出现的问题

image.png

HashMap的大小为什么是2的n次方大小呢

image.png TODO

说说hashmap的负载因子

image.png

Hashmap和Hashtable有什么不一样的?Hashmap一般怎么用

image.png

ConcurrentHashMap怎么实现的

image.png

image.png

分段锁怎么加锁的,分段锁是可重入的吗

image.png

JDK 1.7 ConcurrentHashMap中的分段锁是 用了 ReentrantLock,是一个可重入的锁。

已经用了synchronized,为什么还要用CAS呢

image.png

ConcurrentHashMap用了悲观锁还是乐观锁

image.png

HashTable 底层实现原理是什么

image.png

HashTable线程安全是怎么实现的

image.png

image.png

hashtable 和concurrentHashMap有什么区别

image.png

说一下HashMap和Hashtable、ConcurrentMap的区别

image.png

Set集合有什么特点?如何实现key无重复的

image.png

有序的Set是什么?记录插入顺序的集合是什么

image.png