数组转为list java_思考与实践并行的俗语

数组转为list java_思考与实践并行的俗语不曾想到,“Java数组转List”竟然有这么多的学问,震撼之余夹带些许不堪。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

不曾想到,“Java数组转List”竟然有这么多的学问,震撼之余夹带些许不堪。关于“Java数组转List”其实是非常基础的知识,况且有很多人在博客中均有所讨论,难免让我觉得写这样的讨论文章显得多少没有必要!转念想到“不积硅步,无以成千里”,于是强迫自己再次对该问题做一些深层次的实践。

一、Create ArrayList from array

Create ArrayList from array在stackoverflow上引发的讨论之热烈程度多少让我感到吃惊:

  1. new ArrayList(Arrays.asList(array))
  2. List list = Arrays.asList(array);
  3. Use Guava ——Lists.newArrayList(aStringArray);
  4. Collections.addAll(arraylist, array);
  5. for(Element e : array) —— list.add(e);

从里面可以提取出以上五种的方案,关于Guava的,由于我对此不甚了解,所以暂时放过,那么剩余四种情况,我们就详细来做实践。

①、new ArrayList(Arrays.asList(array))

其实我觉得第一种方案,挺简洁好使的。

String[] array1 = { new String("1"), new String("2"), new String("3") };

arrayList = new ArrayList<String>(Arrays.asList(array1));

for (String s : arrayList) {
    System.out.print(s + "、");
}

try {
    arrayList.add("111");

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

try {
    array[1] = "qw";

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

System.out.println();
System.out.println("----------new ArrayList<String>(Arrays.asList(array1))---------------");

输出内容如下:

1、2、3、1、2、3、111、1、2、3、111、
———-new ArrayList(Arrays.asList(array1))—————

但是,看完stackoverflow上的讨论,觉得这种方案确实有最大的弊端!

you may create and fill two lists !

好吧,这个过程会产生两个list,真让人操碎了心啊!不过请注意,该种方法与第二种方法之间多了一个“new ArrayList”,那么为什么要再new一次呢?请看第二种方法的介绍!

②、List list = Arrays.asList(array)

从java的API中我们可以看出

asList
public static List asList(T… a)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:

 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

参数:
a – 支持列表的数组。
返回:
指定数组的列表视图。

此方法会有两个弊端:

  1. list长度固定,也就是说无法进行add元素。
  2. 对返回列表的更改会“直接写”到数组。

我们接着看例子:

String[] array = { new String("1"), new String("2"), new String("3") };

List<String> arrayList = Arrays.asList(array);

for (String s : arrayList) {
    System.out.print(s + "、");
}

try {
    arrayList.add("111");

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

try {
    arrayList.set(1, "qw");

    for (String s : array) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

System.out.println();
System.out.println("----------Arrays.asList---------------");

输出结果如下:

1、2、3、java.lang.UnsupportedOperationException1、qw、3、
———-Arrays.asList—————

从结果中可以证明:

This will work fine. But some caveats:

  1. The list returned from asList has fixed size. So, if you want to be able to add or remove elements from the returned list in your code, you’ll need to wrap it in a new ArrayList. Otherwise you’ll get an UnsupportedOperationException.
  2. The list returned from asList() is backed by the original array. If you modify the original array, the list will be modified as well. This may be surprising.

所以该种“数组转换为List”的做法局限很多,限制了转换后List的使用!

那么再回到第一种方法“new ArrayList(Arrays.asList(array))”上,使用new ArrayList显然规避了以上两种限制,但同时创建了两个list,所以以上两种方法虽然在代码量上足够简洁,但弊端同样很多,也就是说这两种方法多少有点“后遗症”。

④、Collections.addAll(arraylist, array);

跳过Guava,我们来看“Collections.addAll(arraylist, array)”。

String[] array2 = { new String("1"), new String("2"), new String("3") };

arrayList = new ArrayList<String>();
Collections.addAll(arrayList, array2);

for (String s : arrayList) {
    System.out.print(s + "、");
}

try {
    arrayList.add("111");

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

try {
    array[1] = "qw";

    for (String s : arrayList) {
        System.out.print(s + "、");
    }
} catch (Exception e) {
    System.out.print(e);
}

System.out.println();
System.out.println("-------------Collections.addAll(arrayList, array2)------------");

对于第四种方法,我觉得还不错,代码也足够的简洁,且没有多余的“后遗症”,所以推荐这种做法!

另外,通过api可以看到如下解释:

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

将所有指定元素添加到指定 collection 中。可以分别指定要添加的元素,或者将它们指定为一个数组。此便捷方法的行为与 c.addAll(Arrays.asList(elements)) 的行为是相同的,但在大多数实现下,此方法运行起来可能要快得多。

在分别指定元素时,此方法提供了将少数元素添加到现有 collection 中的一个便捷方式:
Collections.addAll(flavors, “Peaches ‘n Plutonium”, “Rocky Racoon”);

该方式对应还有另外一种写法

String[] array3 = { new String("1"), new String("2"), new String("3") };

ArrayList<String> arrayList3 = new ArrayList<String>();
arrayList3.addAll(Arrays.asList(array3));

这种写法就不如Collections.addAll!

⑤、for(Element e : array) —— list.add(e);

其实,很多时候我们忽略了最原始的写法,也就是所谓的

arrayList3 = new ArrayList<String>();
for (String s : array3) {
    arrayList3.add(s);
}

这种写法在我看来,也足够的简洁,同样没有后遗症,并且运行速度,我想,肯定不慢!


总结完上述“Java数组转换为List”方法后,真心感觉原来基础知识也这么有深度,赶紧学起来吧!


感谢您阅读【沉默王二的博客】,如果王二的博客给您带来一丝帮助或感动,我(也就是王二)将不甚荣幸。
如果您碰巧喜欢,可以留言或者私信我,这将是我鼓捣更多优秀文章的最强动力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172257.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • js数组删除元素_js清空数组的方法

    js数组删除元素_js清空数组的方法js的数组删除,我建议大家使用splice函数,不要使用slice函数,因为slice是返回一个新数组,并不是从原来的数组中删除。比如:leta=[111,222,333,444];a.splice(2,1);上面的代码运行后,a数组的值变成:[111,222,444]假如用slice实现:leta=[111,222,333,444];letb=a.slice(2,1);这时a的值不会改变,而b的值变成了[111,222,444]所以splice是比slice用起来简单的

  • linux下进程的管理_LINUX教程

    linux下进程的管理_LINUX教程作者:RodmaChen关注我的csdn博客,更多Linux笔记知识还在更新本人只在csdn写博客Linux进程管理一.什么是进程和程序二.查看进程——ps,top,pstree三.进程的启动方式四.进程的控制五.实训任务一.什么是进程和程序进程:开始执行但是还没有结束的程序的实例程序:包含可执行代码的文件进程与程序的关系进程由程序产生,是一个运行着的、要占系统资源的程序进程不等于程序进程与程序是多对一进程是占用(消耗)系统资源的二.查看进程—.

  • 4k纸是几厘米乘几厘米_4k素描纸是多大? 是几乘几的?

    4k纸是几厘米乘几厘米_4k素描纸是多大? 是几乘几的?展开全部4K的尺寸:35cm*38cm目前有“国际大度”和“国际正度”的两种标准。国际大度四开纸的长宽为:58×62616964757a686964616fe58685e5aeb93133336566613743cm;国际正度四开纸的长宽为:53×37.5cm。通常使用国际大度标准为多,整数计算长:53cm,宽:38cm。素描约4K,8K,32K这些是指对应的纸张的大小。4K的尺寸:35cm*38…

  • 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办…

    准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办…有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次打开:服务和应用程序—-服务。找到右侧的:windowsUpdate;3、鼠标双击windowsupdate,打开属性启动类型选:禁用,这样就关…

  • Docker从入门到干活,看这一篇足矣 [建议收藏]

    Docker从入门到干活,看这一篇足矣 [建议收藏]

  • java set 排序的_Set集合排序

    java set 排序的_Set集合排序TreeSet使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序,具体取决于使用的构造方法。通俗一点来说,就是可以按照排序后的列表显示,也可以按照指定的规则排序。Setset=newTreeSet();set.add(“f”);set.add(“a”);set.add(“b”);set.add(“c”);set.add(“d”);set.add(“e”…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号