ArratsList实现原理(面试必背)

ArratsList

ArrayList 是 Java 中的一个动态数组类,它实现了 List 接口。主要是通过一个数组来保存元素,并提供了一系列方法来对数组进行操作,日常开发使用非常频繁。

实现原理:

ArrayList 底层使用一个 Object 类型的数组 elementData 来存储元素。
在这里插入图片描述

扩容机制:

当创建 ArrayList 对象时,未指定长度时,默认会创建一个长度为 10 的 elementData 数组,当添加元素时,如果 elementData 数组已满,则会进行扩容。扩容时,会创建一个新的数组,将原有元素复制到新数组中,并将新元素添加到新数组的末尾。扩容的数组是原先的1.5倍。如果一次添加多个元素,并且扩容1.5倍仍然放不下,则会创建一个新的数组,数组的长度以实际为准。

在这里插入图片描述

jdk1.8的扩容算法:newCapacity = oldCapacity + ( oldCapacity >> 1 ) ;
// oldCapacity >> 2 移位运算,此处相当于oldCapacity除以2,但是 >> 这种写法更加高效

jdk1.6的扩容算法:newCapacity = ( oldCapacity * 3 ) / 2 +1 ;
参数介绍:newCapacity 是扩容后的容量大小,oldCapacity 是扩容前的大小

查看jdk源码时,需要学习下移位运算java各运算符号详解

性能表现:

底层由数组实现,在进行查询时,可直接使用下标获取数据,适合根据索引查询数据,或者数据量不是很大时

System.out.println(list.get(2));

在这里插入图片描述

但是也是由于下标的问题,在插入和删除数据时可能会导致数组的扩容和移动操作,因此在频繁进行插入和删除操作时,性能可能会受到影响,不适合数据量大的同时,又要频繁的进行增删操作的场景

在这里插入图片描述

线程安全问题:

ArrayList不是线程安全的,在多线程环境下使用时,需要进行额外的同步处理。

总结

1.ArratsList是有序可重复,可存储null的
2.底层由数组实现的集合,具有数组特性(比如下标,因此在查询检索以及顺序添加时非常方便,而删除与插入时,可能会去复制整个集合的数据,所有很慢)
3.在初始化一个集合时,未指定长度则会采用延迟分配方式,第一次添加数据时默认长度为10,随后每次扩容为原集合的1.5倍
4.线程不安全


下一篇 >>>>> LinkedList实现原理 (面试必背)

That’s it;

渐行渐远渐无书,且听且看且从容。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值