arduino byte转string_Java数组转List集合的三驾马车

点击上方 蓝字关注我们

b6eaf3cfdfaa69ad090bc05872100d41.png

68c8a2dcccf4f4f64ac9072e33ba6b28.png

来源:blog.csdn.net/x541211190/article/details/79597236

前言

本文中的代码命名有的可能不太规范,是因为没法排版的问题,小仙已经很努力去解决了,希望各位能多多点赞、分享。

460d48569bbbaa23f89fbbface434f81.png

好了,不多bb了(不要让人知道我已经快一个星期没有更新了)

文章主要介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。

最常见方式(未必最佳)

通过 Arrays.asList(strArray) 方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。

关键代码List l = Arrays.asList(strArray)

private void arrayCastToList() {    
  String[] strArray = new String[2];    
  List l = Arrays.asList(strArray);    
  //对转换后的list插入一条数据    
  list.add("1");    
  System.out.println(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后,不需要增删其中的值,仅作为数据源读取使用。

数组转为List后,支持增删改查的方式

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

关键代码ArrayList l = new ArrayList(Arrays.asList(strArray))

private void arrayCastToListByArrayList() {    
  String[] strArray = new String[2];    
  ArrayList l = new ArrayList(Arrays.asList(strArray)) ;    
  list.add("1");    
  System.out.println(l);
}  

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

[null, null, 1]

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

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

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

关键代码

ArrayList arrayList = new 
  ArrayList(strArray.length);
Collections.addAll(arrayList, strArray);

测试:

private void arrayCastToListByCollection(){    
  String[] strArray = new String[2];    
  ArrayList arrayList = new 
    ArrayList(strArray.length);    
  Collections.addAll(arrayList, strArray);    
  arrayList.add("1");    
  System.out.println(arrayList);  
}

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

[null, null, 1]

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

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

public static  boolean addAll(Collection super T> c,T... elements){        boolean result = false;        for (T element : elements)        //result和c.add(element)按位或运算//然后赋值给result            
  result |= c.add(element);        return result;    
}

Java8可通过stream流将3种基本类型数组转为List

JDK版本在1.8以上,可以使用流stream来将下列3种数组转为List,分别是int[]long[]double[],其他数据类型比如short[]byte[]char[],在JDK1.8中暂不支持。由于这只是一种常用方法的封装,不再纳入一种崭新的数组转List方式,暂时算是java流送给我们的常用工具方法吧。

转换代码示例如下:

List iList= Arrays.stream(new int[] { 1, 2, 3, }).boxed().
  collect(Collectors.toList());
List lList= Arrays.stream(new long[] { 1, 2, 3 }).boxed().
  collect(Collectors.toList());
List dList= Arrays.stream(new double[] { 1, 2, 3 }).boxed().
  collect(Collectors.toList());

如果是String数组,可以使用Stream流这样转换:

String[] arrays = {"tom","jack","kate"};
List stringList= Stream.
of(arrays).collect(Collectors.toList());
744028507e559a55316c7f066a8af6eb.png

正文结束,以下是对我踩过的坑的讲解

744028507e559a55316c7f066a8af6eb.png

补充:讲解下我遇到过的问题

问题: 数组类型如果是整型数组,转为List时,会报错?

答案:JDK1.8环境中测试,这三种转换方式是没有问题的。对于Integer[]整型数组转List的方法和测试结果如下:

方式一:不支持增删

Integer[] intArray1 = new Integer[2];
List list1 = Arrays.
  asList(intArray1);
System.out.println(list1);

运行结果:

[null, null]

方式二:支持增删

Integer[] intArray2 = new Integer[2];
List list2 = new 
  ArrayList(Arrays.
  asList(intArray2)) ;
list2.add(2);System.out.println(list2);

运行结果:

[null, null, 2]

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

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的正确方式应该是这样的。

猜想你们遇到的问题: 我猜想你们出现的错误可能是这样转换的:

int[] intArray1 = new int[2];
List list1 = 
  Arrays.asList(intArray1);//此处报错!!

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

在声明数组时,int[]还是Integer[],哪种声明方式才能正确的转为List呢?答案: 只能用Integer[]List,即只能用基本数据类型的包装类型,才能直接转为List

原因分析如下:

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

public interface List<E> extends Collection<E> {省略…}

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

 public static  List asList(T... a){        return new ArrayList<>(a);    
 }

从上述源码中可以看出,List声明时,需要传递一个泛型

形参asList()参数类型是泛型中的通配类型

Java中所有的泛型必须是引用类型

什么是引用类型?

Integer是引用类型,那int是什么类型?int是基本数据类型,不是引用类型。这就是为什么java中没有List,而只有List

举一反三

8种基本数据类型byteshortintlongfloatdoublechar都不是引用类型,故8种基本数据类型都不能作为List的形参.String数组classinterface是引用类型,都能作为List的形参,所以存在List接口类型的集合、List数组类型的集合、List类的集合.但不存在listlist 等基本类型的集合.

有了上述基础知识后,再来看为什么下面两行代码第二行能编译通过,第三行却编译报错?

int[] intArray1 = new int[1]; 
Arrays.asList(intArray1);//编译不报错
List list1 = 
  Arrays.asList(intArray1);//编译报错

答案:

第二行代码,Arrays.asList()方法的入参是个引用类型的int[],那么返回值类型一定是List ,其完整代码是:List intsArray = Arrays.asList(intArray1);,所以编译通过,没问题。

第三行报错,因为等号两边的类型不一致,左边:List,右边List,所以编译时就报错。

总结

现在你应该明白,为什么int[]不能直接转换为List,而Integer[]就可以转换为List了吧。因为List中的泛型必须是引用类型,int是基本数据类型,不是引用类型,但int的包装类型Integerclass类型,属于引用类型,所以Integer可以作为List形参,List在java中是可以存在的,但不存在List类型。

在编码时,我们不光要知其然,还要知其所以然,通过分析JDK源码,才能得出一手信息,不仅了解到了如何用,还能得出为何这样用。

fbfe873f137396f421a59d8891a03a6d.png

点个在看,你最好看

81878cda5201fe80e90d3202cab4eb83.png352513867a86e4aae4c3e6017497b2a3.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6笔记(4)-- Symbol类型

系列文章 -- ES6笔记系列 Symbol是什么&#xff1f;中文意思是标志、记号&#xff0c;顾名思义&#xff0c;它可以用了做记号。 是的&#xff0c;它是一种标记的方法&#xff0c;被ES6引入作为一种新的数据类型&#xff0c;表示独一无二的值。 由此&#xff0c;JS的数据类型多了…

手把手教你如下在Linux下如何写一个C语言代码,编译并运行

文章目录手把手教你如下在Linux下如何写一个C语言代码&#xff0c;编译并运行打开Ubuntu终端创建 helloworld.c编译C文件手把手教你如下在Linux下如何写一个C语言代码&#xff0c;编译并运行 打开Ubuntu终端 我这里的终端是Windows下的WSL&#xff0c;如果有疑问&#xff0c;…

邮件群发工具的编写(二)数据的保存

数据的保存与读取 人类是在不断探索与改进中进步的 上一篇&#xff0c;邮件群发工具的编写&#xff08;一&#xff09;邮件地址提取&#xff0c;我们讲到了邮箱的提取。 那么这一篇&#xff0c;讲一下提取完的邮箱信息的保存和读取。 首先&#xff0c;我希望对上一篇邮箱提取类…

c++ lambda函数_C++11 之 lambda函数的详细使用

1. lambda 函数概述lambda 表达式是一种匿名函数&#xff0c;即没有函数名的函数&#xff1b;该匿名函数是由数学中的λ演算而来的。通常情况下&#xff0c;lambda函数的语法定义为&#xff1a;[capture] (parameters) mutable ->return-type {statement}其中&#xff1a;[c…

pytorch 正向与反向传播的过程 获取模型的梯度(gradient),并绘制梯度的直方图

记录一下怎样pytorch框架下怎样获得模型的梯度 文章目录引入所需要的库一个简单的函数模型梯度获取先定义一个model如下定义两个获取梯度的函数定义一些过程与调用上述函数的方法可视化一下梯度的histogram引入所需要的库 import os import torch import torch.nn as nn impor…

ubuntu升级python_Ubuntu 升级python3为更高版本【已实测】

2020-04-13 更新安装步骤&#xff1a; 1. 先update一下 sudo apt update 2. 安装依赖库 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

Framework打包

2019独角兽企业重金招聘Python工程师标准>>> iOS app需要在许多不同的CPU架构下运行&#xff1a; arm7: 在最老的支持iOS7的设备上使用 arm7s: 在iPhone5和5C上使用 arm64: 运行于iPhone5S的64位 ARM 处理器 上 i386: 32位模拟器上使用 x86_64: 64为模拟器上使用…

windows 10 下利用WSL的Linux环境实现vscode C/C++环境的配置

本文主要结合二个工具&#xff0c;介绍如何在windows搭建Linux开发环境&#xff1a; WSL(Windows Subsystem for Linux)VSCode(Visual Studio Code) 文章目录WSL安装VSCode安装配置Linux下的C/C环境1. 打开WSL的控制台2. 更新ubuntu软件3. 安装GCC和GDB4. 配置VSCode(1). 打开…

Windows 11下 WSL使用 jupyter notebook

这里写目录标题前言在WSL下的配置测试运行更优雅的启动方法配置jupyter生成默认配置文件生成秘钥修改配置文件nohup启动前言 一直都使用jupyter notebook&#xff0c;不管做数据分析&#xff0c;还是调试代码&#xff0c;还有写文章都是。但是好像在WSL下又不好使。看了网上有…

sql2000导出mysql_如何将sql2000的数据库导入到mysql中?

展开全部先用SQl2000导出e68a843231313335323631343130323136353331333262373366文本文件&#xff0c;把后缀名改为CSv&#xff0c;再从Mysql中一导入OK参考&#xff1a;第一种是安装mysql ODBC&#xff0c;利用sql server的导出功能&#xff0c;选择mysql数据源&#xff0c;进…

实现日、周、月排行统计 sql

在如今很多系统中&#xff0c;都需要进行日、周、月排行统计&#xff0c;但是在网上寻找 了一番&#xff0c;发现很多都是相对的周、月排行&#xff0c;即周排行则用当前时间减去7天。这样我个人认为并不恰当。如月排行中&#xff0c;假设今天是4月22日,则从3月22日至4月22日之…

产品运行所需的信息检索失败_为服务业注入新活力,华北工控推出服务机器人专用计算机产品方案...

近年来&#xff0c;随着人口老龄化趋势加快和信息科技革命的持续推进&#xff0c;服务机器人已经被当作社会劳动力的一部分在医疗、教育、餐饮等行业广泛应用&#xff0c;市场潜力巨大。01、需求带动消费&#xff0c;科技改变服务服务机器人是国内智能机器人产业发展最快的分支…

Windows更新没有更新提示:从windows 10升级到Windows 11,并WSL下配置cuda

文章目录从windows 10 升级到Windows 11安装WSL的安装配置cuda从windows 10 升级到Windows 11 升级的方法有很多种&#xff0c;各大网站都有。有更新提示的按更新提示操作即可。我的是一直都没有更新提示&#xff0c;也搜索过网上的一些方法&#xff0c;但都不行。还是没法更新…

js修改css样式属性_这个笔记《CSS样式的常见属性及值》,让菜鸟轻松学会包粽子...

常见样式属性及值字体:font-family-size-style: normal(正常)|italic(倾斜)|oblique-weight: normal|bold(粗体)如果组合起来编写: font: style weight size family字体大小的单位可以是 px, em, rem, pt, cm, mm, in, pc文本:colortext-align(水平对齐方式): left|center|righ…

在 VirtualBox 中 CentOS 网络设置

转自&#xff1a;本文发表于水景一页。永久链接&#xff1a;<http://cnzhx.net/blog/minimal-centos-in-virtualbox/>。转载请保留此信息及相应链接。 4. 设置 按照上面的方法安装之后&#xff0c;还需要一些简单的设置&#xff0c;比如网络访问。然后既然是做网页服务器…

vscode C++ 分文件、文件夹编译配置与错误解决

文章目录问题includesourceout配置过程遇到的问题与解决遇到的问题1解决步骤1. ctrl shift p2. 配置json文件修改task.json文件修改launch.json可能遇到的错误1. collect2: error: ld returned 1 exit status2. /mnt/d/tmp/c/source/add.cpp:3:10: fatal error: add.h: No su…

淘淘商城项目mysql服务器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城项目环境搭建 ]...

背景&#xff1a;淘淘商城项目的环境搭建说明&#xff1a;采用SpringMVCSpringMybatisMysqlMavenSvn结构搭建&#xff0c;在开发之中可以参考其结构和搭建步骤去搭建实际的工程项目工程结构简图&#xff1a;项目结构&#xff1a;---------------------------------------------…

bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数

1. 概述在项目实际开发过程中&#xff0c;为了更好的复用&#xff0c;我们参考Spring Boot Starters&#xff0c;封装了许多企业内部中间件的starter。这些中间件的接入都需要申请并在项目中配置一些特定的参数。我们通过ConfigurationProperties注解&#xff0c;增加了在配置过…

进一步理解:inline-block,vertical-align,line-height

看似三个最常见的概念背后却隐藏了很深的很深“水” 那有多深呢&#xff0c;先来看下面的代码 引出问题 <style>.inline-block {display: inline-block;}.border {border: 1px solid #000000;}.span {width: 100px;height: 100px;}.bak {background: #33CCFF;} .o-hidden…

刷系统——黑屏问题

引用&#xff1a;http://www.miui.com/thread-344361-1-1.html 此贴大部分内容源自魔趣论坛V大的帖子&#xff0c;本人经过整理后发出&#xff0c;特此声明原帖地址&#xff1a;http://bbs.mfunz.com/thread-172610-1-1.html——此贴献给小白们&#xff0c;老鸟一笑而过吧近期有…