likes
comments
collection
share

Java的ArrayList

作者站长头像
站长
· 阅读数 15

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。

Java的ArrayList

ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.ArrayList; // 引入 ArrayList 类

ArrayList<E> objectName =new ArrayList<>();  // 初始化
  • E : 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型
  • objectName :对象名。

ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

添加元素:ArrayList 类提供了很多有用的方法,添加元素到 ArrayList 可以使用 add() 方法

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites);
    }
}
// 实例执行输出结果为:
// [Google, Runoob, Taobao, Weibo]

访问元素访问 ArrayList 中的元素可以使用 get() 方法,数组的索引值从 0 开始。

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites.get(1));  // 访问第二个元素
    }
}
// 实例执行输出结果为:
// Runoob

修改元素:如果要修改 ArrayList 中的元素可以使用 set() 方法

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
        System.out.println(sites);
    }
}
// 实例执行输出结果为:
// [Google, Runoob, Wiki, Weibo]

删除元素:如果要删除 ArrayList 中的元素可以使用 remove() 方法

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        sites.remove(3); // 删除第四个元素
        System.out.println(sites);
    }
}
// 实例执行输出结果为:
// [Google, Runoob, Taobao]

计算大小:如果要计算 ArrayList 中的元素数量可以使用 size() 方法

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites.size());
    }
}
// 实例执行输出结果为:
// 4

迭代数组列表

可以使用 for 来迭代数组列表中的元素:

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        for (int i = 0; i < sites.size(); i++) {
            System.out.println(sites.get(i));
        }
    }
}
// 实例执行输出结果为:
// Google
// Runoob
// Taobao
// Weibo

可以使用 for-each 来迭代元素:

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        for (String i : sites) {
            System.out.println(i);
        }
    }
}
// 实例执行输出结果为:
// Google
// Runoob
// Taobao
// Weibo

其他的引用类型:ArrayList 中的元素实际上是对象,如果我们要存储基本类型,而 <E> 只能为引用数据类型,这时我们就需要使用到基本类型的包装类。

基本类型对应的包装类表如下:

基本类型引用类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

此外,BigInteger、BigDecimal 用于高精度的运算,BigInteger 支持任意精度的整数,也是引用类型,但它们没有相对应的基本类型

使用 ArrayList 存储数字(使用 Integer 类型):

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<Integer> myNumbers = new ArrayList<Integer>();
        myNumbers.add(10);
        myNumbers.add(15);
        myNumbers.add(20);
        myNumbers.add(25);
        for (int i : myNumbers) {
            System.out.println(i);
        }
    }
}
// 实例执行输出结果为:
// 10
// 15
// 20
// 25

ArrayList 排序:Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序。

例如对字母进行排序:

import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Taobao");
        sites.add("Wiki");
        sites.add("Runoob");
        sites.add("Weibo");
        sites.add("Google");
        Collections.sort(sites);  // 字母排序
        for (String i : sites) {
            System.out.println(i);
        }
    }
}
// 实例执行输出结果为:
// Google
// Runoob
// Taobao
// Weibo
// Wiki

例如对数字进行排序:

import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<Integer> myNumbers = new ArrayList<Integer>();
        myNumbers.add(33);
        myNumbers.add(15);
        myNumbers.add(20);
        myNumbers.add(34);
        myNumbers.add(8);
        myNumbers.add(12);

        Collections.sort(myNumbers);  // 数字排序

        for (int i : myNumbers) {
            System.out.println(i);
        }
    }
}
// 实例执行输出结果为:
// 8
// 12
// 15
// 20
// 33
// 34

改动排序方式为倒序:

Collections.sort(myNumbers, Comparator.reverseOrder());  // 数字倒序排序
// 实例执行输出结果为:
// 34
// 33
// 20
// 15
// 12
// 8

Java ArrayList 常用方法列表如下

方法描述
add()将元素插入到指定位置的 arrayList 中
addAll()添加集合中的所有元素到 arrayList 中
clear()删除 arrayList 中的所有元素
clone()复制一份 arrayList
contains()判断元素是否在 arrayList
get()通过索引值获取 arrayList 中的元素
indexOf()返回 arrayList 中元素的索引值
removeAll()删除存在于指定集合中的 arrayList 里的所有元素
remove()删除 arrayList 里的单个元素
size()返回 arrayList 里元素数量
isEmpty()判断 arrayList 是否为空
subList()截取部分 arrayList 的元素
set()替换 arrayList 中指定索引的元素
sort()对 arrayList 元素进行排序
toArray()将 arrayList 转换为数组
toString()将 arrayList 转换为字符串
ensureCapacity()设置指定容量大小的 arrayList
lastIndexOf()返回指定元素在 arrayList 中最后一次出现的位置
retainAll()保留 arrayList 中在指定集合中也存在的那些元素
containsAll()查看 arrayList 是否包含指定集合中的所有元素
trimToSize()将 arrayList 中的容量调整为数组中的元素个数
removeRange()删除 arrayList 中指定索引之间存在的元素
replaceAll()将给定的操作内容替换掉 arrayList 中每一个元素
removeIf()删除所有满足特定条件的 arrayList 元素
forEach()遍历 arraylist 中每一个元素并执行特定操作

方法实例:\color{red}{方法实例:}方法实例:

addAll() 方法实例

// 该方法有以下几种语法格式:
public boolean addAll(Collection<? extends E> c)
public boolean addAll(int index, Collection<? extends E> c)

描述

addAll() 方法将给定集合中的所有元素添加到 arraylist(ArrayList 类的一个对象) 中。

参数

  • index -- (可选参数)表示元素所插入处的索引值。如果 index 没有传入实际参数,元素将追加至数组的最末尾。
  • c -- 要插入的集合元素。

返回值

如果成功插入元素,返回 true。

注意

如果给定的集合为 null,则抛出 NullPointerException 异常。如果 index 超出范围,则抛出 IndexOutOfBoundsException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        ArrayList<String> languages1 = new ArrayList<>();
        languages1.add("Java");
        languages1.add("Python");
        System.out.println("ArrayList 1: " + languages1);

        // 创建另一个数组
        ArrayList<String> languages2 = new ArrayList<>();
        languages2.add("JavaScript");
        languages2.add("C");
        System.out.println("ArrayList 2: " + languages2);

        // 在索引值为1的位置将数组 languages1 的所有元素添加到 languages2
        languages2.addAll(1, languages1);
        System.out.println("更新 ArrayList 2: " + languages2);
    }
}

// 以上程序执行结果为:
// ArrayList 1: [Java, Python]
// ArrayList 2: [JavaScript, C]
// 更新 ArrayList 2: [JavaScript, Java, Python, C]

clear() 方法

public void clear()

描述

用于删除动态数组中的所有元素。clear() 方法的比 removeAll() 更常被用到,因为 clear() 比 removeAll() 更快,更高效。

参数

返回值

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        // 删除所有元素
        sites.clear();
        System.out.println("所有 clear() 方法后: " + sites);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// 所有 clear() 方法后: []

clone() 方法

public Object clone()

描述

用于拷贝一份动态数组,属于浅拷贝。

参数

返回值

返回 ArrayList 对象。

扩展

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存, 所以如果其中一个对象改变了这个地址,就会影响到另一个对象...

拷贝对应的就是深拷贝,深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

注意

clone() 方法并不 是ArrayList 类中特定的方法。任何继承了 CLonable 接口的类都能够使用 clone() 方法。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);


        // 输出 clone() 方法所返回的值
        System.out.println("clone() 返回值: " + sites.clone());
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// clone() 返回值: [Google, JueJin, Taobao]

contains() 方法

public boolean contains(Object o)

描述

用于判断元素是否在动态数组中。

参数

  • o -- 要检测的元素。

返回值

如果指定的元素存在于动态数组中,则返回 true。如果指定的元素不存在于动态数组中,则返回 false。

注意

该 contains() 方法内部其实使用 equals() 方法来查找元素。如果指定的元素与数组中的元素有匹配到,则该方法返回 true。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);


        // 检查 Runoob 是否在这个数组中
        System.out.println("Runoob 是否存在于 arraylist: " + sites.contains("JueJin"));
        // 检查 Weibo 是否在这个数组中
        System.out.println("Weibo 是否存在于 arraylist: " + sites.contains("Weibo"));
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// Runoob 是否存在于 arraylist: true
// Weibo 是否存在于 arraylist: false

get() 方法

public E get(int index)

描述

通过索引值获取动态数组中的元素。

参数

index -- 索引值。

返回值

返回动态数组中指定索引处的元素。

注意

如果 index 值超出了范围,则抛出 IndexOutOfBoundsException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);


        // 获取在索引值为1处的元素
        String element = sites.get(1);
        System.out.println("索引值为 1 的元素为: " + element);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// 索引值为 1 的元素为: JueJin

indexOf() 方法

public int indexOf(Object o)

描述

返回动态数组中元素的索引值。

参数

  • o -- 查找的元素。

返回值

从动态数组中返回指定元素的位置的索引值。如果 obj 元素在动态数组中重复出现,返回在数组中最先出现 obj 的元素索引值。如果动态数组中不存在指定的元素,则该 indexOf() 方法返回 -1。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);


        // 查找位置索引值为 Runoob 的元素
        int position1 = sites.indexOf("JueJin");
        System.out.println("JueJin 的索引位置: " + position1);

        // 查找位置索引值为 Weibo 的元素
        int position2 = sites.indexOf("Weibo");
        System.out.println("Weibo 的索引位置: " + position2);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// JueJin 的索引位置: 1
// Weibo 的索引位置: -1
public boolean removeAll(Collection<?> c)

描述

用于删除存在于指定集合中的动态数组元素。

参数

  • c -- 动态数组列表中要删除的元素集合。

返回值

如果从动态数组成功删除元素返回 true。

注意

如果动态数组中存在的元素类与指定 collection 的元素类不兼容,则抛出 ClassCastException 异常。

如果动态数组中包含 null 元素,并且指定 collection 不允许 null 元素,则抛出 NullPointerException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        ArrayList<String> delete = new ArrayList();
        delete.add("Google");
        delete.add("Taobao");
        System.out.println("要删除的网站列表: " + delete);

        // 删除所有元素
        sites.removeAll(delete);
        System.out.println("sites 调用 removeAll() 方法后: " + sites);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// 要删除的网站列表: [Google, Taobao]
// sites 调用 removeAll() 方法后: [JueJin]

remove() 方法

// 该方法有以下几种语法格式:
public E remove(int index) 
public boolean remove(Object o)

描述

用于删除动态数组里的单个元素。

参数

  • index -- 要删除元素索引值。如果 obj 元素出现多次,则删除在动态数组中最第一次出现的元素。
  • obj -- 要删除的元素。

返回值

如果传入的元素删除成功,则返回 true。

如果传入索引值,则返回删除的元素。

注意

如果指定的索引超出范围,则该方法将抛出 IndexOutOfBoundsException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        // 删除元素
        sites.remove("Google");
        System.out.println("sites 调用一次 remove() 方法后: " + sites);
        // 第一次删除元素后索引产生了变化,所以索引1移除的是 Taobao
        sites.remove(1);
        System.out.println("sites 再次调用 remove() 方法后: " + sites);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// sites 调用一次 remove() 方法后: [JueJin, Taobao]
// sites 再次调用 remove() 方法后: [JueJin]

size() 方法

public int size()

描述

用于返回动态数组中元素的数量。

参数

返回值

返回数组中元素的个数。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);


        // 得到数组中的元素个数
        int size = sites.size();
        System.out.println("动态数组长度: " + size);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao]
// 动态数组长度: 3

isEmpty() 方法

public boolean isEmpty()

描述

用于判断动态数组是否为空。

参数

返回值

如果数组中不存在任何元素,则返回 true。如果数组中存在元素,则返回 false。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        // 检查数组中是否含有元素
        boolean result = sites.isEmpty(); // true
        System.out.println("sites 是否为空? " + result);

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        // 检查该数组是否为空
        result = sites.isEmpty();  // false
        System.out.println("sites 是否为空? " + result);
    }
}

// 以上程序执行结果为:
// sites 是否为空? true
// 网站列表: [Google, JueJin, Taobao]
// sites 是否为空? false

subList() 方法

public List<E> subList(int fromIndex, int toIndex)

描述

用于截取并返回动态数组中的一部分。

参数

  • fromIndex -- 截取元素的起始位置,包含该索引位置元素。
  • toIndex -- 截取元素的结束位置,不包含该索引位置元素。

返回值

返回给定的动态数组截取的部分。

注意

如果fromIndex 小于 0 或大于数组的长度,则抛出 IndexOutOfBoundsException 的异常。

如果 fromIndex 大于 toIndex 的值则抛出 IllegalArgumentException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        sites.add("Wiki");
        System.out.println("网站列表: " + sites);

        // 元素位置为1到3
        System.out.println("SubList: " + sites.subList(1, 3));
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao, Wiki]
// SubList: [JueJin, Taobao]

set() 方法

public E set(int index, E element) 

描述

用于替换动态数组中指定索引的元素。

参数

  • index -- 索引位置。
  • element -- 将在 index 位置替换进去的新元素。

返回值

返回之前在 index 位置的元素 。

注意

如果 index 值超出范围,则抛出 IndexOutOfBoundsException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        // 索引 2 的元素被替换
        String element = sites.set(1, "JueJin");
        System.out.println("替换后: " + sites);
        System.out.println("被替换的元素: " + element);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, Runoob, Taobao]
// 替换后: [Google, JueJin, Taobao]
// 被替换的元素: Runoob

sort() 方法

public void sort(Comparator<? super E> c)

描述

根据指定的顺序对动态数组中的元素进行排序。

参数

  • c -- 顺序方式。

返回值

sort() 方法不返回任何值,它只是更改动态数组列表中元素的顺序。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<Integer> sites = new ArrayList<>();

        sites.add(-1);
        sites.add(3);
        sites.add(1);
        sites.add(2);
        sites.add(0);

        System.out.println("不排序时: " + sites);

        // 元素进行升序排列
        sites.sort(Comparator.naturalOrder());
        System.out.println("升序排序后: " + sites);

        // 元素进行降序排列
        sites.sort(Comparator.reverseOrder());
        System.out.println("降序排序后: " + sites);

    }
}

// 以上程序执行结果为:
// 不排序时: [-1, 3, 1, 2, 0]
// 升序排序后: [-1, 0, 1, 2, 3]
// 降序排序后: [3, 2, 1, 0, -1]

toArray() 方法

// 该方法有以下几种语法格式:
public Object[] toArray()
public <T> T[] toArray(T[] a) 

描述

将 Arraylist 对象转换为数组。

参数

  • T[] a -- (可选参数)用于存储数组元素的数组。

返回值

如果参数 T[] a 作为参数传入到方法,则返回 T 类型的数组。如果未传入参数,则返回 Object 类型的数组。

注意

传入数组参数的数组长度应该等于或者大于 arraylist(ArrayList 类的对象)。建议使用带参数的 toArray() 方法。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("JueJin");
        sites.add("Google");
        sites.add("Wiki");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        // 创建一个新的 String 类型的数组
        // 数组长度和 ArrayList 长度一样
        String[] arr = new String[sites.size()];

        // 将ArrayList对象转换成数组
        sites.toArray(arr);

        // 输出所有数组的元素
        System.out.print("Array: ");
        for(String item:arr) {
            System.out.print(item+", ");
        }
    }
}

// 以上程序执行结果为:
// 网站列表: [JueJin, Google, Wiki, Taobao]
// Array: JueJin, Google, Wiki, Taobao, 

toString() 方法

public String toString()

描述

将 Arraylist 对象转换为字符串。

参数

返回值

返回 arraylist(ArrayList 类的对象)的字符串表示形式。

注意

ArrayList 类没有它自己的 toString() 方法,它重写了 Object 类的 toString() 方法。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("JueJin");
        sites.add("Google");
        sites.add("Wiki");
        sites.add("Taobao");
        System.out.println("网站列表: " + sites);

        // 将ArrayList转换为String类型
        String list = sites.toString();
        System.out.println("String: " + list);
    }
}

// 以上程序执行结果为:
// 网站列表: [JueJin, Google, Wiki, Taobao]
// String: [JueJin, Google, Wiki, Taobao]

ensureCapacity() 方法

public void ensureCapacity(int minCapacity)

描述

用于设置具有指定容量大小的动态数组。

参数

  • minCapacity -- 动态数组的容量。

返回值

解析

如果 arraylist 可以自动调整自身大小,为什么还要使用 ensureCapacity() 方法调整 arraylist 的大小呢?这是因为如果我们使用 ensureCapacity() 方法来调整 arraylist 的大小,那么 arraylist 将会马上调整为指定的容量大小。否则,每次添加元素时都会调整 arraylist 的大小。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        // 设置 arraylist的容量大小
        sites.ensureCapacity(3);

        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");

        // 添加第四个元素
        sites.add("Juejin");

        System.out.println("网站列表: " + sites);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, Runoob, Taobao, Juejin]

lastIndexOf() 方法

public int lastIndexOf(Object o)

描述

返回指定元素在动态数组中最后一次出现的位置。

参数

  • o -- 查找的元素。

返回值

从动态数组中返回指定元素最后出现的位置的索引值。如果 o 元素在动态数组中重复出现,返回在数组中最后出现 o 的元素索引值。如果动态数组中不存在指定的元素,则该 lastIndexOf() 方法返回 -1。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        sites.add("JueJin");
        System.out.println("网站列表: " + sites);


        // 获取 JueJin 最后一次出现的位置
        int position1 = sites.lastIndexOf("JueJin");
        System.out.println("JueJin 最后出现的位置: " + position1);

        // Runoob 不在 arraylist 中
        // 返回 -1
        int position2 = sites.lastIndexOf("Runoob");
        System.out.println("Runoob 最后出现的位置: " + position2);
    }
}

// 以上程序执行结果为:
// 网站列表: [Google, JueJin, Taobao, JueJin]
// JueJin 最后出现的位置: 3
// Runoob 最后出现的位置: -1

retainAll() 方法

public boolean retainAll(Collection<?> c)

描述

用于保留 arraylist(ArrayList 类的对象) 中在指定集合中也存在的那些元素,也就是删除指定集合中不存在的那些元素(调用方法对象保留两个集合中元素的交集)。

参数

  • c - 集合参数。

返回值

如果 arraylist(ArrayList 类的对象) 中删除了元素则返回 true。

注意

如果 arraylist 类中存在的元素与指定 collection 的类中元素不兼容,则抛出 ClassCastException 异常。

如果 arraylist 包含 null 元素,并且指定 collection 不允许 null 元素,则抛出 NullPointerException 。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");

        System.out.println("sites: " + sites);

        // 创建另一个动态数组
        ArrayList<String> sites2 = new ArrayList<>();

        // 往动态数组中添加元素
        sites2.add("Wiki");
        sites2.add("JueJin");
        sites2.add("Google");
        System.out.println("sites2: " + sites2);

        // 保留元素
        sites.retainAll(sites2);
        System.out.println("sites 保留的元素: " + sites);
    }
}

// 以上程序执行结果为:
// sites: [Google, JueJin, Taobao]
// sites2: [Wiki, JueJin, Google]
// sites 保留的元素: [Google, JueJin]

containsAll() 方法

public boolean containsAll(Collection<?> c)

描述

用于检测 arraylist(ArrayList 类的对象)是否包含指定集合中的所有元素。可以这样理解, containsAll() 方法检查了参数集合是否是动态数组中的一个子集。

参数

  • c -- 集合参数。

返回值

如果动态数组中包含的集合中的所有元素,则返回 true。

注意

如果 arraylist(ArrayList 类的对象)中存在的元素与指定 collection 中的元素不兼容,则抛出 ClassCastException。

如果 collection 中包含 null 元素,并且 arraylist(ArrayList 类的对象)中不允许 null值,则抛出 NullPointerException 异常。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");

        System.out.println("ArrayList 1: " + sites);

        // 创建另一个动态数组
        ArrayList<String> sites2 = new ArrayList<>();

        // 往动态数组中添加元素
        sites2.add("JueJin");
        sites2.add("Google");
        System.out.println("ArrayList 2: " + sites2);

        // 检查动态数组1是否包含动态数组2
        boolean result1 = sites.containsAll(sites2);
        System.out.println("ArrayList 1 包含了 ArrayList 2 的所有元素: " + result1);

        // 检查数组2是否包含数组1
        boolean result2 = sites2.containsAll(sites);
        System.out.println("ArrayList 2 包含了 ArrayList 1 的所有元素: " + result2);
    }
}

// 以上程序执行结果为:
// ArrayList 1: [Google, JueJin, Taobao]
// ArrayList 2: [JueJin, Google]
// ArrayList 1 包含了 ArrayList 2 的所有元素: true
// ArrayList 2 包含了 ArrayList 1 的所有元素: false

trimToSize() 方法

public void trimToSize()

描述

用于将动态数组中的容量调整为数组中的元素个数。

参数

返回值

解析

ArrayList 的内部使用数组存储元素,当数组将被存满,就会创建一个新数组,其容量是当前数组的 1.5 倍。同时,所有元素都将移至新数组,假设内部数组已满,而我们现在又添加了 1 个元素,ArrayList 容量就会以相同的比例扩展(即前一个数组的1.5倍)。在这种情况下,内部数组中将有一些未分配的空间。这时,trimToSize() 方法可以删除未分配的空间并更改 ArrayList 的容量,使其等于 ArrayList 中的元素个数。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");

        System.out.println("ArrayList : " + sites);

        // 调整容量为3
        sites.trimToSize();
        System.out.println("ArrayList 大小: " + sites.size());
    }
}

// 以上程序执行结果为:
// ArrayList : [Google, JueJin, Taobao]
// ArrayList 大小: 3

removeRange() 方法

protected void removeRange(int fromIndex, int toIndex)

描述

用于删除指定索引之间存在的元素。该方法仅删除了一部分动态数组元素,从 fromIndex 到 toIndex-1 的动态数组元素。也就是说不包括 toIIndex 索引位置的元素在内。

参数

  • fromIndex -- 索引起始位置,包含该索引位置的值。
  • toIndex -- 索引结束位置,不包含该索引位置的值。

返回值

注意

如果fromIndex 或者 toIndex 索引超出范围,或者说 toIndex < fromIndex,则抛出 IndexOutOfBoundException 异常。

public class ArrayTest extends ArrayList {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayTest sites = new ArrayTest();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        sites.add("JueJin");
        sites.add("Weibo");

        System.out.println("ArrayList : " + sites);

        // 删除从索引值1到3的元素
        sites.removeRange(1, 3);
        System.out.println("删除后的 ArrayList: " + sites);
    }
}

// 以上程序执行结果为:
// ArrayList : [Google, JueJin, Taobao, JueJin, Weibo]
// 删除后的 ArrayList: [Google, JueJin, Weibo]

扩展 :

removeRange() 方法是受保护的,所以如果要使用需要继承 ArrayList 类,继承后我们就可以使用继承类来创建一个动态数组。removeRange() 方法不常用,我们通常可以使用 ArrayList subList() 和 ArrayList clear() 方法来实现删除元素。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");
        sites.add("JueJin");
        sites.add("Weibo");

        System.out.println("ArrayList : " + sites);

        // 删除位置索引1到3的元素
        sites.subList(1, 3).clear();
        System.out.println("Updated ArrayList: " + sites);
    }
}

// 以上程序执行结果为:
// ArrayList : [Google, JueJin, Taobao, JueJin, Weibo]
// Updated ArrayList: [Google, JueJin, Weibo]

replaceAll() 方法

public void replaceAll(UnaryOperator<E> operator)

描述

用于将给定的操作内容替换掉数组中每一个元素。

参数

  • operator -- 要替换到动态数组的元素或者一系列操作。

返回值

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("JueJin");
        sites.add("Taobao");

        System.out.println("ArrayList : " + sites);

        // 将所有元素更改为大写
        sites.replaceAll(e -> e.toUpperCase());
        System.out.println("更新后的 ArrayList: " + sites);
    }
}

// 以上程序执行结果为:
// ArrayList : [Google, JueJin, Taobao]
// 更新后的 ArrayList: [GOOGLE, JUEJIN, TAOBAO]

removeIf() 方法

public boolean removeIf(Predicate<? super E> filter)

描述

用于删除所有满足特定条件的数组元素。

参数

  • filter -- 过滤器,判断元素是否要删除。

返回值

如果元素被删除则返回 true。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个动态数组
        ArrayList<String> sites = new ArrayList<>();

        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("JueJin");

        System.out.println("ArrayList : " + sites);

        // 删除名称中带有 Run 的元素
        sites.removeIf(e -> e.contains("Run"));;
        System.out.println("删除后的 ArrayList: " + sites);
    }
}

// 以上程序执行结果为:
// ArrayList : [Google, Runoob, Taobao, JueJin]
// 删除后的 ArrayList: [Google, Taobao, JueJin]

forEach() 方法

public void forEach(Consumer<? super E> action)

描述

用于遍历动态数组中每一个元素并执行特定操作。

参数

  • action -- 对每个元素执行的操作。

返回值

注意

forEach() 方法与 for-each 循环不同。forEach() 方法对每个元素执行操作。Java for-each用于遍历数组中的每个元素。

public class ArrayTest {
    public static void main(String[] args) {
        // 创建一个数组
        ArrayList<Integer> numbers = new ArrayList<>();

        // 往数组中添加元素
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        System.out.println("ArrayList: " + numbers);

        // 所有元素乘以 10
        System.out.print("更新 ArrayList: ");

        // 将 lambda 表达式传递给 forEach
        numbers.forEach((e) -> {
            e = e * 10;
            System.out.print(e + " ");
        });
    }
}

// 以上程序执行结果为:
// ArrayList: [1, 2, 3, 4]
// 更新 ArrayList: 10 20 30 40 

扩展

numbers.forEach((e) -> {
    e = e * 10;
    System.out.print(e + " ");  
});

实例中,我们将匿名函数 lambda 的表达式作为 forEach() 方法的参数传入,lambda 表达式将动态数组中的每个元素乘以 10,然后输出结果。