将ArrayList转换为数组
方法1:利用循环语句将ArrayList中的元素添加到数组中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class ArrayListTest {
public static void main(String[] args) {
List<Integer> list =new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
int[] b=new int[list.size()];
for (int i=0;i<list.size();i++){
b[i]= list.get(i);
}
for (int s:b){
System.out.println(s);
}
}
}
|
方法2:使用ArrayList中的toArray
方法,将Arraylist转换为数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class ArrayListTest {
public static void main(String[] args) {
List<Integer> list =new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Integer[] a=new Integer[list.size()];//注意这里的数组类型为Integer,引用类型,而不是int,基本类型
list.toArray(a);
for (Integer s:a){
System.out.println(s);
}
}
}
|
这里需要注意的是ArrayList中的toArray方法,有两个重载方法
1
2
|
1.public Object[] toArray()
2.public <T> T[] toArray(T[] a)
|
对于public Object[] toArray()
返回的是一个Object数组
对于public <T> T[] toArray(T[] a)
能将list转化为你所需要类型的数组,当然我们用的时候会转化为与list内容相同的类型
对于第一种方法存在的局限性是,该方法只能够返回Object数组,而不能返回你所需要类型的数组,例如
1
2
3
4
5
6
7
8
9
10
11
|
List<Integer> list =new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Integer[] s=list.toArray();
for (Integer s1:s){
System.out.println(s);
}
|
会报错:
1
2
|
java: 不兼容的类型: java.lang.Object[]无法转换为java.lang.Integer[]//向下转型失败
表明只能够返回Object类型数组
|
第二种方法就比较方便,可以转换为我们想要的类型
1
2
3
4
5
6
7
8
9
10
11
12
|
List<Integer> list =new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Integer[] a=new Integer[list.size()];//注意这里的数组类型为Integer,引用类型,而不是int,基本类型
list.toArray(a);//会自动推断传入参数的类型
for (Integer s:a){
System.out.println(s);
}
|
但是如果是这样写
1
2
3
4
5
6
7
8
9
10
11
12
|
List<Integer> list =new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
int[] a=new int[list.size()];
list.toArray(a);
for (Integer s:a){
System.out.println(s);
}
|
会报错:
1
2
3
4
5
6
7
8
|
java: 对于toArray(int[]), 找不到合适的方法
方法 java.util.Collection.<T>toArray(java.util.function.IntFunction<T[]>)不适用
(无法推断类型变量 T
(参数不匹配; int[]无法转换为java.util.function.IntFunction<T[]>))
方法 java.util.List.<T>toArray(T[])不适用
(推论变量 T 具有不兼容的上限
等式约束条件:int
下限:java.lang.Object)
|
可以看出此时编译器无法推断出传入toArray中参数的类型,似乎传入的参数必须是引用类型(必须继承Object)
将数组转换为ArrayList
使用Arrays.asList
1
2
3
4
5
6
7
8
9
10
11
|
public class ArrayListTest02 {
public static void main(String[] args) {
String[] s={"1","2","3"};
List<String> list=new ArrayList<>();
list= Arrays.asList(s);
for (String a:list){
System.out.println(a);
}
}
}
|
不过通过list= Arrays.asList(s);
直接赋值存在的一个缺点是list无法添加或删除元素,例如
1
2
3
4
5
6
7
8
|
String[] s={"1","2","3"};
List<String> list=new ArrayList<>();
list= Arrays.asList(s);
for (String a:list){
System.out.println(a);
}
list.add("lll");//添加元素
|
会报错
1
2
3
4
|
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
at CollectionTest.ArrayListTest02.main(ArrayListTest02.java:22)
|
此时可以通过ArrayList的构造方法
1
2
|
public ArrayList(Collection<? extends E> c)
构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
|
进行转换,如
1
2
3
4
5
6
7
8
9
10
11
12
|
public class ArrayListTest02 {
public static void main(String[] args) {
String[] s={"1","2","3"};
List<String> list1=new ArrayList<>(Arrays.asList(s));
list1.add("lll");
for (String s1:list1){
System.out.println(s1);
}
}
}
|
此时可以添加/删除元素。