集合系列(十九) -List与数组互转操作介绍

一、数组转List

方式一

通过 Arrays.asList(strArray) 方式,将数组转换List,但不能对List增删,只能查改,否则抛异常,例子如下:

java 复制代码
public static void main(String[] args) {
        //创建一个字符串数组
        String[] strArray = new String[]{"a","b","c"};
        //数组转化成List
        List<String> strList = Arrays.asList(strArray);
        System.out.println("转化后的List:"+strList);

        //向List中添加内容
        strList.add("d");
        System.out.println(strList);
}

输出结果:

java 复制代码
转化后的List:[a, b, c]
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at com.example.container.d.TestList.main(TestList.java:16)

为什么会抛异常呢?

这是因为通过Arrays.asList(strArray),返回的对象是java.util.Arrays.ArrayList,并非是java.util.ArrayList,因为java.util.Arrays.ArrayList并没有add()remove()方法,所以调用add()方法会报错!

方式二

既然java.util.Arrays.ArrayListjava.util.ArrayList不一样,那么就将java.util.Arrays.ArrayList转为java.util.ArrayList,方法如下:

java 复制代码
public static void main(String[] args) {
        //创建一个字符串数组
        String[] strArray = new String[]{"a","b","c"};
        //通过构造方法,将数组转化成List
        List<String> strList = new ArrayList<String>(Arrays.asList(strArray));
        System.out.println("转化后的List:"+strList);

        //向List中添加内容
        strList.add("d");
        System.out.println(strList);
}

输出结果:

java 复制代码
转化后的List:[a, b, c]
[a, b, c, d]

此时就没啥问题了。

方式三(推荐使用)

除了方式二以外,还有一种方法,通过Collections.addAll()进行操作,也如下:

java 复制代码
public static void main(String[] args) {
        //创建一个字符串数组
        String[] strArray = new String[]{"a","b","c"};
        //创建一个固定大小的List
        List<String> strList = new ArrayList<String>(strArray.length);
        //通过Collections类将数组转化成List
        Collections.addAll(strList,strArray);
        System.out.println("转化后的List:"+strList);

        //向List中添加内容
        strList.add("d");
        System.out.println(strList);
}

输出结果:

java 复制代码
转化后的List:[a, b, c]
[a, b, c, d]

打开Collections.addAll底层源码,如下:

java 复制代码
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
        boolean result = false;
        for (T element : elements)
            result |= c.add(element);
        return result;
}

其实就是遍历数组,然后添加到集合中,最高效的一种方法,推荐使用!

方式四(推荐使用)

使用Stream中的Collector收集器来转化,需要jdk1.8支持,内容如下:

java 复制代码
public static void main(String[] args) {
        //创建一个字符串数组
        String[] strArray = new String[]{"a","b","c"};
        //转换后的List 属于 java.util.ArrayList 能进行正常的增删查操作
        List<String> strList = Stream.of(strArray).collect(Collectors.toList());
        System.out.println("转化后的List:"+strList);

        //向List中添加内容
        strList.add("d");
        System.out.println(strList);
}

输出结果:

java 复制代码
转化后的List:[a, b, c]
[a, b, c, d]

这种方式,也比较推荐,前提是jdk需要升级到1.8!

二、List转数组

方式一

使用list.toArray不带参数的方法,转化后的返回值类型为Object,如果强转会抛异常!

java 复制代码
public static void main(String[] args) {
        //创建一个List
        List<String> strList = new ArrayList<String>();
        strList.add("a");
        strList.add("b");
        strList.add("c");

        //将List转换成数组
        Object[] objArray = strList.toArray();
        System.out.println("objArray:" + JSONArray.toJSON(objArray));

        //将List强制转换成String
        String[] strArray = (String[])strList.toArray();
        System.out.println("strArray:" + JSONArray.toJSON(strArray));
}

输出结果:

java 复制代码
objArray:["a","b","c"]
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
    at com.example.container.d.Test2List.main(Test2List.java:24)

使用ArrayList.toArray不带参数的方法,默认返回的是Object类型,如果强制转换会抛java.lang.ClassCastException异常!

ArrayList.toArray(),源码如下:

java 复制代码
public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
}
方式二(推荐使用)

使用list.toArray带参数进行转换,内容如下:

java 复制代码
public static void main(String[] args) {
        //创建一个List
        List<String> strList = new ArrayList<String>();
        strList.add("a");
        strList.add("b");
        strList.add("c");

        //将List转换成String,指定返回数组类型并指定大小
        String[] strArray = strList.toArray(new String[strList.size()]);
        System.out.println("strArray:" + JSONArray.toJSON(strArray));
}

输出结果:

java 复制代码
strArray:["a","b","c"]

ArrayList.toArray()的带参方法,在创建数组的时候指定数组的长度,最好与集合size保持一致,jdk 源码如下:

java 复制代码
public <T> T[] toArray(T[] a) {
    if (a.length < size)
        // Make a new array of a's runtime type, but my contents:
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

三、写到最后

最近无意间获得一份阿里大佬写的技术笔记,内容涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记

不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!

相关推荐
徐*红12 分钟前
java 线程池
java·开发语言
尚学教辅学习资料13 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
2401_8576363913 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
1 9 J15 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship15 分钟前
Java面试题(2)
java·开发语言
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
霖雨3 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404193 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言