Java列表– Java列表
Java List是有序集合。
Java List是扩展Collection接口的接口。
Java List提供对可以插入元素的位置的控制。
您可以按元素索引访问元素,也可以在列表中搜索元素。
Java列表
有关Java List的一些重点是:
Java List接口是Java Collections Framework的成员。
列表允许您添加重复的元素。
列表使您可以拥有"空"元素。
List接口在Java 8中具有许多默认方法,例如replaceAll,sort和spliterator。
列表索引从0开始,就像数组一样。
List支持泛型,我们应该尽可能使用它。
将泛型与List一起使用将避免在运行时出现ClassCastException。
Java列表类图
Java List接口扩展了Collection接口。
Collection接口externs可迭代的接口。
一些最常用的List实现类是ArrayList,LinkedList,Vector,Stack,CopyOnWriteArrayList。
AbstractList提供了List接口的基本实现,以减少实现List的工作量。
Java列表方法
一些有用的Java List方法是:
int size():获取列表中元素的数量。
boolean isEmpty():检查列表是否为空。
boolean contains(Object o):如果此列表包含指定的元素,则返回true。
Iterator <E> iterator():以适当的顺序返回此列表中元素的迭代器。
Object [] toArray():按正确顺序返回包含此列表中所有元素的数组
boolean add(E e):将指定的元素追加到此列表的末尾。
boolean remove(Object o):从此列表中删除第一次出现的指定元素。
boolean keepAll(Collection <?> c):仅保留此列表中包含在指定集合中的元素。
void clear():从列表中删除所有元素。
E get(int index):返回列表中指定位置的元素。
E set(int index,E element):将列表中指定位置的元素替换为指定的元素。
ListIterator <E> listIterator():返回列表中元素的列表迭代器。
List <E> subList(int fromIndex,int toIndex):返回此列表中指定的fromIndex(包括在内)和toIndex(不包括在内)之间的部分视图。
返回列表由该列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。
Java 8中添加到List的一些默认方法是:
默认void replaceAll(UnaryOperator <E>运算符):使用将该运算符应用于该元素的结果替换此列表中的每个元素。
默认void sort(Comparator <super E> c):根据指定Comparator的顺序对列表进行排序。
默认的Spliterator <E> spliterator():在此列表中的元素上创建一个Spliterator。
列出的Java数组
我们可以使用Arrays类来获取列表的数组视图。
但是,我们将无法对该列表进行任何结构修改,它将抛出java.lang.UnsupportedOperationException。
因此,最好的方法是使用for循环遍历数组来创建列表。
下面是一个简单的示例,显示了如何将java数组正确转换为列表。
package com.theitroad.examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ArrayToList { public static void main(String[] args) { String[] vowels = {"a","e","i","o","u"}; List<String> vowelsList = Arrays.asList(vowels); System.out.println(vowelsList); /** * List is backed by array, we can't do structural modification * Both of the below statements will throw java.lang.UnsupportedOperationException */ //vowelsList.remove("e"); //vowelsList.clear(); //using for loop to copy elements from array to list, safe for modification of list List<String> myList = new ArrayList<>(); for(String s : vowels){ myList.add(s); } System.out.println(myList); myList.clear(); } }
Java列表数组
一个简单的示例,显示将列表转换为数组的正确方法。
package com.theitroad.examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ListToArray { public static void main(String[] args) { List<String> letters = new ArrayList<String>(); //add example letters.add("A"); letters.add("B"); letters.add("C"); //convert list to array String[] strArray = new String[letters.size()]; strArray = letters.toArray(strArray); System.out.println(Arrays.toString(strArray)); //will print "[A, B, C]" } }
Java列表排序
有两种方式对列表进行排序。
我们可以使用Collections类进行自然排序,也可以使用List sort()方法并使用自己的Comparator进行排序。
下面是一个简单的Java列表排序示例。
package com.theitroad.examples; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class ListSortExample { public static void main(String[] args) { List<Integer> ints = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) ints.add(random.nextInt(1000)); //natural sorting using Collections class Collections.sort(ints); System.out.println("Natural Sorting: "+ints); //My custom sorting, reverse order ints.sort((o1,o2) -> {return (o2-o1);}); System.out.println("Reverse Sorting: "+ints); } }
下面给出了示例输出。
由于我使用Random来生成列表元素,因此每次都会有所不同。
Natural Sorting: [119, 273, 388, 450, 519, 672, 687, 801, 812, 939] Reverse Sorting: [939, 812, 801, 687, 672, 519, 450, 388, 273, 119]
Java列表常用操作
在Java列表上执行的最常见操作是添加,删除,设置,清除,大小等。
下面是一个简单的Java列表示例,显示了常用方法的用法。
package com.theitroad.examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ListExample { public static void main(String args[]) { List<String> vowels= new ArrayList<String>(); //add example vowels.add("A"); vowels.add("I"); //let's insert E between A and I vowels.add(1,"E"); System.out.println(vowels); List<String> list = new ArrayList<String>(); list.add("O");list.add("U"); //appending list elements to letters vowels.addAll(list); System.out.println(vowels); //clear example to empty the list list.clear(); //size example System.out.println("letters list size = "+vowels.size()); //set example vowels.set(2, "E"); System.out.println(vowels); //subList example vowels.clear();vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O"); list = vowels.subList(0, 2); System.out.println("letters = "+vowels+", list = "+list); vowels.set(0, "A"); System.out.println("letters = "+vowels+", list = "+list); list.add("U"); System.out.println("letters = "+vowels+", list = "+list); } }
上面的java列表示例程序的输出是;
[A, E, I] [A, E, I, O, U] letters list size = 5 [A, E, E, O, U] letters = [E, E, I, O], list = [E, E] letters = [A, E, I, O], list = [A, E] letters = [A, E, U, I, O], list = [A, E, U]
Java List迭代器
下面是一个简单的示例,显示了如何在Java中迭代列表。
package com.theitroad.examples; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListIteratorExample { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for(int i=0; i<5; i++) list.add(i); Iterator<Integer> iterator = list.iterator(); //simple iteration while(iterator.hasNext()){ int i = (int) iterator.next(); System.out.print(i + ", "); } System.out.println("\n"+list); //modification of list using iterator iterator = list.iterator(); while(iterator.hasNext()){ int x = (int) iterator.next(); if(x%2 ==0) iterator.remove(); } System.out.println(list); //changing list structure while iterating iterator = list.iterator(); while(iterator.hasNext()){ int x = (int) iterator.next(); //ConcurrentModificationException here if(x==1) list.add(10); } } }
上面的java列表迭代器程序的输出是;
0, 1, 2, 3, 4, [0, 1, 2, 3, 4] [1, 3] Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at com.theitroad.examples.ListIteratorExample.main(ListIteratorExample.java:34)