欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.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
相关标签: 每天一道面试题