Java 数组转 List 的三种方式及对比

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.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19)

at com.darwin.junit.Calculator.main(Calculator.java:44)

程序在list.add(“ 1”)处,引发异常: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后,支持增删改查的方式

=====================

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

关键代码:ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ;

private void testArrayCastToListRight() {

String[] strArray = new String[2];

ArrayList list = new ArrayList(Arrays.asList(strArray)) ;

list.add(“1”);

System.out.println(list);

}

执行结果:成功追加一个元素“ 1”。

[null, null, 1]

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

三。通过集合工具类Collections.addAll()方法(最高效)

====================================

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

关键代码:

ArrayList< String> arrayList = new ArrayList(strArray.length);

Collections.addAll(arrayList, strArray);

测试:

private void testArrayCastToListEfficient(){

String[] strArray = new String[2];

ArrayList< String> arrayList = new ArrayList(strArray.length);

Collections.addAll(arrayList, strArray);

arrayList.add(“1”);

System.out.println(arrayList);

}

执行结果:同样成功追加一个元素“ 1”。

[null, null, 1]

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

注:附上Collections.addAll()方法源码:

public static  boolean addAll(Collection<? super T> c, T… elements) {

boolean result = false;

for (T element : elements)

result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给result

return result;

}

问题解答

====

问题:列表类型如果是整型矩阵,转为List时,会报错?

答案:在JDK1.8环境中测试,这三种转换方式是没有问题的。放心使用。对于Integer[]整型表格转列表的方法和测试结果如下:

  1. 方式一:不支持增删

Integer[] intArray1 = new Integer[2];

List list1 = Arrays.asList(intArray1);

System.out.println(list1);

运行结果:

[null, null]

  1. 方式二:支持增删

Integer[] intArray2 = new Integer[2];

List list2 = new ArrayList(Arrays.asList(intArray2)) ;

list2.add(2);

System.out.println(list2);

运行结果:

[null, null, 2]

  1. 方式三:支持增删,且数据量大最高效

Integer[] intArray3 = new Integer[2];

List list3 = new ArrayList(intArray3.length);

Collections.addAll(list3, intArray3);

list3.add(3);

System.out.println(list3);

运行结果:

[null, null, 3]

综上,整型副本Integer[]List<Integer>的正确方式应该是这样的。

易错点:可能出现的错误可能是这样转换的:

int[] intArray1 = new int[2];

List list1 = Arrays.asList(intArray1);//此处报错!!!

报错原因:等号两边类型无关,当然编译不通过。分析见如下。

那么在声明清单时,用int[]还是Integer[],某些声明方式才能正确的转为List呢?答案:只能用Integer[]List<Integer>,即只能用基本数据类型的包装类型,才能直接转为List

原因分析如下:

我们来看List在Java源码中的定义(别害怕看不懂原始码,看我分析,很易懂的):

public interface List extends Collection {省略…}

再来看Arrays.asList()的在Java原始码定义:

public static  List asList(T… a) {

return new ArrayList<>(a);

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
3)]

[外链图片转存中…(img-NRDlpCiz-1714802936064)]

[外链图片转存中…(img-9v2WP46C-1714802936064)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值