Java ArrayList

1 什么是Java ArrayList

Java ArrayList类使用动态数组来存储元素。它继承了AbstractList类并实现List接口。

Java ArrayList类的核心要点:

  • Java ArrayList类可以存储重复的元素。
  • Java ArrayList类元素是有序的。
  • Java ArrayList类非同步(线程不安全的)。
  • Java ArrayList允许随机访问,因为数组基于索引工作。
  • 在Java ArrayList类中,操作很慢,因为如果从数组列表中删除任何元素,则需要进行很多移位。

2 Java ArrayList的层次结构

如上图所示,Java ArrayList类扩展了实现List接口的AbstractList类。List接口按层次结构继承了Collection和Iterable接口。

3 Java ArrayList的语法

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable  

4 Java ArrayList的构造方法

构造方法 描述
ArrayList() 用于构建一个空数组列表。
ArrayList(Collection<? extends E> c) 用于构建使用集合的元素初始化的List。
ArrayList(int capacity) 用于构建具有指定初始容量的List。

5 Java ArrayList的方法

方法 描述
void add(int index, E element) 用于将指定的元素插入List中的指定位置。
boolean add(E e) 用于将指定的元素追加到List的末尾。
boolean addAll(Collection<? extends E> c) 用于将指定集合中的所有元素附加到此List的末尾,以指定集合的​​迭代器返回它们的顺序。
boolean addAll(int index, Collection<? extends E> c) 从List的指定位置开始,它用于附加指定集合中的所有元素。
void clear() 用于从此List中删除所有元素。
void ensureCapacity(int requiredCapacity) 用于增强ArrayList实例的容量。
E get(int index) 用于从List的特定位置获取元素。
boolean isEmpty() 如果List为空,则返回true,否则返回false。
int lastIndexOf(Object o) 用于返回指定元素最后一次出现在此List中的索引;如果List不包含此元素,则返回-1。
Object[] toArray() 用于以正确的顺序返回包含此List中所有元素的数组。
<T> T[] toArray(T[] a) 用于以正确的顺序返回包含此List中所有元素的数组。
Object clone() 用于返回ArrayList的浅表副本。
boolean contains(Object o) 如果List包含指定的元素,则返回true
int indexOf(Object o) 用于返回指定元素首次出现在此List中的索引,如果List不包含此元素,则返回-1。
E remove(int index) 用于删除List中指定位置上存在的元素。
boolean remove(Object o) 用于删除指定元素的第一次出现。
boolean removeAll(Collection<?> c) 用于从List中删除所有元素。
boolean removeIf(Predicate<? super E> filter) 用于从满足给定条件的List中删除所有元素。
protected void removeRange(int fromIndex, int toIndex) 用于删除位于给定范围内的所有元素。
void replaceAll(UnaryOperator<E> operator) 用于将List中的所有元素替换为指定的元素。
void retainAll(Collection<?> c) 用于保留List中指定集合中存在的所有元素。
E set(int index, E element) 用于替换List中位于指定位置的指定元素。
void sort(Comparator<? super E> c) 用于根据指定的比较器对List中的元素进行排序。
Spliterator<E> spliterator() 用于在List中的元素上创建分隔符。
List<E> subList(int fromIndex, int toIndex) 用于获取位于给定范围内的所有元素。
int size() 用于返回列表中存在的元素数。
void trimToSize() 用于将ArrayList实例的容量调整为List的当前大小。

6 Java ArrayList的例子

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        ArrayList<String> list=new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //打印ArrayList
        System.out.println(list);
    }
}

输出结果为:

[eric, jack, mark, rose]

7 Java ArrayList遍历元素的方式

有多种遍历集合元素的方法:

  1. 使用Iterator接口遍历元素。
  2. 使用for-each循环遍历元素。
  3. 使用ListIterator接口遍历元素。
  4. 使用for循环遍历元素。
  5. 使用forEach循环遍历元素。
  6. 使用forEachRemaining方法遍历元素。

7.1 使用Iterator接口遍历元素

让我们看一个使用Iterator接口遍历ArrayList元素的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        ArrayList<String> list=new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //使用Iterator接口遍历元素
        Iterator itr=list.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

eric
jack
mark
rose

7.2 使用for-each循环遍历元素

让我们看一个使用for-each循环遍历ArrayList元素的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        ArrayList<String> list=new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //使用for-each循环遍历元素
        for(String obj:list)
            System.out.println(obj);
        }
}

输出结果为:

eric
jack
mark
rose

7.3 使用ListIterator接口遍历元素

让我们看一个ListIterator接口遍历元素的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo {

    public static void main(String args[]) {
        ArrayList<String> list = new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //使用ListIterator接口遍历元素
        ListIterator<String> list1 = list.listIterator(list.size());
        while (list1.hasPrevious()) {
            String str = list1.previous();
            System.out.println(str);
        }
    }
}

输出结果为:

rose
mark
jack
eric

7.4 使用for循环遍历元素

让我们看一个使用for循环遍历元素的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo {

    public static void main(String args[]) {
        ArrayList<String> list = new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //使用for循环遍历元素
        System.out.println("使用for循环遍历元素");
        for(int i=0;i<list.size();i++)
        {
            System.out.println(list.get(i));
        }
    }
}

输出结果为:

使用for循环遍历元素
eric
jack
mark
rose

7.5 使用forEach循环遍历元素

让我们看一个使用forEach循环遍历元素的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo {

    public static void main(String args[]) {
        ArrayList<String> list = new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //使用forEach循环遍历元素
        System.out.println("使用forEach循环遍历元素:");
        //Java8的新特性
        list.forEach(a->{ //这里使用lambda表达式
            System.out.println(a);
        });
    }
}

输出结果为:

使用forEach循环遍历元素:
eric
jack
mark
rose

7.6 使用forEachRemaining方法遍历元素

让我们看一个使用forEachRemaining方法遍历元素的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo {

    public static void main(String args[]) {
        ArrayList<String> list = new ArrayList<String>();//创建ArrayList
        list.add("eric");//添加元素到ArrayList
        list.add("jack");
        list.add("mark");
        list.add("rose");
        //使用forEachRemaining方法遍历元素
        System.out.println("使用forEachRemaining方法遍历元素:");
        Iterator<String> itr=list.iterator();
        itr.forEachRemaining(a-> //lambda表达式
        {
            System.out.println(a);
        });
    }
}

输出结果为:

使用forEachRemaining方法遍历元素:
eric
jack
mark
rose

8 Java ArrayList存储对象

让我们看一个将Student类对象存储在ArrayList中的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

//定义Student类
class Student{
    int rollno;
    String name;
    int age;
    Student(int rollno,String name,int age){
        this.rollno=rollno;
        this.name=name;
        this.age=age;
    }
}



class Demo{

    public static void main(String args[]){
        //创建Student对象
        Student s1=new Student(101,"eric",23);
        Student s2=new Student(102,"jack",21);
        Student s3=new Student(103,"rose",25);
        //创建ArrayList集合
        ArrayList<Student> al=new ArrayList<Student>();
        al.add(s1);//添加元素到ArrayList中
        al.add(s2);
        al.add(s3);
        //获取迭代器
        Iterator itr=al.iterator();
        //遍历ArrayList的元素
        while(itr.hasNext()){
            Student st=(Student)itr.next();
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
    }
}

输出结果为:

101 eric 23
102 jack 21
103 rose 25

9 Java ArrayList序列化和反序列化

让我们看一个序列化ArrayList对象,然后反序列化对象的示例。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.io.*;
import java.util.*;

class Demo {

    public static void main(String [] args)
    {
        ArrayList<String> al=new ArrayList<String>();
        al.add("eric");
        al.add("jack");
        al.add("rose");

        try
        {
            //序列化
            FileOutputStream fos=new FileOutputStream("file");
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(al);
            fos.close();
            oos.close();

            //反序列化
            FileInputStream fis=new FileInputStream("file");
            ObjectInputStream ois=new ObjectInputStream(fis);
            ArrayList  list=(ArrayList)ois.readObject();
            System.out.println(list);
        }catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

输出结果为:

[eric, jack, rose]

10 Java ArrayList添加元素

添加元素到ArrayList的不同方法。

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        ArrayList<String> al=new ArrayList<String>();
        System.out.println("初始化ArrayList: "+al);
        //添加元素到ArrayList
        al.add("eric");
        al.add("jack");
        al.add("rose");
        System.out.println("调用add(E e)方法后: "+al);
        //指定位置添加元素
        al.add(1, "mark");
        System.out.println("调用add(int index, E element)方法后: "+al);
        ArrayList<String> al2=new ArrayList<String>();
        al2.add("lucy");
        al2.add("macy");
        //调用addAll()方法
        al.addAll(al2);
        System.out.println("调用addAll(Collection<? extends E> c)方法后: "+al);
        ArrayList<String> al3=new ArrayList<String>();
        al3.add("John");
        al3.add("Rahul");
        //指定位置的addAll()方法
        al.addAll(1, al3);
        System.out.println("调用addAll(int index, Collection<? extends E> c)方法后: "+al);

    }
}

输出结果为:

初始化ArrayList: []
调用add(E e)方法后: [eric, jack, rose]
调用add(int index, E element)方法后: [eric, mark, jack, rose]
调用addAll(Collection<? extends E> c)方法后: [eric, mark, jack, rose, lucy, macy]
调用addAll(int index, Collection<? extends E> c)方法后: [eric, John, Rahul, mark, jack, rose, lucy, macy]

11 Java ArrayList删除元素

删除元素的不同方法:

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo {

    public static void main(String [] args)
    {
        ArrayList<String> al=new ArrayList<String>();
        al.add("eric");
        al.add("jack");
        al.add("mark");
        al.add("lucy");
        al.add("macy");
        System.out.println("初始化ArrayList: "+al);
        //删除元素
        al.remove("Vijay");
        System.out.println("调用remove(object)方法后: "+al);
        //删除元素
        al.remove(0);
        System.out.println("调用remove(index)方法后: "+al);

        //创建另一个ArrayList
        ArrayList<String> al2=new ArrayList<String>();
        al2.add("rose");
        al2.add("hugo");
        //添加元素
        al.addAll(al2);
        System.out.println("更新list : "+al);
        //删除元素
        al.removeAll(al2);
        System.out.println("调用removeAll()方法后: "+al);
        //删除元素
        al.removeIf(str -> str.contains("Ajay"));   //Lambda表达式
        System.out.println("调用removeIf()方法后: "+al);
        //清空元素
        al.clear();
        System.out.println("调用clear()方法后: "+al);
    }
}

输出结果为:

初始化ArrayList: [eric, jack, mark, lucy, macy]
调用remove(object)方法后: [eric, jack, mark, lucy, macy]
调用remove(index)方法后: [jack, mark, lucy, macy]
更新list : [jack, mark, lucy, macy, rose, hugo]
调用removeAll()方法后: [jack, mark, lucy, macy]
调用removeIf()方法后: [jack, mark, lucy, macy]
调用clear()方法后: []

12 Java ArrayList retainAll()方法

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo{

    public static void main(String args[]){
        ArrayList<String> al=new ArrayList<String>();
        al.add("eric");
        al.add("jack");
        al.add("mark");
        ArrayList<String> al2=new ArrayList<String>();
        al2.add("eric");
        al2.add("hugo");
        al.retainAll(al2);
        System.out.println("在保留al2的元素之后迭代这些元素");
        Iterator itr=al.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

输出结果为:

在保留al2的元素之后迭代这些元素
eric

13 Java ArrayList isEmpty()方法

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo{

    public static void main(String [] args)
    {
        ArrayList<String> al=new ArrayList<String>();
        System.out.println("ArrayList为空么?: "+al.isEmpty());
        al.add("eric");
        al.add("jack");
        al.add("rose");
        System.out.println("插入元素后:");
        System.out.println("ArrayList为空么?: "+al.isEmpty());
    }
}

输出结果为:

ArrayList为空么?: true
插入元素后:
ArrayList为空么?: false

14 Java ArrayList set()和get()方法

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 * Java ArrayList的例子
 */
import java.util.*;

class Demo {

    public static void main(String [] args)
    {
        ArrayList<String> al=new ArrayList<String>();
        al.add("eric");
        al.add("jack");
        al.add("rose");
        System.out.println("更新前: "+al.get(1));
        //更新元素
        al.set(1,"hugo");
        System.out.println("更新后: "+al.get(1));
    }
}

输出结果为:

更新前: jack
更新后: hugo

 

推荐好课