JAVA:List的基础知识以及常见函数

目录

一:基础知识

二:List的性质 

三:ArrayList

3.1ArrayList基础知识以及如何创建一个ArrayList

3.2 ArrayList的性质

3.3ArrayList的动态扩容机制

3.4 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.1ArrayList基础知识以及如何创建一个ArrayList

   ArrayList 是 Java 集合框架中的一个常用实现类,它的底层逻辑是通过数组实现的,它实现了 List 接口,提供了动态数组的功能。我们在创建一个List对象的时候,经常会写以下范式:

List list = new ArrayList();

        谁也没见过List list = new List();这种写法吧,这究竟是为什么呢?

        在 Java 中List 是一个接口(java.util.List,而不是一个具体的类。接口本身不能直接实例化为对象,因为它只是一组方法的声明,没有实际的方法实现。所以我们要想实现List,就要做一个向上造型,其中 ArrayListList 接口的子类。将 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 的扩容机制的详细介绍:

  1. 初始容量ArrayList 在创建时,通常会分配一个初始容量(例如10个元素),即使列表为空。这是为了避免在列表中只有一个元素时就立即进行扩容操作。

  2. 添加元素: 当你向 ArrayList 中添加元素时,它会首先检查当前元素的数量是否达到了底层数组的容量。如果当前元素数量达到了底层数组的容量,就需要扩容。

  3. 扩容策略ArrayList 使用以下扩容策略:

            当需要扩容时,它会创建一个新的更大容量的数组,而新数组的大小通常是当前容量的1.5倍(可以通过增量因子来调整,默认为1.5)。将当前数组中的所有元素复制到新数组中。新数组取代了旧数组成为 ArrayList 的底层数组。
  4. 性能分析: 扩容操作是 ArrayList 中一个相对昂贵的操作,因为它需要将所有元素从旧数组复制到新数组。通常情况下,扩容的成本是 O(n) 的,其中 n 是当前 ArrayList 的大小。

3.4 ArrayList的常用方法:

3.4.1 add(E element): 向列表尾部添加一个元素。

 3.4.2 :add(int index, E element): 在指定位置插入一个元素。list的下标从0开始,如果index超出索引范围则会报异常

3.4.3  get(int index): 返回指定索引位置的元素。

3.4.4  remove(int index): 移除指定索引位置的元素。

3.4.5  size(): 返回列表中元素的数量。

3.4.6  isEmpty(): 检查列表是否为空。

3.4.7      contains(Object element): 检查列表是否包含指定元素。

3.4.8  indexOf(Object element): 返回指定元素第一次出现的索引,如果不存在则返回 -1。

3.4.9  lastIndexOf(Object element): 返回指定元素最后一次出现的索引,如果不存在则返回 -1。

猜你喜欢

转载自blog.csdn.net/jialuosi/article/details/133272402
今日推荐