当前位置: 首页 > news >正文

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

在 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。

相关文章:

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

在 Java 中&#xff0c;可以通过以下方式实现集合、数组和字符串之间的相互转换。 一、集合和数组的相互转化 ①、将集合转为数组&#xff1a;&#xff08;toArray 方法&#xff09; List<String> list new ArrayList<>(); list.add("apple"); lis…...

Redis的全局命令及相关误区

Redis中所说的数据结构是针对key-value中的value而言的。主要的结构包括String、哈希表、列表、集合等等在redis中存在16个库&#xff0c;涉及到后期的集群搭建只能使用0号库最为方便 查看所有键&#xff08;支持通配符&#xff09; keys * keys S*返回当前数据库中的键总数 …...

C++核心编程—类和对象,类的三大特性——封装、继承、多态

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.类和对象的概念①什么是对象&#xff1f;②抽象和类1.类的基本概念2.类的声明与定义&#xff1a;3.对象的创建与使用 二.类的封装①为什么有封…...

keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。

文章目录 简介注意点使用 keep-alive 有以下优缺点优点缺点 简介 keep-alive 是 Vue 内置的一个组件&#xff0c;被用来缓存组件实例。 使用 keep-alive 包裹动态组件时&#xff0c;被包裹的组件实例将会被缓存起来&#xff0c;而不会被销毁&#xff0c;直到 keep-alive 组件…...

(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言 “Spring”在不同的上下文中表示不同的事物。它可以用来引用 …...

凸缺陷 convexityDefects

获取凸包&#xff0c;可以参考我的这篇文章&#xff1a; 凸包&#xff08;Convex Hull&#xff09;代码实现案例 获取了凸包之后&#xff0c;可以干什么呢&#xff1f; 凸缺陷凸包与轮廓之间的部分称为凸缺陷。凸缺陷可用来处理手势识别等问题。 通常情况下&#xff0c;使用如…...

c语言编程练习题:7-43 Shuffling Machine

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos empl…...

ffmpeg enum AVChannel枚举解析

AVChannel枚举是在2022-12-20的提交中添加的&#xff0c;对应的版本号是5.1. 这个提交的描述是"avutil/channel_layout: add AVChannel enum and related functions"。 原型 typedef struct AVChannelCustom {enum AVChannel id;char name[16];void *opaque; } AVCh…...

invest模型教程

详情点击链接&#xff1a;invest模型教程——建议收藏 1.生态系统服务 2.InVEST模型 3.InVEST所需数据&#xff08;分辨率、格式、投影系统等&#xff09;、获取及标准化预处理 4.InVEST运行 5.ArcGIS工具支撑InVEST模型 5.1ArcGIS数据形式与数据格式、数据格式之间的相互转换…...

LinuxShell编程

Shell编程 Shell的概念介绍 命令解释器 Shell是命令解释器(command interpreter)&#xff0c;是Unix操作系统的用户接口&#xff0c;程序从用户接口得到输入信息&#xff0c;shell将用户程序及其输入翻译成操作系统内核&#xff08;kernel&#xff09;能够识别的指令&#x…...

stm32学习笔记-11 SPI通信

11 SPI通信 文章目录 11 SPI通信11.1 SPI通信协议11.2 W25Q64简介11.3 实验&#xff1a;软件SPI读写W25Q6411.4 SPI通信外设11.5 实验&#xff1a;硬件SPI读写W25Q64 注&#xff1a;笔记主要参考B站 江科大自化协 教学视频“ STM32入门教程-2023持续更新中”。 注&#xff1a…...

“微商城”项目(3页面布局)

1.设置标题 设置页面头部标题&#xff0c;方便告诉用户当前显示的是哪一个页面。编辑src\router.js文件&#xff0c;示例代码如下。 routes: [{ path: /, redirect: /home, meta: { title: 首页 } },{ path: /home, component: Home, name: home, meta: { title: 首页 } } ] …...

Java 八股文 - MySQL

MySQL 1. MySQL 有几种锁&#xff1f; ​ 三种锁的特点 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定颗粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会…...

周赛347(模拟、思维题、动态规划+优化)

文章目录 周赛347[2710. 移除字符串中的尾随零](https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/)模拟 [2711. 对角线上不同值的数量差](https://leetcode.cn/problems/difference-of-number-of-distinct-values-on-diagonals/)模拟 [2712. 使所有字符相等…...

String AOP的使用

面向切面编程&#xff0c;面向特定方法编程&#xff0c;以方法为对象&#xff0c;在不修改原方法的基础上&#xff0c;对方法进行操作扩展等&#xff0c;底层是通过动态代理实现的 使用开发步骤&#xff1a; 1、创建一个类&#xff0c;加上Aspect声明为一个AOP切面类&#xff…...

华为芯片基地旁,龙华科技小镇大水坑片区城市更新单元旧改项目

项目位置&#xff1a;龙华观澜大水坑社区&#xff0c;位于梅观创新走廊九龙山产学研片区内 占地面积&#xff1a;总面积198万平方米&#xff0c;其中项目第一期60万平米开 发 商&#xff1a; 华润集团申报主体&#xff1a;华润置地项目&#xff1a;龙华科技小镇大水坑片区城市…...

论文阅读 | 频谱监测、认知电子战、网电攻击

文章目录 1.《超短波信号的频谱监测与信号源定位》1.1 信号预处理技术1.2 对指定频段的宽带信号截获、分析以及频率分选研究1.3 对指定频段的信号进行最佳分频段扫描分析并还原原信号1.4 总结2.《认知电子战理论及关键技术研究》2.1 认知电子战发展现状2.2 认知电子战发展趋势分…...

MySQL server安装记录

1 安装Notepad 运行下载的 npp.7.9.Installer.x64.exe 2 安装MySQL 将mysql-8.0.22-winx64.zip解压缩&#xff0c;我将其放置D盘根目录下。 进入文件夹&#xff0c;在目录中新建文件夹data和文件my.ini 用NotePad打开my.ini&#xff0c;输入以下内容并保存&#xff0c;其中目…...

平衡树原理讲解

平衡树——Treap 文章目录 平衡树——TreapBST定义性质操作插入insert(o, v)删除del(o, v)找前驱 / 后继get_prev(o)、get_next(o)查找最大 / 最小值get_min(o)、get_max(o)求元素排名get_rank(o)查找排名为 k k k的元素get_value_by_rank 平衡树左旋、右旋zag(o)、zig(o)左旋右…...

SpringMVC框架面试专题(初级-中级)-第七节

欢迎大家一起探讨&#xff5e;如果可以帮到大家请为我点赞关注哦&#xff5e;后续会持续更新 问题&#xff1a; 1.Spring MVC框架中的注解是什么&#xff1f;请举例说明如何使用注解。 解析&#xff1a; Spring MVC是一个基于MVC&#xff08;Model-View-Controller&#xf…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

未授权访问事件频发,我们应当如何应对?

在当下&#xff0c;数据已成为企业和组织的核心资产&#xff0c;是推动业务发展、决策制定以及创新的关键驱动力。然而&#xff0c;未授权访问这一隐匿的安全威胁&#xff0c;正如同高悬的达摩克利斯之剑&#xff0c;时刻威胁着数据的安全&#xff0c;一旦触发&#xff0c;便可…...