Java 集合、数组、字符串的相互转换(关于list.toArray(new String[0])的源码分析)

news2024/11/26 9:50:11

在 Java 中,可以通过以下方式实现集合、数组和字符串之间的相互转换。

一、集合和数组的相互转化

①、将集合转为数组:(toArray 方法)

List<String> list = new ArrayList<>(); 
list.add("apple"); 
list.add("banana"); 
list.add("orange"); 
// 传入数组类型 
String[] arr = list.toArray(new String[0]); 
 // [apple, banana, orange]
System.out.println(Arrays.toString(arr));

②、将数组转为集合:(asList 方法)

String[] arr = {"apple", "banana", "orange"}; 
List<String> list = Arrays.asList(arr);
System.out.println(list); // [apple, banana, orange]

注意:将数组转为集合时,使用的是 Arrays.asList() 方法。将数组转换为集合后,得到的集合不支持增加或删除元素(因为底层存储的仍然是数组),只能修改元素。如果需要增加或删除元素,需要将其转换为可变的 List:

Arrays.asList() 方法返回的 List 转换为可变的 List,可以使用如下两种方式:

  1. 构造一个新的 ArrayList 对象,并将 Arrays.asList() 返回的 List 作为构造方法的参数传入:
    String[] arr = {"apple", "banana", "orange"}; 
    // 将 Arrays.asList() 返回的 List 作为构造方法的参数传入 
    List<String> list = new ArrayList<>(Arrays.asList(arr)); 
    list.add("peach");
    System.out.println(list); // [apple, banana, orange, peach]
  2. 使用 Collections.addAll() 方法将 Arrays.asList() 返回的 List 添加到一个新的 ArrayList 对象中:
    String[] arr = {"apple", "banana", "orange"};
    List<String> list = new ArrayList<>();
    // 将 Arrays.asList() 返回的 List 添加到一个新的 ArrayList 对象中
    Collections.addAll(list, arr);
    list.add("peach"); 
    System.out.println(list); // [apple, banana, orange, peach]

需要注意的是,这两种方式都会创建一个新的可变的 List 对象。如果只是需要在原有的 List 中增加或删除元素,可以使用 list.add()list.remove() 等方法。

关于这一点详细的说明可以参考:(Java 核心术 卷 I——集合)

二、集合和字符串的相互转化

① 、将集合转为字符串:

List<String> list = new ArrayList<>(); 
list.add("apple"); 
list.add("banana"); 
list.add("orange");
String str = String.join(",", list); 
System.out.println(str); // apple,banana,orange

②、将字符串转为集合:

String str = "apple,banana,orange"; 
List<String> list = Arrays.asList(str.split(","));
System.out.println(list); // [apple, banana, orange]

注意:使用 String.join() 方法可以将集合中的元素连接成字符串,其中参数为连接符,连接符会插入每个元素之间。使用 split() 方法可以将字符串按照指定的分隔符分割为数组,再使用 Arrays.asList() 方法将其转换为 List。需要注意的是,Arrays.asList() 方法返回的 List 是不可变的固定大小的 List,无法增加或删除元素,如果需要增加或删除元素,需要将其转换为可变的 List。

与数组转集合的方法类似,字符串转集合转换为可变的List也有两种方法:

  1. 构造一个新的 ArrayList 对象,并将 Arrays.asList() 返回的 List 作为构造方法参数传入:
    String str = "apple,banana,orange";
    String[] arr = str.split(",");
    List<String> list = new ArrayList<>(Arrays.asList(arr));
    list.add("peach");
    System.out.println(list); // [apple, banana, orange, peach]
  2. 使用 Collections.addAll() 方法将 Arrays.asList() 返回的 List 添加到一个新的 ArrayList 对象中:
    String str = "apple,banana,orange";
    String[] arr = str.split(",");
    List<String> list = Arrays.asList(arr);
    List<String> newList = new ArrayList<>(list);
    newList.add("peach");
    System.out.println(newList); // [apple, banana, orange, peach]

三、数组和字符串的相互转化

①、将数组转为字符串:

String[] arr = {"apple", "banana", "orange"}; 
String str = String.join(",", arr); 
System.out.println(str); // apple,banana,orange

②、将字符串转为数组:

String str = "apple,banana,orange"; 
String[] arr = str.split(","); 
System.out.println(Arrays.toString(arr)); // [apple, banana, orange]

以上就是 Java 中集合、数组和字符串之间的相互转换的示例。

四、关于String[] arr = list.toArray(new String[0]);源码分析

        当然抛开前面的集合转为数组的方法,list.toArray(new String[0]) 中 new String[0]什么意思,为什么要写new String[0] 不写0可以写别的吗?

        经过查阅资料发现:在将List转换为数组时,传入new String[0]参数是为了告诉JVM这个toArray的返回结果是一个String数组。这种方式更加高效,因为如果传入的数组长度不够,数组会被重新生成,而使用0长度的数组,则可以避免这种情况,同时也不会浪费内存空间。

但具体什么情况,还是下个断点,debug模式下看一下源码是怎么写的吧。

 

 

        这段源码是Java集合框架中List接口的实现,作用是将List中的所有元素按照顺序存储到指定的数组中,并返回这个数组。下面逐行解释这段代码的作用:

@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {

该方法是toArray方法的具体实现,其中使用了泛型T来表示要存储元素的数组类型。由于返回的数组类型与传入的参数数组类型相同,因此需要使用SuppressWarnings注解来避免编译器警告。

if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());

如果传入的数组长度小于List中元素的个数,就创建一个元素类型为a的运行时类型的新数组,将List中的元素复制到这个新数组中。

System.arraycopy(elementData, 0, a, 0, size);

如果传入的数组足够大,就直接将List中的元素复制到传入的数组a中。

if (a.length > size)
a[size] = null;

如果传入的数组长度比List中的元素个数大,就在传入的数组的最后一个元素位置上设置null值,用来标记数组的有效长度。

return a;

最后返回传入的数组a。

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

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

相关文章

异构跨库数据同步还在用Datax?来看看这几个开源的同步方案

在遇到跨库或者异库数据同步时&#xff0c;我们一般都会借助ETL工具来实现数据同步功能。比如目前大家较为熟知的Kettle和Datax。但是&#xff0c;这两个需要定时去查询数据库的数据&#xff0c;会存在一定的延迟&#xff0c;而且&#xff0c;默认采用全量同步的方式&#xff0…

Java Spring概述

文章目录 1、Spring是什么&#xff1f;2、Spring 的狭义和广义3、Spring Framework特点4、Spring模块组成5、Spring6版本要求 1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff…

AD原理图元器件封装绘制

元器件封装界面 1.元器件可以新建原理图库&#xff0c;然后在新建的库中添加 2.采用下图中的方式&#xff0c;随便右键某个库中的元器件&#xff0c;选择“Edit…”&#xff0c;进入到元器件封装绘制界面 元器件封装设计步骤 1.点击工具——新器件 输入新器件ID&#xff0c…

性能测试监控平台:InfluxDB+Grafana+Jmeter

前言 性能测试工具jmeter自带的监视器对性能测试结果的实时展示&#xff0c;在Windows系统下的GUI模式运行&#xff0c;渲染和效果不是太好&#xff0c;在linux环境下又无法实时可视化。 2023年最新出炉性能测试教程&#xff0c;真实企业性能压测全流程项目实战训练大合集&am…

软件测试:测试用例详解

一、通用测试用例八要素   1、用例编号&#xff1b;    2、测试项目&#xff1b;   3、测试标题&#xff1b; 4、重要级别&#xff1b;    5、预置条件&#xff1b;    6、测试输入&#xff1b;    7、操作步骤&#xff1b;    8、预期输出 二、具体分析通…

微信支付Native下单API V3接口开发详解

这几天做微信支付Native下单接口调用、签名这块&#xff0c;弄的我焦头烂额&#xff0c;翻了很多网上配置&#xff0c;各有不同&#xff0c;写的不清不楚&#xff0c;只能自己慢慢研究&#xff0c;尝试了无数种解决坑的方案&#xff0c;嚼文咬字看官方的文档调试&#xff0c;文…

从零开始学Android开发期末复习重点

目录 前言作业&#xff11;作业&#xff12;作业&#xff13;作业4作业5作业6 前言 物联网应用技术课程期末复习重点——学习通作业&#xff1a; 操作系统&#xff1a;Ubuntu22.04 作业&#xff11; 简述Android系统架构。 Android 的系统架构和它的操作系统一样&#xff…

前端开发需要学什么?零基础前端学习路线看这一篇就够了!

是的&#xff0c;自学前端可以帮助您找到工作&#xff0c;参加培训是根据个人学习能力和经济实力来自己决定的。前端开发是一个相对容易入门的领域&#xff0c;并且许多人通过自学成功地找到了前端开发的工作。以下是好程序员的一些建议&#xff0c;可以帮助您在自学前端时提高…

离线语音控制新方案,NRK3303语音识别芯片在智能风扇的应用

随着科技的不断发展&#xff0c;智能家居已经成为人们日常生活中不可或缺的一部分&#xff0c;涌现出越来越多的智能设备&#xff0c;如智能门锁、智能灯泡、智能冰箱等&#xff0c;这些设备为人们的生活带来了更多的便利和创新。其中作为常见的风扇通过添加智能语音控制功能&a…

分布式运用之Filebeat+Kafka+ELK 的服务部署

1. Kafka 架构深入了解 1.1 Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 parti…

路径规划算法:基于哈里斯鹰优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于哈里斯鹰优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于哈里斯鹰优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

leetcode 2.两数相加(链表操作)

题目描述跳转到leetcode 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0…

消除字母-第14届蓝桥杯省赛Scratch中级组真题第6题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第141讲。 消除字母&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第6题&#xf…

Windows提权:利用MySQL数据库

目录 数据库提权的基本条件 MySQL UDF提权 什么是UDF UDF如何应用到提权 利用思路 MSF提权实战 MySQL 启动项提权 原理&#xff1a;通过MySQL数据库把木马写到Windows启动项中 Windows启动项位置 MSF提权利用实战 MySQL 反弹shell提权 数据库提权的基本条件 知道数据…

路径规划算法:基于鸟群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于鸟群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于鸟群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法鸟群…

Linux:centos:计划任务管理《at》

date 查看当前时间或管理时间 年-月-日 周几 时间 时间标准 如果想把他改成2024年6月1日12&#xff1a;30 使用 date 060112302024 06 6月 01 1日 1230 12&#xff1a;30 2024 2024年 使用at之前要安装他 有些用户没有安装的情况下 最好使…

死锁的成因和解决方案

死锁&#x1f512;的成因和解决方案&#x1f4d1; 锁是操作系统和程序语言中常用的同步机制&#xff0c;用于保证共享资源的互斥访问&#xff0c;防止多个线程或进程同时访问共享资源&#xff0c;导致数据不一致或程序崩溃。 死锁是我们在进行并发编程中需要时刻避免的一个问…

路径规划算法:基于引力搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于引力搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于引力搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

iPhone遇到错误53该如何快速修复?

在所有手机中&#xff0c;iphone是出现问题较少的一款手机&#xff0c;但有时候用户会偶尔遇到一些系统问题。例如&#xff0c;错误53是许多用户常见反馈问题之一。如果你还得到错误53 今天小编的就分享如果iphone遇到系统错误53的解决办法。 当我们尝试通过iTunes工具来恢复或…

TDengine 时序数据的保留策略

“TDengine除vnode分片之外&#xff0c;还对时序数据按照时间段进行分区。每个数据文件只包含一个时间段的时序数据&#xff0c;时间段的长度由DB的配置参数days决定。这种按时间段分区的方法还便于高效实现数据的保留策略&#xff0c;只要数据文件超过规定的天数&#xff08;系…