底层是链表 。
数组天然支持随机访问 , 时间复杂度为 O(1) , 所以称为快速随机访问 。 链表需要遍历到特定位置才能访问特定位置的元素 , 时间复杂度为 O(n) , 所以不支持快速随机访问 。
ArrayList 实现了 RandomAccess 接口 , 就表明了他具有快速随机访问功能 。RandomAccess接口只是标识 , 并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的!
4.说一说Vector 和 ArrayList 的区别?他们两个都实现了 List 接口 。 底层数据结构都是数组 。
不同的是:
- vector通过
remove、add等方法加上synchronized关键字实现线程同步 , 所以是线程安全的 。 而ArrayLis是线程不安全的
- 由于vector使用了
synchronized进行加锁 , 所以性能不如ArrayList
- Vector 扩容时 , 如果未指定扩容递增值
capacityIncrement, 或该值不大于 0 时 , 每次扩容为原来的2倍 , 否则扩容量为capacityIncrement的值 。 ArrayList每次扩容为旧容量的1.5倍
- 当使用add方法的时候首先调用
ensureCapacityInternal方法 , 传入size+1进去 , 检查是否需要扩容
- 如果空数组
DEFAULTCAPACITY_EMPTY_ELEMENTDATA, 就初始化为默认大小10 , 获取“默认的容量”和要扩容的大小两者之间的最大值
- 和当前数组长度比较 , 如果
if (minCapacity - elementData.length > 0)执行grow扩容方法
- 将数组扩容为原来的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
- 检查新容量是否大于最小需要容量 , 若还是小于最小需要容量 , 那么就把最小需要容量当作数组的新容量
- 再检查新容量newCapacity 是否超出了ArrayList所定义的最大容量 , 若超出了 , 则调用
hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE , 如果minCapacity大于MAX_ARRAY_SIZE , 则新容量则为Interger.MAX_VALUE , 否则 , 新容量大小则为 MAX_ARRAY_SIZE(MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8)
- ArrayList 中copy数组的核心就是
System.arraycopy方法 , 将original数组的所有数据复制到copy数组中 , 这是一个本地方法
- Array可以容纳基本类型和对象 , 而ArrayList只能容纳对象
- Array是指定大小的 , ArrayList 的容量是根据需求自动扩展
- ArrayList提供了更多的方法和特性 , 比如:addAll() , removeAll() , iterator()等等
7.遍历一个List有哪些不同的方式?先说一下常见的元素在内存中的存储方式 , 主要有两种:
- 顺序存储 (Random Access):相邻的数据元素在内存中的位置也是相邻的 , 可以根据元素的位置读取元素 。
- 链式存储 (Sequential Access):每个数据元素包含它下一个元素的内存地址 , 在内存中不要求相邻 。 例如LinkedList 。
for
Iterator
foreach
代码如下:
public class TestLinkedList {
public static void main(String[
args) {
List<String> list = new ArrayList<>();
- meta|促进更逼真AR/VR体验,Meta正在开发全新空间音频工具
- 创业|八成互联网电视非法采集用户数据, 彩电企业怎么办?
- 肺炎患者|为何新冠患者已退烧,还需进行集中治疗
- 无人驾驶|189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 微信|微信官宣:新增2大重要新功能,1个好评如潮,1个遭网友集体吐槽
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- Java|Gamamobi CEO黄继德:我们的元宇宙游戏不担心体验落差
