刷算法题经常需要用到数组和集合之间的相互转换,里面包含不少注意事项,这里做一个总结。
1、集合转换为数组
用List.toArray(T[] a)方法,代码如下:
public class Main {
public static void main(String[] args) throws Exception {
//创建一个包含元素1,2,3的list
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
//将ArrayList<Integer>转换为Integer []
Integer[] array = list.toArray(new Integer[0]);
for (Integer i: array) {
System.out.println(i);
}
}
}
运行结果:
1
2
3
注意,在这个案例中,list.toArray(new Integer[0]) 方法中传递的参数可以为new Integer[0]、new Integer[1]、new Integer[2]和new Integer[3],但是传递的数组长度不能大于3。例如传递参数为new Integer[4],运行结果为:
1
2
3
null
另外,数组类型必须是Integer,不能是int类型,否则会报错。
2、数组转换为集合
用Arrays.asList(T... a)方法,代码如下:
public class Main {
public static void main(String[] args) throws Exception {
Integer[] array = {1, 2, 3};
List<Integer> list = Arrays.asList(array);
System.out.println(list);
}
}
运行结果:
[1, 2, 3]
此外,还可以使用 List.of(),结果和上述一样。
public class Main {
public static void main(String[] args) throws Exception {
Integer[] array = {1, 2, 3};
List<Integer> list = List.of(array);
System.out.println(list);
}
}
注意,这里的list是定长的,不可以使用add()方法增加元素
public class Main {
public static void main(String[] args) throws Exception {
Integer[] array = {1, 2, 3};
List<Integer> list = Arrays.asList(array);//或者List.of(array)
list.add(4);
System.out.println(list);
}
}
上述代码会出现UnsupportedOperationException异常:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:147)
at com.company.Main.main(Main.java:9)
如果我们需要增加元素怎么办呢?可以借助List的构造方法来实现:
public class Main {
public static void main(String[] args) throws Exception {
Integer[] array = {1, 2, 3};
List<Integer> list = new ArrayList<>(Arrays.asList(array));
list.add(4);
System.out.println(list);
}
}
这样就不会报错了,结果如下:
[1, 2, 3, 4]
我们来看一下Arrays.asList(T... a)的源码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
返回的实际类型是ArrayList,但是只能用List来接收结果。至于为什么这个返回的结果不能add(),是因为这个ArrayList不是我们平时用的ArrayList吗,而是Arrays里面的一个内部类。而且这个内部类没有add,clear,remove方法,所以抛出的异常其实来自于AbstractList。