---
title: List面试问题
date: 2023-08-02 21:40
mdate: 2023-08-06 18:04:07
---
# List面试题

1. ArrayList 和 Array 的区别
ArrayList 底层是 Array，可以扩容，只能存引用数据类型，具有一些 API 方法

2. ArrayList 和 LinkedList 增删插元素及区别

都不是线程安全的
ArrayList 底层为数组，LinkedList 底层为双向链表
Array 在添加元素和删除元素和 LinkedList 受位置影响，Array 添加时 Array 在末尾时 O（1）在指定位置 i 插入时是 O (n), Linked 在头尾插入为 O（1）在位置 i 插入为 O（n）
ArrayList 支持随机快速访问
ArrayList 空间连续，在末尾会预留一定空间，Linked 每个元素比 Array 大

3. LinkedList 没有实现 randomSccess 接口，因为内存不连续性，只能通过指针访问，不支持随机快速访问

4. ArrayList 扩容机制[[ Set面试问题.md | Set面试问题 ]] 
首先如果是无参构造器就创建一个空的 object 数组，有参数的就构建一个对应长度的数组，每次扩容 1.5 倍，添加时会先检查当前的容量，如果不足就会先扩容，将当前的元素复制到一个扩容之后的数组，删除元素时会将当前元素之前的元素和之后的元素合成一个新的数组，并返回当前的值

删除元素时返回 true 或 false，删除下标的时候会返回当前下标对应的元素

与下表有关的操作都会检查下标是否越界

