Java列表– Java列表

时间:2020-02-23 14:36:32  来源:igfitidea点击:

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)