目录
3.1ArrayList基础知识以及如何创建一个ArrayList
一:基础知识
在Java中,List
是一个接口,它代表了一个有序的集合,允许存储重复的元素。List
接口继承自Collection
接口,因此具有Collection
接口的所有方法,同时还提供了一些额外的方法来处理有序集合中的元素。
java.util.Collection
接口是 Java 集合框架的根接口之一,它定义了一组通用的方法,用于操作集合中的元素。Collection
接口是 Java 集合框架中所有集合类的共同父接口。
二:List的性质
2.1.有序性:List
中的元素按照它们被插入的顺序来维护,可以通过索引访问元素。这意味着你可以按照特定的顺序获取、插入、删除或替换元素。
2.2可重复性:与Set
不同,List
允许存储重复的元素。这意味着可以在List
中多次添加相同的元素。
2.3可变性: List
是可变的,可以动态地添加、删除和修改元素的大小和内容。
三:ArrayList
3.1
ArrayList基础知识以及如何创建一个ArrayList
ArrayList
是 Java 集合框架中的一个常用实现类,它的底层逻辑是通过数组实现的,它实现了 List
接口,提供了动态数组的功能。我们在创建一个List对象的时候,经常会写以下范式:
List list = new ArrayList();
谁也没见过List list = new List();这种写法吧,这究竟是为什么呢?
在 Java 中,List
是一个接口(java.util.List
),而不是一个具体的类。接口本身不能直接实例化为对象,因为它只是一组方法的声明,没有实际的方法实现。所以我们要想实现List,就要做一个向上造型,其中 ArrayList
是 List
接口的子类。将 ArrayList
类的对象赋值给 List
接口的引用,这是一种向上造型操作。这允许各位程序员使用 List
接口的方法来操作 ArrayList
对象,因为 ArrayList
实现了 List
接口,所以它是 List
接口的一个实例。
3.2 ArrayList的性质
3.2.1 动态数组:
ArrayList
是基于动态数组实现的,它允许存储和操作一个可变数量的元素。数组的容量会自动增长或减少,以适应元素的添加和删除操作,因此无需手动管理数组的大小。3.2.2 有序性:
ArrayList
是有序集合,它以元素插入的顺序来维护元素的顺序。这意味着可以按照添加元素的顺序来访问和遍历元素。3.2.3 允许重复元素:
ArrayList
允许存储重复的元素,即同一个元素可以在列表中出现多次。3.2.4 随机访问: 由于
ArrayList
基于数组实现,因此它支持随机访问。可以通过索引来直接访问列表中的元素。3.2.5 线程不安全:
ArrayList
不是线程安全的,这意味着在多线程环境下,如果多个线程同时访问和修改同一个ArrayList
实例,可能会导致数据不一致或异常。如果需要在多线程环境中使用,可以考虑使用Collections.synchronizedList()
方法来获得一个线程安全的ArrayList
。3.2.6 性能: 由于
ArrayList
支持随机访问,因此对于需要频繁访问元素的场景非常高效。然而,在需要频繁插入或删除元素的情况下,性能可能较差,因为这涉及到数组元素的移动。3.2.7动态扩容: 当
ArrayList
内部数组的容量不足以容纳新元素时,它会自动扩展数组的大小,通常是当前容量的一半。这可以避免频繁的数组重新分配操作,提高了性能。
3.3ArrayList的动态扩容机制
ArrayList
的扩容机制是它内部实现动态数组的关键部分,它允许 ArrayList
在需要时自动增加底层数组的容量,以适应添加元素的需求,从而避免频繁的数组重新分配操作,提高性能。以下是 ArrayList
的扩容机制的详细介绍:
初始容量:
ArrayList
在创建时,通常会分配一个初始容量(例如10个元素),即使列表为空。这是为了避免在列表中只有一个元素时就立即进行扩容操作。添加元素: 当你向
ArrayList
中添加元素时,它会首先检查当前元素的数量是否达到了底层数组的容量。如果当前元素数量达到了底层数组的容量,就需要扩容。扩容策略:
当需要扩容时,它会创建一个新的更大容量的数组,而新数组的大小通常是当前容量的1.5倍(可以通过增量因子来调整,默认为1.5)。将当前数组中的所有元素复制到新数组中。新数组取代了旧数组成为ArrayList
使用以下扩容策略:ArrayList
的底层数组。性能分析: 扩容操作是
ArrayList
中一个相对昂贵的操作,因为它需要将所有元素从旧数组复制到新数组。通常情况下,扩容的成本是 O(n) 的,其中 n 是当前ArrayList
的大小。