Java中数组和List相互转换的常用方式

举报
lwq1228 发表于 2021/09/17 10:25:08 2021/09/17
【摘要】 Java中数组和List相互转换的常用方式

一、数组转List

1、方式一:循环遍历

这种方式比较简单,也是最容易想到和最常用的方式,但是过程会繁琐一点,该方式转换后得到List后,可以对List进行增删改操作。

测试代码:

/**
 * 使用for循环
 */
@Test
public void testArrayToList1() {
    String[] strArr = new String[]{"语文", "数学", "英语", "物理"};
    List<String> strList = new ArrayList<>();
    // 核心转换代码
    for (String value : strArr) {
        strList.add(value);
    }
    System.out.println("转换得到的List为:" + strList);
    // 对转换后的List进行增、删、改
    strList.add("化学");
    System.out.println("添加数据后的List为:" + strList);
    strList.remove("英语");
    System.out.println("删除数据后的List为:" + strList);
    strList.set(2, "生物");
    System.out.println("修改数据后的List为:" + strList);
}

测试结果:

2、方式二:使用数组工具类 Arrays.asList()方法

该方式通过使用 Arrays.asList(strArray)方法将数组转换为List,但是转换后的List不能进行增删操作,只能进行查改,否则抛异常。

测试代码:

/**
 * 使用Arrays.asList(strArray)
 */
@Test
public void testArrayToList2() {
    String[] strArr = new String[]{"语文", "数学", "英语", "物理"};
    // 核心转换代码
    List<String> strList = Arrays.asList(strArr);
    System.out.println("转换得到的List为:" + strList);
    // 对转换后的List进行改、增、删
    strList.set(2, "生物");
    System.out.println("修改数据后的List为:" + strList);
    // strList.add("化学");
    // System.out.println("添加数据后的List为:" + strList);
    // strList.remove("英语");
    // System.out.println("删除数据后的List为:" + strList);
}

测试结果:

执行程序,发现程序在strList.add("化学")处,抛出异常:UnsupportedOperationException

原因解析:
Arrays.asList(strArray)返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,它并非java.util.ArrayList类。java.util.Arrays.ArrayList类具有set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。

使用场景:

Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。

3、方式三:使用ArrayList的构造器

通过ArrayList的构造器,将Arrays.asList(strArray)的返回值由java.util.Arrays.ArrayList转为java.util.ArrayList

测试代码:

/**
 * 使用ArrayList构造器
 */
@Test
public void testArrayToList3() {
    String[] strArr = new String[]{"语文", "数学", "英语", "物理"};
    // 核心转换代码
    List<String> strList = new ArrayList<>(Arrays.asList(strArr));
    System.out.println("转换得到的List为:" + strList);
    // 对转换后的List进行改、增、删
    strList.set(2, "生物");
    System.out.println("修改数据后的List为:" + strList);
    strList.add("物理");
    System.out.println("添加数据后的List为:" + strList);
    strList.remove("英语");
    System.out.println("删除数据后的List为:" + strList);
}

测试结果:

使用场景:

需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。

4、方式四:使用集合工具类Collections.addAll()方法

通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素转为二进制,然后添加到List中,这是最高效的方法。

测试代码:

/**
 * 使用集合工具类Collections.addAll()方法
 */
@Test
public void testArrayToList4() {
    String[] strArr = new String[]{"语文", "数学", "英语", "物理"};
    // 核心转换代码
    List<String> strList = new ArrayList<>(strArr.length);
    Collections.addAll(strList, strArr);
    System.out.println("转换得到的List为:" + strList);
    // 对转换后的List进行改、增、删
    strList.set(2, "生物");
    System.out.println("修改数据后的List为:" + strList);
    strList.add("化学");
    System.out.println("添加数据后的List为:" + strList);
    strList.remove("物理");
    System.out.println("删除数据后的List为:" + strList);
}

测试结果:

使用场景:

需要在将数组转换为List后,对List进行增删改查操作,在List的数据量巨大的情况下,优先使用,可以提高操作速度。

5、方式五:使用stream的方式

如果是java8以上的版本,可以使用stream的方式进行转换,该方式转换后的List也是支持增删改操作的。

测试代码:

/**
 * 使用stream的方式
 */
@Test
public void testArrayToList5() {
    String[] strArr = new String[]{"语文", "数学", "英语", "物理"};
    // 核心转换代码
    List<String> strList = Stream.of(strArr).collect(Collectors.toList());
    System.out.println("转换得到的List为:" + strList);
    // 对转换后的List进行改、增、删
    strList.set(2, "生物");
    System.out.println("修改数据后的List为:" + strList);
    strList.add("化学");
    System.out.println("添加数据后的List为:" + strList);
    strList.remove("物理");
    System.out.println("删除数据后的List为:" + strList);
}

测试结果:

使用场景:

支持Java8版本及以上的可以使用该方式进行转换。

二、List转数组

1、方式一:循环遍历

这种方式比较简单,也是最容易想到和最常用的方式,转换过程比较繁琐。

测试代码:

/**
 * 使用for循环
 */
@Test
public void testListToArray1() {
    List<String> strList = new ArrayList<>();
    strList.add("语文");
    strList.add("数学");
    strList.add("英语");
    strList.add("物理");

    // 核心转换代码
    String[] strArr = new String[strList.size()];
    for (int i = 0; i < strList.size(); i++) {
        strArr[i] = strList.get(i);
    }
    System.out.print("转换得到的数组为:");
    for (String value : strArr) {
        System.out.print(value + " ");
    }
}

测试结果:

2、方式二:使用集合支持泛型的toArray(T[] a)方法

测试代码:

/**
 * 使用集合的toArray()方法
 */
@Test
public void testListToArray2() {
    List<String> strList = new ArrayList<>();
    strList.add("语文");
    strList.add("数学");
    strList.add("英语");
    strList.add("物理");

    // 核心转换代码
    String[] strArr = strList.toArray(new String[0]);
    System.out.print("转换得到的数组为:");
    for (String value : strArr) {
        System.out.print(value + " ");
    }
}

测试结果:

3、方式三:使用stream的方式

测试代码:

/**
 * 使用Stream的方式
 */
@Test
public void testListToArray3() {
    List<String> strList = new ArrayList<>();
    strList.add("语文");
    strList.add("数学");
    strList.add("英语");
    strList.add("物理");

    // 核心转换代码
    String[] strArr = strList.stream().toArray(String[]::new);
    System.out.print("转换得到的数组为:");
    for (String value : strArr) {
        System.out.print(value + " ");
    }
}

测试结果:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。