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;
渐行渐远渐无书,且听且看且从容。