Java.util.List 是 Collection 的子接口。它是一个有序集合,可以存储重复的值。由于List保留可插入元素的位置的控制,因此它可以按索引访问元素,也可以搜索列表中的元素。
关于Java List的一些重要特点有:
Java List接口扩展了 Collection 接口。 Collection 接口又扩展了 Iterable接口。
一些最常用的 List 实现类有 ArrayList,LinkedList,Vector,Stack,CopyOnWriteArrayList。
AbstractList 提供了List接口的重要方法实现,以减少实现List的工作量。
1、default void replaceAll(UnaryOperator operator): 将该列表的每个元素替换为将运算符应用于该元素的结果。 当抛出错误或运行时异常时,将返回给调用者。
实现要求:
对于此列表,默认实现等效于:
final ListIterator li = list.listIterator();
while (li.hasNext()) {
li.set(operator.apply(li.next()));
}
如果列表的 list-iterator 不支持set操作,则在替换第一个元素时将抛出UnsupportedOperationException。
2、default void sort(Comparator super E> c): 根据指定的比较器对此列表进行排序。此列表中的所有元素必须使用指定的比较器进行相互比较(即,c.compare(e1,e2)不得为列表中的任何元素e1和e2抛出 ClassCastException)。
如果指定的比较器为null,则此列表中的所有元素都必须实现Comparable接口,并且应使用元素的自然顺序。
默认实现获取包含此列表中所有元素的数组,对数组进行排序,并迭代此列表,从数组中的相应位置重置每个元素。 (这样可以避免因尝试对列表进行排序而导致 n^2 log(n) 的性能。)
3、default Spliterator spliterator(): 在此列表中的元素上创建Spliterator。
我们可以使用Arrays 类将数组转换为列表,但是我们无法对列表进行任何结构修改,它将抛出 java.lang.UnsupportedOperationException。所以最好的方法是使用for循环来迭代数组来创建列表。
下面是一个简单示例,展示了如何正确地将java数组转换为列表。
public static void main(String[] args) {
String[] hellos = {"h","e","l","l","o"};
List hellosList = Arrays.asList(hellos);
System.out.println("Arrays.asList 数组转为列表:"+hellosList);
/**
* List是由数组支持的,我们不能做结构修改
* 以下两个语句都将抛出java.lang.UnsupportedOperationException
*/
//hellosList.remove("l");
//hellosList.clear();
//使用for循环将元素从数组复制到列表,可以安全地修改列表
List myList = new ArrayList<>();
for(String s : hellos){
myList.add(s);
}
System.out.println("for 循环遍历元素添加到新列表:"+myList);
myList.clear();
}
输出结果:
Arrays.asList 数组转为列表:[h, e, l, l, o]
for 循环遍历元素添加到新列表:[h, e, l, l, o]
一个简单的示例,将列表转换为数组的正确方法。
public static void main(String[] args) {
List letters = new ArrayList();
letters.add("A");
letters.add("B");
letters.add("C");
//将列表转换为数组
String[] strArray = new String[letters.size()];
strArray = letters.toArray(strArray);
System.out.println(Arrays.toString(strArray));
}
有两种方法可以对列表进行排序。我们可以使用 Collections 类进行自然排序,或者我们可以使用List sort()方法并使用我们自己的 Comparator 进行排序。
下面是java列表排序的一个简单示例:
public static void main(String[] args) {
List ints = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
ints.add(random.nextInt(1000));
}
//使用 Collections 对列表进行自然排序
Collections.sort(ints);
System.out.println("Collections 自然排序: " + ints);
//自定义比较器,逆序排序
ints.sort((o1, o2) -> {
return (o2 - o1);
});
System.out.println("自定义 Comparator 逆序排序: " + ints);
}
输出结果:
Collections 自然排序: [18, 198, 501, 610, 705, 761, 824, 862, 883, 992]
自定义 Comparator 逆序排序: [992, 883, 862, 824, 761, 705, 610, 501, 198, 18]
在java列表上执行的最常见操作是add, remove, set, clear, size 等。
下面一个简单的java列表示例,展示了常用的方法用法:
public static void main(String args[]) {
List vowels = new ArrayList();
//add
vowels.add("A");
vowels.add("I");
//将元素插入到指定位置
vowels.add(1, "E");
System.out.println("将元素插入到指定位置:" + vowels);
List list = new ArrayList();
list.add("O");
list.add("U");
//将集合 list 的所有元素,追加到集合 vowels 中
vowels.addAll(list);
System.out.println("集合元素追加到另一个集合:" + vowels);
//清空集合元素
list.clear();
//集合元素大小
System.out.println("vowels 大小: " + vowels.size());
//替换指定位置的元素
vowels.set(2, "E");
System.out.println("将索引位置为2的元素替换为 E:" + vowels);
//subList
vowels.clear();
vowels.add("E");
vowels.add("E");
vowels.add("I");
vowels.add("O");
//截取集合 vowels 中索引位置从 0 到 索引位置为 1 的元素
list = vowels.subList(0, 2);
System.out.println("vowels: " + vowels + ", vowels.subList(0, 2):" + list);
//替换集合 vowels 中索引位置为 0 的元素
vowels.set(0, "A");
System.out.println("vowels: " + vowels + ", vowels.set(0, A) " + list);
list.add("U");
System.out.println("vowels: " + vowels + ", list:" + list);
}
输出结果:
将元素插入到指定位置 vowels.add(1,E):[A, E, I]
集合元素追加到另一个集合:[A, E, I, O, U]
vowels 大小: 5
将索引位置为2的元素替换为 E:[A, E, E, O, U]
vowels: [E, E, I, O], vowels.subList(0, 2):[E, E]
vowels: [A, E, I, O], vowels.set(0, A) [A, E]
vowels: [A, E, U, I, O], list:[A, E, U]
下面是一个简单的例子,展示了如何在java中迭代列表。
public static void main(String[] args) {
List list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(i);
}
Iterator iterator = list.iterator();
//简单遍历
System.out.print("简单迭代遍历:");
while (iterator.hasNext()) {
int i = iterator.next();
System.out.print(i + ", ");
}
//使用迭代器修改列表
iterator = list.iterator();
while (iterator.hasNext()) {
int x = iterator.next();
if (x % 2 == 0) {
iterator.remove();
}
}
System.out.println();
System.out.println("使用迭代器删除偶数:"+list);
//迭代时改变列表结构
iterator = list.iterator();
while (iterator.hasNext()) {
int x = iterator.next();
//ConcurrentModificationException
if (x == 1) {
list.add(10);
}
}
}
输出结果:
简单迭代遍历:0, 1, 2, 3, 4,
使用迭代器删除偶数:[1, 3]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.lkf.collection.list.ListIteratorExample.main(ListIteratorExample.java:44)