ArrayList集合

数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个学校的学生,由于不停有新生来报道,同时也有学生毕业离开学校,这时学生的数目很难确定。为了保存这些数目不确定的元素,JDK中提供了一系列特殊的类,这些类可以存储任意类型的元素,并且长度可变,统称为集合。在这里,我们先介绍ArrayList集合,其他集合在后续课程中学习。

ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。

集合的创建

导包:import java.util.ArrayList;

创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型:

ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();

  • 集合中存储的元素,只能为<>括号中指定的数据类型元素;
  • "<要存储元素的数据类型>"中的数据类型必须是引用数据类型,不能是基本数据类型;
基本数据类型对应的引用数据类型表示形式
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

示例:

  • 存储String类型的元素

ArrayList<String> list = new ArrayList<String>();

  • 存储int类型的数据

ArrayList<Integer> list = new ArrayList<Integer>();

  • 存储Phone类型的数据

ArrayList<Phone> list = new ArrayList<Phone>();

集合中常用方法

修饰语和类型 方法和说明
boolean add(E e)
将指定的元素追加到此列表的末尾。
void add(int index, E element)
在此列表中的指定位置插入指定的元素。
boolean addAll(Collection c)
按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
boolean addAll(int index, Collection c)
将指定集合中的所有元素插入到此列表中,从指定的位置开始。
void clear()
从列表中删除所有元素。
Object clone()
返回此 ArrayList实例的浅拷贝。
boolean contains(Object o)
如果此列表包含指定的元素,则返回 true
void ensureCapacity(int minCapacity)
如果需要,增加此 ArrayList实例的容量,以确保它可以至少保存最小容量参数指定的元素数。
void forEach(Consumer action)
Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。
E get(int index)
返回此列表中指定位置的元素。
int indexOf(Object o)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
boolean isEmpty()
如果此列表不包含元素,则返回 true
Iterator iterator()
以正确的顺序返回该列表中的元素的迭代器。
int lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
ListIterator listIterator()
返回列表中的列表迭代器(按适当的顺序)。
ListIterator listIterator(int index)
从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
E remove(int index)
删除该列表中指定位置的元素。
boolean remove(Object o)
从列表中删除指定元素的第一个出现(如果存在)。
boolean removeAll(Collection c)
从此列表中删除指定集合中包含的所有元素。
boolean removeIf(Predicate filter)
删除满足给定谓词的此集合的所有元素。
protected void removeRange(int fromIndex, int toIndex)
从这个列表中删除所有索引在 fromIndex (含)和 toIndex之间的元素。
void replaceAll(UnaryOperator operator)
将该列表的每个元素替换为将该运算符应用于该元素的结果。
boolean retainAll(Collection c)
仅保留此列表中包含在指定集合中的元素。
E set(int index, E element)
用指定的元素替换此列表中指定位置的元素。
int size()
返回此列表中的元素数。
void sort(Comparator c)
使用提供的 Comparator对此列表进行排序以比较元素。
Spliterator spliterator()
在此列表中的元素上创建late-binding故障快速 Spliterator
List subList(int fromIndex, int toIndex)
返回此列表中指定的 fromIndex (包括)和 toIndex之间的独占视图。
Object[] toArray()
以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
 T[] toArray(T[] a)
以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。
void trimToSize()
修改这个 ArrayList实例的容量是列表的当前大小。

集合的遍历

集合遍历,得到集合中每个元素,这是集合中最常见的操作。集合的遍历与数组的遍历很像,都是通过索引的方式。

import java.util.ArrayList;
public class ArrayList {
    public static void main(String[] args) {
        //创建ArrayList集合
        ArrayList<Integer> list = new ArrayList<Integer>();
        //添加元素到集合
        list.add(13);
        list.add(15);
        list.add(22);
        list.add(29);
        //遍历集合
        for (int i = 0; i < list.size() ; i++) {
            //通过索引,获取到集合中每个元素
            int n = list.get(i);
            System.out.println(n);
        }
    }
}

随机点名器案例

我们来完成随机点名器,它具备以下3个内容:

  • 存储所有同学姓名
  • 总览全班同学姓名
  • 随机点名其中一人,打印到控制台

我们对学生信息进行封装,编写Student.java文件

public class Student {
    String name; //姓名
    int age; //年龄
}

接下来我们编写CallName.java文件,完成程序的编写。

// 引入uitl中所有的文件
import java.util.*;
public class CallName
{
    public static void main(String[] args) 
    {
        ArrayList<Student> array = new ArrayList<Student>();
        // 添加方法
        add(array);
        // 展示方法
        show(array);
        // 随机输出
        rand(array);
    }

    public static void add(ArrayList<Student> array) 
    {
        // 声明3个stu类型的变量存储3个对象,并赋值
        Student stu1 = new Student();
        Student stu2 = new Student();
        Student stu3 = new Student();
        stu1.name = "a";
        stu2.name = "b";
        stu3.name = "c";
        stu1.age = 1;
        stu2.age = 2;
        stu3.age = 3;
        array.add(stu1);
        array.add(stu2);
        array.add(stu3);
    }

    public static void show(ArrayList<Student> array) 
    {
        // 遍历输出集合中所有的值
        for (int i = 0; i < array.size(); i++) 
        {
            System.out.print(array.get(i).name);
            System.out.println(array.get(i).age);
        }
    }

    public static void rand(ArrayList<Student> array) 
    {
        // 获得一个随机数并作为索引获取结果
        Random rand = new Random();
        System.out.print(array.get(rand.nextInt(array.size())).name);
        System.out.println(array.get(rand.nextInt(array.size())).age);
    }
}