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


相关文章
|
20天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
27天前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
37 0
|
21天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
5天前
|
存储 Java 程序员
Java 数组
4月更文挑战第16天
|
17天前
|
Java 数据挖掘
java实践
【4月更文挑战第9天】java实践
12 1
|
1天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
2天前
|
IDE Java 开发工具
Java从入门到精通:1.3.1实践编程巩固基础知识
Java从入门到精通:1.3.1实践编程巩固基础知识
|
8天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。
|
9天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
9天前
|
Java API 数据库
深研Java异步编程:CompletableFuture与反应式编程范式的融合实践
【4月更文挑战第17天】本文探讨了Java中的CompletableFuture和反应式编程在提升异步编程体验上的作用。CompletableFuture作为Java 8引入的Future扩展,提供了一套流畅的链式API,简化异步操作,如示例所示的非阻塞数据库查询。反应式编程则关注数据流和变化传播,通过Reactor等框架实现高度响应的异步处理。两者结合,如将CompletableFuture转换为Mono或Flux,可以兼顾灵活性和资源管理,适应现代高并发环境的需求。开发者可按需选择和整合这两种技术,优化系统性能和响应能力。