集合系列(十九) -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 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记

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

相关推荐
渣哥1 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧2 小时前
Spring Secutiy基本原理及工作流程
java
Java水解3 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆5 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学6 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole6 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊6 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端
程序员鱼皮6 小时前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码