个人主页→VON
收录专栏→java从入门到起飞
目录
编辑
一、前言
二、List集合简要概述
三、List集合主要函数的应用
四、List集合的遍历
五、思考
一、前言
List集合与Collection集合的相同之处还是挺多的,不过有些小细节又不太一样,其中有一个挺有意思的地方,就是删除元素的那个地方,希望能够给大家讲明白。最近更新速度可能会特别的慢,希望大家多多理解。
二、List集合简要概述
在Java中,List
是一种常用的集合类型,它允许存储任意类型的对象,并且提供了按照插入顺序来维护元素的有序集合。List
接口是 Java 集合框架的一部分,定义了可以用于任何列表实现的一组方法。List
的主要实现包括 ArrayList
、LinkedList
和 Vector
(以及它的子类 Stack
),每种实现都有其特定的性能特点和使用场景。
-
ArrayList:实现了可变大小的数组,它允许在列表中间进行快速随机访问,但是插入和删除操作(特别是在列表的中间位置)会相对较慢,因为这需要重新分配数组的大小并移动元素。
-
LinkedList:使用双向链表来存储元素,这意味着它可以在 O(1) 时间复杂度内插入或删除元素,但是访问元素的速度比 ArrayList 慢,因为它需要从头开始遍历直到找到目标节点。
-
Vector:类似于 ArrayList,但是 Vector 中的方法是同步的(synchronized),这意味着它是线程安全的,可以用于多线程环境。然而,由于同步带来的性能开销,Vector 在非同步环境中通常不如 ArrayList 性能好。
除了这些基本的实现之外,还有一些常见的视图类,比如 Collections.unmodifiableList()
返回一个不可修改的列表,这样可以创建只读的数据结构。
List
接口提供了一系列方法来操作列表中的元素,例如添加(add()
)、删除(remove()
)、查找(get()
)、替换(set()
)等。此外,还有 size()
方法来获取列表中元素的数量,以及 isEmpty()
方法来检查列表是否为空等等。
使用 List 集合时,可以根据具体的应用需求选择最适合的实现方式。例如,如果你需要频繁地插入和删除元素,那么 LinkedList 可能是最好的选择;如果你需要频繁地访问列表中的元素并且不太关心插入和删除的效率,那么 ArrayList 将是一个更好的选择。
三、List集合主要函数的应用
package ArrayDemo.ListDemo;
import java.util.ArrayList;
import java.util.List;
public class A01_ListDemo01 {
public static void main(String[] args) {
// 1.创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
// 2.打印集合
System.out.println(list);// [a, b, c, d, e]
// 3.在集合中指定位置添加元素
// void add(int index,E element)
// 原来索引上的元素会依次后移
list.add(2,"aaa");
System.out.println(list);// [a, b, aaa, c, d, e]
// 4.删除指定索引的元素,返回被删除的元素
// E remove(int index)
list.remove(1);
System.out.println(list);// [a, aaa, c, d, e]
// 5.修改指定位置的元素,返回被修改的元素
// E set(int index, E element)
list.set(1,"bbb");
System.out.println(list);// [a, bbb, c, d, e]
// 6.返回指定索引处的元素
// E get(int index)
System.out.println(list.get(2));// c
}
}
list集合中主要用到的函数就这么几个,需要注意的地方我都已经添加了注释,希望大家能够更好的去理解。
四、List集合的遍历
package ArrayDemo.ListDemo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class A03_ListDemo03 {
public static void main(String[] args) {
/*
List集合的五种遍历方式:
1.迭代器
2.列表迭代器
3.增强for
4.Lambda表达式
5.普通for循环
*/
// 1.创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
// 2.迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("---------------------------------");
// 3.列表迭代器
// 获取一个列表迭代器对象,里面的指针也是默认从0开始的
// 额外添加了一个方法:在遍历的过程中,可以添加元素
ListIterator<String> it1 = list.listIterator();
while(it1.hasNext()){
String str = it1.next();
if("b".equals(str)){
it1.add("aaa");
}
}
System.out.println(list);
System.out.println("---------------------------------");
// 4.增强for
for (String s : list) {
System.out.println(s);
}
System.out.println("---------------------------------");
// 5.Lambda表达式
// forEash方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素
// 并把集合中的元素传递给accept方法
list.forEach(s-> System.out.println(s));
System.out.println("---------------------------------");
// 6.普通for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("---------------------------------");
}
}
说句不好听的,我个人感觉熟练运用一种就可以了,从我的角度出发,我感觉增强for循环挺好用的,毕竟for循环用的比较多,所以对for情有独钟。
五、思考
不知道大家有没有思考过这个问题,如果集合中全都是数字,应该怎样去删除这个元素呢?
应该都能看到remove的源码中传入的参数是index,所以会优先根据下标进行删除。
解决方法: