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

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

相关推荐
【D'accumulation】31 分钟前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
试行1 小时前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe1 小时前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把1 小时前
Java基础之IO流
java·开发语言
小菜yh1 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.1 小时前
Java键盘输入语句
java·开发语言
浅念同学1 小时前
算法.图论-并查集上
java·算法·图论
立志成为coding大牛的菜鸟.1 小时前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞1 小时前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
ahauedu2 小时前
案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值
数据结构·list