List接口

List 集合包括 List 接口以及 List 接口的所有实现类。List 集合中的元素可以重复,各元素的顺序就是对象插入的顺序。类似 Java 数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素。

List接口概述

List 接口继承了 Collection 接口,因此包含 Collection 接口中的所有方法。此外,List 接口还定义了以下两个非常重要的方法。

  • get(int index):获得指定索引位置的元素。

  • set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象。

List 接口的常用实现类有 ArrayList 类与 LinkedList 类,简述如下:

  • ArrayList 类实现了可变的数组,允许保存所有元素,包括 null,并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置处插入对象或从指定的索引位置处删除对象的速度较慢。

  • LinkedList 类采用链表结构保存对象。这种结构的优点是便于向集合中插入对象或从集合中删除对象。需要向集合中插入对象或从集合中删除对象时,使用 LinkedList 类实现的 List 集合的效率较高;但对于随机访问集合中的对象,使用 LinkedList 类实现 List 集合的效率较低。

ArrayList类

使用 List 接口时通常声明为 List 类型,通过 ArrayList 类可以实例化 List 接口。代码如下:

List<E> list = new ArrayList<>();

在上面的代码中,E 可以是合法的 Java 数据类型。例如,如果集合中的元素为字符串类型,那么 E 可以被修改为 String。

【例12.2】举例说明List集合的常用方法(实例位置:资源包\TM\sl\12\2)

在项目中创建 Gather 类,在主方法中创建集合对象,依次向集合对象中添加 “a”、“b”、“c” 3个元素,先使用 Math 类的 random() 方法随机获取集合中的某个元素,再移除集合中索引位置是 “2” 的元素并把余下的元素输出到控制台上。实例代码如下:

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

public class Gather { 							//创建类Gather
	public static void main(String[] args) { 			//主方法
		List<String> list = new ArrayList<>(); 		//创建集合对象
		list.add("a"); 							//向集合添加元素
		list.add("b");
		list.add("c");
		int i = (int) (Math.random()*list.size());		//获得0~2之间的随机数
		System.out.println("随机获取集合中的元素:" + list.get(i));
		list.remove(2); 							//将指定索引位置的元素从集合中移除
		System.out.println("将索引是'2'的元素从集合移除后,集合中的元素是:");
		for (int j = 0; j < list.size(); j++) { 			//循环遍历集合
			System.out.println(list.get(j));
		}
	}
}

运行结果如图12.3所示。

image 2024 03 01 21 51 59 349

与数组相同,集合的索引也是从 0 开始的。

LinkedList类

通过 LinkedList 类也可以实例化 List 接口,代码如下:

List<E> list = new LinkedList<>();

LinkedList 类采用链表结构保存元素,这种结构的优点是便于向集合中插入元素或者从集合中删除元素。当需要频繁向集合中插入元素或从集合中删除元素时,使用 LinkedList 类比使用 ArrayList 类的效率更高。

LinkedList 类除了包含 Collection 接口和 List 接口中的所有方法,还包含了如表12.2所示的方法。

image 2024 03 01 22 03 13 124
Figure 1. 表12.2 LinkedList类的特有方法

下面通过一个实例演示 LinkedList 类的使用方法。

【例12.3】记录入库的商品名称(实例位置:资源包\TM\sl\12\3)

首先,记录入库的商品名称,并把它们输出到控制台上。然后,输出录入的第一个商品名称和最后—个商品名称。最后,输出删除录入的最后一个商品后的剩余商品名称。代码如下:

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapTest {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<>(); // 创建Map集合对象
		map.put("ISBN-978654", "Java从入门到精通"); // 向Map集合中添加元素
		map.put("ISBN-978361", "Android从入门到精通");
		map.put("ISBN-978893", "21天学Android");
		map.put("ISBN-978756", "21天学Java");
		Set<String> set = map.keySet(); // 构建Map集合中所有key的Set集合
		Iterator<String> it = set.iterator(); // 创建Iterator迭代器
		System.out.println("key值:");
		while (it.hasNext()) { // 遍历并输出Map集合中的key值
			System.out.print(it.next() + " ");
		}
		Collection<String> coll = map.values(); // 构建Map集合中所有value值的集合
		it = coll.iterator();
		System.out.println("\nvalue值:");
		while (it.hasNext()) { // 遍历并输出Map集合中的value值
			System.out.print(it.next() + " ");
		}
	}
}

运行结果如下:

image 2024 03 01 22 06 09 148

编程训练(答案位置:资源包\TM\sl\12\编程训练)

【训练1】输出NBA历史十大巨星 输出NBA历史十大巨星的“绰号”“得分”“篮板”“助攻”,运行结果如图12.4所示。

【训练2】给图书排序 书桌上有两本书,分别是《西游记》和《水浒传》,书架上有3本书,分别是《三国演义》《莎士比亚诗选》《红楼梦》。现要将中国的四大名著按照《水浒传》《三国演义》《西游记》《红楼梦》的顺序放到一起。

image 2024 03 01 22 06 40 416
Figure 2. 图12.4 NBA历史十大巨星