目录
- List 接口的实现类
- ArrayList
- LinkedList
- Vector
List 接口的实现类
- ArrayList: 动态数组实现的列表,支持快速随机访问。
- LinkedList: 双向链表实现的列表,支持高效地插入和删除操作。
- Vector: 类似于 ArrayList,但是是线程安全的,通常不推荐使用。
ArrayList
ArrayList
是 Java 集合框架中的一个实现类,它继承自 AbstractList,并实现了 List 接口。ArrayList
主要用于存储一组有序的对象,并且可以动态地调整其大小。它是基于动态数组的数据结构,因此在访问元素时具有常数时间复杂度,即 O(1)。
ArrayList
是 Java 中常用的数据结构,它允许按照顺序存储一组对象,并提供了一系列方法来对集合中的元素进行增删改查操作。由于其动态数组的特性和快速访问的优势,ArrayList 在实际开发中被广泛使用。如果需要有序集合且频繁进行增删元素操作,ArrayList 可能是一个不错的选择。
优点:
- 动态数组: ArrayList 提供了一个动态数组,可以根据需要自动调整大小,不需要手动管理数组大小。
- 有序集合: ArrayList 保留了元素的插入顺序,因此可以按照插入的顺序进行遍历和访问。
- 快速访问: 由于是基于数组实现的,ArrayList 支持通过索引快速访问元素,时间复杂度为 O(1)。
- 增删元素: ArrayList支持在列表末尾、指定索引位置以及根据元素进行增加和删除操作。
基础用法:
-
创建 ArrayList 对象
使用无参构造函数可以创建一个空的 ArrayList 对象,并根据需要使用 add() 方法添加元素。ArrayList<String> fruits = new ArrayList<>(); fruits.add("AA"); fruits.add("BB"); fruits.add("CC");
-
在指定位置插入元素
使用 add(index, element) 方法可以在指定位置插入元素。fruits.add(1, "DD"); // 在索引 1 处插入元素 "DD"
-
访问元素
使用get(index)
方法可以根据索引获取 ArrayList 中的元素。注意不要出现越界
的情况。String fruit = fruits.get(0); // 获取第一个元素 "AA"
-
遍历 ArrayList
使用 for-each 循环或者传统的 for 循环可以遍历 ArrayList 中的所有元素。for (String fruit : fruits) { System.out.println(fruit); } // 或者使用传统的 for 循环 for (int i = 0; i < fruits.size(); i++) { String fruit = fruits.get(i); System.out.println(fruit); }
-
删除元素
使用remove(index)
方法可以根据索引删除ArrayList
中的元素,或使用remove(Object)
方法根据元素进行删除。
fruits.remove(1); // 删除索引为1的元素 "BB"
fruits.remove("CC"); // 删除元素 "CC"
- 其他常用方法
int size = fruits.size(); // 获取元素个数
boolean isEmpty = fruits.isEmpty(); // 判断是否为空
fruits.clear(); // 清空所有元素
LinkedList
LinkedList
是 Java 集合框架中 List 接口的一个实现类,它使用双向链表数据结构来存储元素。LinkedList 允许快速添加和删除元素,尤其是在列表的开头和结尾进行操作,但在随机访问元素时相对较慢,是一个适用于频繁插入和删除元素的实现类。
优点:
- 快速插入和删除: LinkedList 使用链表结构,所以在列表的开头和结尾进行插入和删除操作的时间复杂度是 O(1),这使得它非常适合频繁的添加和移除操作。
- 灵活性: 由于链表的特性,LinkedList 也可以用作队列或栈的实现,支持在两端进行添加和删除操作。
基础用法:
- 创建 LinkedList 对象
使用无参构造函数可以创建一个空的 LinkedList 对象,并使用 add() 方法向列表中添加元素。LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("AA"); linkedList.add("BB"); linkedList.add("CC");
- 在指定位置插入元素
使用 add(index, element) 方法可以在指定位置插入元素。linkedList.add(1, "DD"); // 在索引 1 处插入元素 "DD"
- 获取元素
使用 get(index) 方法可以根据索引获取元素。
String firstElement = linkedList.get(0); // 获取第一个元素 "AA"
- 删除元素
使用 remove(index) 方法可以根据索引删除元素,或使用 remove(Object) 方法根据元素进行删除。linkedList.remove(2); // 删除索引 2 处的元素 "CC" linkedList.remove("BB"); // 删除元素 "BB"
- 遍历 LinkedList
使用 for-each 循环或者传统的 for 循环可以遍历 ArrayList 中的所有元素。for (String linked: linkedList) { System.out.println(linked); } // 或者使用传统的 for 循环 for (int i = 0; i < linkedList.size(); i++) { String linked= linkedList.get(i); System.out.println(linked); }
- 作为队列或栈使用
LinkedList 可以通过添加和删除元素在两端实现队列或栈的操作。// 作为队列使用(先进先出) linkedList.addLast("Pineapple"); // 入队 String firstFruit = linkedList.removeFirst(); // 出队 // 作为栈使用(先进后出) linkedList.addFirst("Watermelon"); // 入栈 String topFruit = linkedList.removeFirst(); // 出栈
Vector
Vector
是 Java 集合框架中 List 接口的一个传统实现类,它实现了动态数组的数据结构。与 ArrayList
类似,Vector
也可以动态地增加或减少元素,并且支持按索引访问元素。不过与ArrayList
不同的是,Vector
是线程安全的,这意味着多个线程可以同时访问和修改 Vector
对象,而不会出现并发访问问题。
Vector
是一个线程安全的动态数组实现,适用于需要在多线程环境下进行安全操作的场景。由于其线程安全特性,Vector
的性能相对较低,因此在单线程环境下,如果不需要线程安全的功能,可能更适合使用 ArrayList
。
优点:
- 线程安全: Vector 是线程安全的集合类,适用于多线程环境下需要安全操作的场景。
- 动态数组: Vector 提供了动态数组的功能,可以动态地增加或减少元素的大小。
基础用法:
-
创建 Vector 对象
使用无参构造函数可以创建一个空的 Vector 对象,并使用 add() 方法向列表中添加元素。Vector<String> vector = new Vector<>(); vector.add("AA"); vector.add("BB"); vector.add("CC");
-
在指定位置插入元素
使用 add(index, element) 方法可以在指定位置插入元素。vector.add(1, "DD"); // 在索引 1 处插入元素 "DD"
-
访问元素
使用get(index)
方法可以根据索引获取元素。String firstElement = vector.get(0); // 获取第一个元素 "AA"
-
遍历 Vector
使用 for-each 循环或者传统的 for 循环可以遍历 Vector中的所有元素。for (String v : vector) { System.out.println(v); } // 或者使用传统的 for 循环 for (int i = 0; i < vector.size(); i++) { String v= vector.get(i); System.out.println(v); }
-
删除元素
使用remove(index)
方法可以根据索引删除ArrayList
中的元素,或使用remove(Object)
方法根据元素进行删除。vector.remove(2); // 删除索引 2 处的元素 "CC" vector.remove("BB"); // 删除元素 "BB"
-
其他常用方法
int size = vector.size(); // 获取集合中元素的个数 boolean isEmpty = vector.isEmpty(); // 判断集合是否为空 vector.clear(); // 清空集合中的所有元素