java中的数组与集合相互转换

java中的数组与集合相互转换

1.数组转换成集合

数组转换为集合,用Arrays.asList方法。

public static void main(String[] args) {
        String[] arr = {"a","b","c","d","e"};
        List<String> list =  Arrays.asList(arr);
        System.out.println(list);   // List的toString方法
    }

// 输出结果:
[a, b, c, d, e]

如果给转换过来的集合添加一个元素呢?

public static void main(String[] args) {
        String[] arr = {"a","b","c","d","e"};
        List<String> list =  Arrays.asList(arr);
        list.add("f");
        System.out.println(list);
    }

// 输出结果:
Exception in thread "main" java.lang.UnsupportedOperationException

报错了~

其实,由数组转换过来的集合,并不能添加或删除元素,但是可以用集合的其他方法,因为集合比数组的方法丰富很多。

再试一个基本数据类型的数组:

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        List list = Arrays.asList(arr);
        System.out.println(list);
    }

//输出结果:
[[I@74a14482]

奇怪了,怎么不是[1,2,3,4,5]?而是内存地址?

原因是因为,基本数据类型的数组转换为集合时,会将整个数组当作一个对象来转换的!

如果加上泛型就很容易知道错误了。

List<int> list = Arrays.asList(arr);   // 编译的时候就报错了。
List<int[]> list = Arrays.asList(arr);   // 这样就没有报错,可以知道集合里面的是数组对象,数组没有重写toString方法,自然的,打印数组对象就出现了内存地址了。

如果非要把基本数据类型的数组转换为集合,而且打印符合我们的预期呢?

public static void main(String[] args) {
        Integer[] arr = {1,2,3,4,5};
        List<Integer> list = Arrays.asList(arr);
        System.out.println(list);
    }

2.集合转换成数组

集合转换成数组用Collection接口的toArray方法。

<T> T[]    toArray(T[] a)    返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型

public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        /*当集合转换数组时,数组长度如果小于等于集合的size时,转换后的数组长度等于集合的size。
        如果数组的长度大于size,分配的数组长度就和指定长度一样,多余的是null
         */
        String[] arr = list.toArray(new String[0]);
        for (String s:arr) {
            System.out.println(s);
        }
    }