public class Main {
public static void main(String[] args) {
//list 转换为Array
List<Integer> integers = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
Integer[] i = integers.toArray(new Integer[0]);
for (Integer s :i){
System.out.print(s);
}
System.out.println();
// System.out.println(Arrays.toString(i)); //效果和上面一样
//array 转换为list
Integer[] i2 = {1,2,3,4,5,6};
List<Integer> list = Arrays.asList(i2);
System.out.println(list);
}
}
输出:
12345
[1, 2, 3, 4, 5, 6]
//反过来,把Array变为List就简单多了,通过List.of(T...)方法最简单
//对于JDK 11之前的版本,可以使用Arrays.asList(T...)方法把数组转换成List,如上面代码所示
Integer[] array = { 1, 2, 3 };
List<Integer> list = List.of(array);
List<Integer> list = Arrays.asList(array);
创建List
public class MM {
public static void main(String[] args) {
List<Integer> linkedList = new LinkedList<>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(4);
Iterator<Integer> iterator = linkedList.iterator();
while (iterator.hasNext()){
Integer i = iterator.next();
System.out.print(i);
}
}
}
1234
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
遍历List
和数组类型,我们要遍历一个List,完全可以用for循环根据索引配合get(int)方法遍历:
但这种方式并不推荐,一是代码复杂,二是因为get(int)方法只有ArrayList的实现是高效的,换成LinkedList后,索引越大,访问速度越慢
public class MM {
public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
for (int i =0;i<arrayList.size();i++){
Integer s = arrayList.get(i);
System.out.print(s);
}
}
}
1234
public class MM {
public static void main(String[] args) {
List<Integer> linkedList = new LinkedList<>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(4);
Iterator<Integer> iterator = linkedList.iterator();
while (iterator.hasNext()){
Integer i = iterator.next();
System.out.print(i);
}
}
}
1234
通过Iterator遍历List永远是最高效的方式。并且,由于Iterator遍历是如此常用,所以,Java的for each循环本身就可以帮我们使用Iterator遍历。把上面的代码再改写如下:
public class MM {
public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
for (Integer i:arrayList) {
System.out.print(i);
}
}
}
实际上,只要实现了Iterable接口的集合类都可以直接用for each循环来遍历,Java编译器本身并不知道如何遍历集合对象,但它会自动把for each循环变成Iterator的调用,原因就在于Iterable接口定义了一个Iterator
对于List ,有个重载的addAll()方法,可以在 某list中间插入新的列表,
而不是用collection中的addAll()将其只能插到队尾
Iterator
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。
只能向后遍历
import java.util.*;
public class TestIterator {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
System.out.println("Before iterate : " + a);
Iterator<String> it = a.iterator();
while (it.hasNext()) {
String t = it.next();
if ("bbb".equals(t)) {
it.remove();
}
}
System.out.println("After iterate : " + a);
}
}
ListIterator
双向移动(向前/向后遍历).
产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.
可以使用set()方法替换它访问过的最后一个元素.
可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素.
public class TestListIterator{
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
System.out.println("Before iterate : " + a);
ListIterator<String> it = a.listIterator();
while (it.hasNext()) {
System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
}
while (it.hasPrevious()) {
System.out.print("it.previous()= "+it.previous() + " ");
System.out.println();
}
System.out.println();
//调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
it = a.listIterator(1);
while (it.hasNext()) {
String t = it.next();
System.out.println(t);
if ("ccc".equals(t)) {
it.set("nnn");
} else {
it.add("kkk");
}
}
System.out.println("After iterate : " + a);
}
}
Before iterate : [aaa, bbb, ccc]
aaa, 0, 1
bbb, 1, 2
ccc, 2, 3
it.previous()= ccc
it.previous()= bbb
it.previous()= aaa
bbb
ccc
After iterate : [aaa, bbb, kkk, nnn]