Java数组转List的实践,竟然有这么多学问

简介: Java数组转List的实践,竟然有这么多学问

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


一、Create ArrayList from array


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


new ArrayList(Arrays.asList(array))

List list = Arrays.asList(array);

Use Guava ——Lists.newArrayList(aStringArray);

Collections.addAll(arraylist, array);

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");

1

参数:

a - 支持列表的数组。

返回:

指定数组的列表视图。

此方法会有两个弊端:


list长度固定,也就是说无法进行add元素。

对返回列表的更改会“直接写”到数组。

我们接着看例子:

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:

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.

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”方法后,真心感觉原来基础知识也这么有深度,赶紧学起来吧!


相关文章
|
3月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
4月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
130 0
|
2月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
4月前
|
SQL 缓存 安全
深度理解 Java 内存模型:从并发基石到实践应用
本文深入解析 Java 内存模型(JMM),涵盖其在并发编程中的核心作用与实践应用。内容包括 JMM 解决的可见性、原子性和有序性问题,线程与内存的交互机制,volatile、synchronized 和 happens-before 等关键机制的使用,以及在单例模式、线程通信等场景中的实战案例。同时,还介绍了常见并发 Bug 的排查与解决方案,帮助开发者写出高效、线程安全的 Java 程序。
202 0
|
4月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
171 1
|
4月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
159 1
|
4月前
|
存储 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧文旅旅游线路规划与游客流量均衡调控中的应用实践(196)
本实践案例深入探讨了Java大数据技术在智慧文旅中的创新应用,聚焦旅游线路规划与游客流量调控难题。通过整合多源数据、构建用户画像、开发个性化推荐算法及流量预测模型,实现了旅游线路的精准推荐与流量的科学调控。在某旅游城市的落地实践中,游客满意度显著提升,景区流量分布更加均衡,充分展现了Java大数据技术在推动文旅产业智能化升级中的核心价值与广阔前景。
|
4月前
|
存储 Java 索引
java 数组
在 Java 中,数组是一种数据结构,用于存储多个相同类型的数据元素。数组的大小一旦创建后就不能改变,因此它是固定长度的。Java 数组是一种 对象,即使它存储的值是基本类型(如 int、double 等),它也是一个对象引用。
93 0
|
4月前
|
存储 Java 大数据
Java 大视界 —— 基于 Java 的大数据隐私保护在金融客户信息管理中的实践与挑战(178)
本文探讨了基于 Java 的大数据隐私保护技术在金融客户信息管理中的应用与挑战。随着金融行业数字化转型加速,客户信息的安全性愈发重要。文章详细分析了数据加密、脱敏、访问控制、区块链及联邦学习等关键技术,并结合实际案例展示了其在金融机构中的应用效果,为金融科技从业者提供了宝贵的实践经验与技术参考。
下一篇
开通oss服务