Java-List和数组之间的转化

  • Post author:
  • Post category:java


使用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][]);



版权声明:本文为m0_46735209原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。