List接口以及实现类ArrayList、LinkedList和Vector

156 阅读2分钟

List接口

Java集合中的List接口是一个有序的集合,允许存储重复的元素。它是Java集合框架中最基本的接口之一,提供了按照索引访问集合元素的方式。

List接口基础

  1. List接口是一个接口,它的实现类有ArrayList、LinkedList和Vector。
  2. List接口继承了Collection接口,因此它也具有Collection接口中的所有方法。
  3. List接口提供了按照索引访问集合元素的方法,如get(int index)和set(int index, E element)等。
  4. List接口提供了一些可以操作列表的方法,如add(int index, E element)、remove(int index)等。
  5. List接口提供了一些可以对列表进行搜索的方法,如indexOf(Object o)和lastIndexOf(Object o)等。
  6. List接口还提供了一些可以操作子列表的方法,如subList(int fromIndex, int toIndex)等。
  7. List接口中的迭代器可以按照列表元素的顺序遍历元素,也可以反向遍历元素。
  8. List接口还提供了一些可以进行批量操作的方法,如addAll(Collection c)和removeAll(Collection c)等。

ArrayList

ArrayList是Java中最常用的集合类之一,它是基于动态数组实现的,具有以下特点:

  1. 长度可变:ArrayList的长度可以动态地增加或减少,这意味着我们可以根据实际需要随时添加或删除元素。
  2. 可存储重复元素:ArrayList可以存储重复的元素,即允许添加相同的元素到集合中。
  3. 支持随机访问:可以通过索引值来访问集合中的元素,这使得ArrayList具有高效的查找和遍历能力。
  4. 非线程安全:ArrayList不是线程安全的,不能在多线程环境下直接使用。

ArrayList使用示例

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // 创建一个ArrayList对象
        ArrayList<String> list = new ArrayList<>();

        // 添加元素到集合中
        list.add("apple");
        list.add("banana");
        list.add("orange");

        // 访问元素
        System.out.println("第一个元素是:" + list.get(0));
        System.out.println("第二个元素是:" + list.get(1));
        System.out.println("第三个元素是:" + list.get(2));

        // 遍历集合
        for (String fruit : list) {
            System.out.println(fruit);
        }

        // 删除元素
        list.remove(1);
        System.out.println("删除第二个元素后的集合:");
        for (String fruit : list) {
            System.out.println(fruit);
        }

        // 获取集合的大小
        System.out.println("集合的大小是:" + list.size());
    }
}

该代码创建了一个字符串类型的ArrayList对象,向其中添加了三个元素,然后分别通过索引值和foreach循环来访问和遍历集合中的元素。接着删除了第二个元素,并输出删除后的集合和集合的大小。

LinkedList

LinkedList是Java集合框架中的一种实现List接口的数据结构,它基于链表实现,相比于ArrayList,它在插入和删除元素时的效率更高,但是在随机访问和遍历时效率相对较低。

常用方法

  • add(E e):在链表末尾添加元素e。
  • add(int index, E e):在链表的指定位置插入元素e。
  • get(int index):获取指定位置的元素。
  • remove(int index):移除指定位置的元素。
  • size():获取链表中元素的数量。

LinkedList使用示例

import java.util.LinkedList;

public class Queue<E> {
    private LinkedList<E> list;

    public Queue() {
        this.list = new LinkedList<>();
    }

    public void enqueue(E e) {
        list.add(e);
    }

    public E dequeue() {
        if (list.isEmpty()) {
            throw new RuntimeException("Queue is empty");
        }
        return list.removeFirst();
    }

    public int size() {
        return list.size();
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }
}

使用了LinkedList作为队列的底层实现。enqueue方法将元素添加到链表末尾,dequeue方法将链表的第一个元素移除并返回,size方法返回链表中元素的数量,isEmpty方法判断队列是否为空。

Vector

Vector是一个线程安全的动态数组,它继承自AbstractList类并实现了List接口。Vector与ArrayList类似,但有一个主要的区别,那就是Vector是线程安全的,因此它比ArrayList的操作更慢。

主要方法

  • add(E e):将指定的元素添加到Vector的末尾。
  • remove(int index):从Vector中删除指定索引位置的元素。
  • get(int index):返回Vector中指定索引位置的元素。
  • set(int index, E element):将指定索引位置的元素替换为指定元素。
  • size():返回Vector中元素的数量。

Vector使用示例

import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        // 创建一个Vector对象
        Vector<String> vector = new Vector<>();

        // 向Vector中添加元素
        vector.add("apple");
        vector.add("banana");
        vector.add("orange");

        // 获取Vector中的元素
        System.out.println("Vector中的元素为:");
        for (int i = 0; i < vector.size(); i++) {
            System.out.println(vector.get(i));
        }

        // 替换Vector中的元素
        vector.set(1, "grape");
        System.out.println("替换后的Vector中的元素为:");
        for (int i = 0; i < vector.size(); i++) {
            System.out.println(vector.get(i));
        }

        // 从Vector中删除元素
        vector.remove(2);
        System.out.println("删除后的Vector中的元素为:");
        for (int i = 0; i < vector.size(); i++) {
            System.out.println(vector.get(i));
        }
    }
}

运行以上代码,输出如下:

Vector中的元素为:
apple
banana
orange
替换后的Vector中的元素为:
apple
grape
orange
删除后的Vector中的元素为:
apple
grape