List源码会问哪些面试题
程序员文章站
2022-05-06 08:49:30
...
- 1.1 说说你对ArrayList的理解
先回答整体架构,再详细解释细节。例如 ArrayList底层是个数组,其API都做了一层对数组底层的封装,可以按照之前总结的来 - 1.2 扩容类问题
- 1.2.1 ArrayList无参构造器构造,add 一个值进去,此时数组的大小是多少,下一次扩容前可用大小是多少,扩容之后是多少
答:数组大小为1,下一次扩容前可用大小为10,扩容一半,为15 - 1.2.2 数组初始化,被加入一个值后,如果我使用addAll方法一下子加入15个值,那么数组最终是多少
答:扩容之后的值小于期望值的话,那么扩容的值就等于期望值16 - 1.2.3 有很大数组需要拷贝,原数组大小为5K,如何快速拷贝
答:新建数组的时候,指定数组大小,避免扩容 - 1.2.4 为什么说扩容会消耗性能
答:底层使用的是System.arraycopy方法 - 1.2.5 源码扩容过程有什么值得借鉴的地方
答:1.5倍的扩容速度,前期缓慢上升,后期增速较快。扩容有考虑溢出的意识
- 1.2.1 ArrayList无参构造器构造,add 一个值进去,此时数组的大小是多少,下一次扩容前可用大小是多少,扩容之后是多少
- 1.3 删除类问题
- 1.3.1 下面代码执行结果能把3删除干净么?
List<String> list = new ArrayList<String>() {{
add("2");
add("3");
add("3");
add("3");
add("4");
}};
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("3")) {
list.remove(i);
}
}
删不干净,删除的过程中i增长,元素前移,会错过,使用Iterator迭代器可以删
- 1.4 对比类问题
- 1.4.1 ArrayList和LinkedList有何不同
底层数据结构不同,是否扩容 - 1.4.2 ArrayList和LinkedList应用场景
根据底层结构,数组不适合新增,删除,链表适合新增和删除 - 1.4.3 ArrayList和LinkList有没有最大容量
ArrayList最大为Interger最大值,LinkList理论上可以无限大,但是大小使用的是int类型,所以也是Integer最大值,否则会溢出 - 1.4.4 ArrayList和LinkedList是如何对null值进行处理的
- 1.4.5 ArrayList和LinkedList是线程安全的吗
当两者是共享变量的时候,那么就是线程不安全的 - 1.4.6 如何解决线程安全问题
Collections#synchronizedList
- 1.4.1 ArrayList和LinkedList有何不同
上一篇: Java面试题
下一篇: JVM的Minor GC和Full GC
推荐阅读