回过头来复习Java基础的时候,发现当初这一块有不少细节都没有掌握到,如今记录下来,以更好的夯实基础java
第一种方式是以无参形式直接返回一个Object[]类型的数组,不过这种方法会致使丢失类型信息,故使用较少。数组
public class Main {
public static void main(String[] args) {
List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Object[] integer=list.toArray();
System.out.println(integer.getClass());
for (int i=0;i<integer.length;i++){
System.out.println(i);
}
}
}
复制代码
输出结果bash
0
1
2
3
class [Ljava.lang.Object;
复制代码
第二种方式是给toArray(T[])
传入一个类型相同的Array
,List
内部自动把元素复制到传入的Array
中:ide
public class Main {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(3);
list.add(1);
Integer[] idex=list.toArray(new Integer[3]);
for (Integer i:idex){
System.out.println(i);
}
}
}
复制代码
输出结果:工具
3
1
null
复制代码
这种方式有两个注意点:spa
一、传入数组大小问题。 当传入的数组不够大时,List内部会建立一个恰好足够大的数组,填充后返回,当传入的数组比List元素还要多的时候,填充完元素,剩下的一概为null。code
最好的方法是cdn
Integer[] idex=list.toArray(new Integer[list.size()])
复制代码
二、传入类型匹配问题。blog
<T> T[] toArray(T[] a);
复制代码
toArray中的泛型通配符为T,因此能够传入其余类型的数组。以Number类型为例:接口
public class Main {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(3);
list.add(1);
Number[] idex=list.toArray(new Number[3]);
for (Number i:idex){
System.out.println(i);
}
}
}
复制代码
输出结果
3
1
null
复制代码
若类型不匹配,则抛出ArrayStoreException异常。
public class Main {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(3);
list.add(1);
Float[] idex=list.toArray(new Float[3]);
for (Float i:idex){
System.out.println(i);
}
}
}
复制代码
Exception in thread "main" java.lang.ArrayStoreException
复制代码
数组转换为集合使用的是数组的工具类Arrays的静态方法asList。查看API文档可知该方法返回由指定数组支持的固定大小的列表。
public class Main {
public static void main(String[] args) {
String[] name=new String[]{"Enoch","Star"};
List<String> list=Arrays.asList(name);
System.out.println(list);
}
}
复制代码
输出结果:
[Enoch, Star]
复制代码
须要注意的是,返回的List不必定就是ArrayList或是LinkedList,该接口返回的是一个只读的List。
当对其调用add()、remove()会抛出UnsupportedOperationException。
由于这个新集合是由数组转换过来的,那么该集合就表示原来的数组,因此对集合的操做就是对数组的操做。那么添加元素会致使原数组扩容,那么就不能表示原来的数组了。因此不容许向该集合添加新元素了。
例:
public class Main {
public static void main(String[] args) {
String[] name=new String[]{"Enoch","Star"};
List<String> list=Arrays.asList(name);
System.out.println(list);
list.set(0,"cool");
System.out.println(list);
list.add("cool");
}
}
复制代码
输出结果
[Enoch, Star]
[cool, Star]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
复制代码
那么如何实现添加元素这类功能?
咱们经过实验知道数组转化为List是不能增删数据的,若是须要增删,能够利用空集合调用addAll方法将转化后的集合所有添加新集合就能够进行操做了。
public class Main {
public static void main(String[] args) {
String[] name=new String[]{"Enoch","Star"};
List<String> list=Arrays.asList(name);
List<String> newList=new ArrayList<>();
newList.addAll(list);
System.out.println(newList);
newList.add("cool");
System.out.println(newList);
}
}
复制代码
或
public class Main {
public static void main(String[] args) {
String[] name=new String[]{"Enoch","Star"};
List<String> list=Arrays.asList(name);
List<String> newList=new ArrayList<>(list);
System.out.println(newList);
newList.add("cool");
System.out.println(newList);
}
}
复制代码
输出结果
[Enoch, Star]
[Enoch, Star, cool]
复制代码