使用ArrayList内部的toArray方法,实现List<String>—->String[]
List接口的方法,ArrayList类,LinkedList类对该方法进行了实现。
由于参数和返回值带泛型,基本数据类型只能是包装类的对象,如Integer[]。
参数:T[] a,表示接收的数组,接收list中的每一个元素
如果a.length<size,就会新创建一个和list大小相同的数组,存储数据。
如果a.length>size,不会创建新数组,从索引0开始赋值到size的大小。
返回值:T[] a;表示返回的对象数组
调用:
String[] arr=list.toArray(new String[4]);
public <T> T[] toArray(T[] a)
示例
List<String> list=new ArrayList<>();
list.add("asdfadsg");
list.add("asdfasdf");
String[] arr=list.toArray(new String[4]);
for(String obj : arr){
System.out.println(obj);
}
底层使用Arrays.copyOf来创建新的数组和System.arraycopy复制,主要的异常错误是arraycopy时的/*java.lang.ArrayStoreException*/。由测试发现。
接收的对象可以是Object类型
。进行数组的创建和接收。体现了多态的特点。
接收的对象和list类型相同。
接收的对象是List类型的子类,这时需要向下转型,
进行数组的创建和接收。
接收的对象是List类型的父类,和Object区分是由于其底层逻辑判断不同。
由于是数组的复制,所以是深拷贝。
//测试代码
无关类型会报
/*java.lang.ArrayStoreException*/
T类型可以是Object类型
如果接收的对象是list的子类型 则必须添加子类的对象,否则/*java.lang.ArrayStoreException*/
List<Object> list1=new ArrayList<>();
list1.add(new Integer(1));
list1.add(new Integer(2));
Integer[] integers=list1.toArray(new Integer[0]);
for(Object i: integers){
System.out.println(i);
}
如果接收的对象是list的父类型
String[]—–>List<String>
使用的是Arrays.asList方法,底层调用ArrayList的构造函数,但是又有不同
其实是
调用Arrays中的静态内部类的构造函数
。既然调用了构造函数底层就是深拷贝。
参数是:T[] a表示要转化的数组,默认不能是用int[]类型等未封装的数组,如果需要使用,1、接收的对象需要是集合类型使用int[]作为泛型。2、将其转化为包装类
List<int[]> ints = Arrays.asList(new int[]{1, 2, 3});
返回值:List<T>代表接收的对象。
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
示例
Integer[] arr=new Integer[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;
List<Integer> integerList = Arrays.asList(arr);
List<Integer>—–>Integer[]
Integer[] arr=new Integer[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;
List<Integer> list1;
list1=Arrays.asList(arr);
Integer[] integers = list1.toArray(new Integer[0]);
for(Integer i: integers){
System.out.println(i);
}
Integer[]——>List<Integer>
List<Integer> transList=Arrays.asList(arr);
List<int[]> 转化为 int[][],二维数组可以作为参数,但int[]类型必须封装成Integer[],这里有一个疑点,
由于ArrayList中源码只有带泛型的重载toArray方法。没有int[][] 为参数的方法,所以int[]可以视为泛型?而int不行。
return list.toArray(new int[0][]);