鉴于 Java 数组用来存储数据具有局限性,我们通常使用 java.util.List 替代数组。

List 类型的集合元素有序,且可重复,集合中的每个元素都有对应的顺序索引。

在 List 类型的集合中存储数据,就像面对银行客服,会给每一个来办理业务的客户分配序号:

  • 第一个来的是“张三”,客服给他分配的是 0;
  • 第二个来的是“李四”,客服给他分配的是 1;
  • 以此类推,最后一个序号应该是“总人数-1”。

如下图所示:

图 1 List类型的集合

Java List接口常用的方法

除从 Collection 接口继承的方法外,List 接口还添加了一些根据索引来操作集合元素的方法。

1) 插入元素:

  • void add(int index, Object ele):在 index 位置插入 ele 元素;
  • boolean addAll(int index, Collection eles):从 index 位置开始将 eles 中的所有元素添加进来。

2) 获取元素:

  • Object get(int index):获取指定 index 位置的元素;
  • List subList(int fromIndex, int toIndex):返回从 fromIndex 到 toIndex 位置的子集合。

3) 获取元素索引:

  • int indexOf(Object obj):返回 obj 在当前集合中首次出现的位置;
  • int lastIndexOf(Object obj):返回 obj 在当前集合中最后出现的位置。

4) 删除和替换元素:

  • Object remove(int index):移除指定 index 位置的元素,并返回此元素;
  • Object set(int index, Object ele):设置指定 index 位置的元素为 ele。

【实例】创建集合,实现用 List 接口添加元素、获取元素、获取元素的索引,以及删除和替换元素,代码如下:

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ListDemo {
public static void main(String[] args) {
ListDemo listDemo = new ListDemo();
listDemo.testList();
}

public void testList() {
System.out.println("---- 往 List 集合添加元素 ----");
List list = new ArrayList();
list.add(1);
list.add("hello");
list.add("world");
System.out.println("添加元素:" + list);

System.out.println("---- 往 Collection 集合添加元素 ----");
Collection collection = new ArrayList();
collection.add("南南");
System.out.println("collection = " + collection);

System.out.println("---- 将 Collection 集合元素添加到 List 集合指定的位置 ----");
// 将集合中元素添加到当前集合的指定位置
list.addAll(2, collection);
System.out.println("list = " + list);

System.out.println("---- 获取元素 ----");
Object o = list.get(2);
System.out.println("获取指定位置的元素 = " + o);

List subList = list.subList(0, 3);
System.out.println("subList = " + subList);

System.out.println("---- 获取元素第一次出现的位置 ----");
int i = list.indexOf("hello");
System.out.println("第一次出现的位置 = " + i);

System.out.println("---- 获取元素在最后出现的位置 ----");
int i1 = list.lastIndexOf("world");
System.out.println("最后出现的位置 = " + i1);

System.out.println("---- 删除集合的元素 ----");
boolean hello = list.remove("hello");
System.out.println("删除成功? " + hello);
System.out.println("删除后 list = " + list);

System.out.println("---- 修改集合的元素 ----");
list.set(1, "xixi");
System.out.println("修改后 list = " + list);
}
}

在上述代码中:

  • 调用 add() 方法往当前集合添加元素;
  • 调用 addAll() 方法将其他集合中的元素添加到当前集合中;
  • 调用 get() 方法获取当前集合的元素;
  • 调用 subList() 方法获取指定元素;
  • 调用 indexOf() 方法获取当前集合中第一次出现的元素的位置;
  • 调用 lastIndexOf() 方法获取元素在最后出现的位置;
  • 调用 remove() 方法删除当前集合中的元素,remove() 方法的参数可以是索引,也可以是删除的元素;
  • 调用 set() 方法修改当前集合中的元素。

在 Java SE 中,List 的名称类型有两种,一种是 java.util.List 集合接口,另一种是 java.awt.List 图形界面的组件。

在 JDK API 中,List 接口的常用实现类有 ArrayList、LinkedList 和 Vector。

Java ArrayList实现类

ArrayList 是 List 接口的主要实现类。在本质上,ArrayList 是对象引用的一个“变长”数组,如下图所示:

图 2 ArrrayList

ArrayList 实现类的方法与 List 接口的方法基本上完全一致,直接使用 List 接口的方法即可。

Java LinkedList实现类

对频繁插入或删除元素的操作,建议使用 LinkedList 实现类,其效率较高。这是由底层采用链表(双向链表)结构存储数据决定的。

LinkedList 实现类与 ArrayList 实现类不同的是,ArrayList 实现类使用 List 接口的方法,而 LinkedList 实现类既使用 List 接口的方法,又有自己特有的方法。

下面是 LinkedList 实现类特有的方法:

void addFirst(Object obj)
void addLast(Object obj)
Object getFirst()
Object getLast()
Object removeFirst()
Object removeLast()

【实例】创建集合,用 LinkedList 实现类在集合首位和末位添加元素、获取首位元素和末位元素、删除首位元素和末位元素,代码如下:

import java.util.LinkedList;
import java.util.List;

public class ListDemo {
public static void main(String[] args) {
ListDemo listDemo = new ListDemo();
listDemo.testList();
}

public void testList() {
System.out.println("---- 添加元素 ----");
LinkedList list = new LinkedList<>();
list.add("a");
list.addFirst("b");
list.add("c");
list.add("d");
list.addLast("f");
System.out.println(list);

System.out.println("---- 获取元素 ----");
Object first = list.getFirst();
System.out.println(first);
Object last = list.getLast();
System.out.println(last);

System.out.println("---- 删除元素 ----");
Object o = list.removeFirst();
System.out.println(o);
Object o1 = list.removeLast();
System.out.println(o1);
}
}

在上述代码中:

  • 调用 addFirst() 方法将元素添加到首位;
  • 调用 addLast() 方法将元素添加到末位;
  • 调用 getFirst() 方法获取首位元素;
  • 调用 getLast() 方法获取末位元素;
  • 调用 removeFirst() 方法删除首位元素;
  • 调用 removeLast() 方法删除末位元素。

更多推荐