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

news/2025/1/13 10:57:30/

在 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.ppmy.cn/news/103718.html

相关文章

七个合法学习黑客技术的网站,让你从萌新成为大佬

合法的学习网站&#xff0c;以下这些网站&#xff0c;虽说不上全方位的满足你的需求&#xff0c;但是大部分也都能。能带你了解到黑客有关的技术&#xff0c;视频&#xff0c;电子书&#xff0c;实践&#xff0c;工具&#xff0c;数据库等等相关学习内容。以上这些网站我都是用…

在 AWS EC2 Linux 服务器上部署Gunicorn

在 AWS EC2 Linux 服务器上部署 Flask 应用的步骤类似&#xff0c;你也可以使用 Gunicorn。以下是具体步骤&#xff1a; 1. 连接到你的 AWS EC2 实例。你可以通过 SSH 进行连接&#xff0c;如&#xff1a; ssh -i /path/to/your/key.pem ec2-useryour-ec2-ip-address 2. 在你…

如何优化Vue应用程序的性能?如何使用Webpack进行打包和优化?

嘿&#xff0c;Vue开发者们&#xff0c;你们想让自己的应用程序跑得更快吗&#xff1f;没问题&#xff0c;我可以给你们一些优化建议&#xff01; 首先&#xff0c;我们可以使用Vue.js提供的异步组件来加快应用程序的加载速度。异步组件可以在需要时才加载&#xff0c;而不是在…

MySQL分库分表方案及sharding-spher(2)

六、分库分表总结 在数据库设计时候考虑垂直分库和垂直分表 随着数据库数据量增加&#xff0c;不要马上考虑做水平切分&#xff0c;首先考虑缓存处理&#xff0c;读写分离&#xff0c;使用索引等等方式&#xff0c;如果这些方式不能根本解决问题了&#xff0c;再考虑做水平分…

编程练习【找出数组的最大公约数】

给你一个整数数组 nums &#xff0c;返回数组中最大数和最小数的 最大公约数 。 两个数的 最大公约数 是能够被两个数整除的最大正整数。 示例 1&#xff1a; 输入&#xff1a;nums [2,5,6,9,10] 输出&#xff1a;2 解释&#xff1a; nums 中最小的数是 2 nums 中最大的数是 …

用户需求分析工具:Y模型

用户需求分析工具&#xff1a;Y模型 《人人都是产品经理》作者苏杰提出 阿里巴巴产品经理多年 趣讲大白话&#xff1a;有个框框好同频 【趣讲信息科技180期】 **************************** 很多交流就是鸡同鸭讲 沟通的背景、动机、目的、方式、高度等严重不同 如果有一个模型…

tensorflow 结果复现

我首先使用的本地tensorflow是tf2.8&#xff0c;安装的cpu版本&#xff0c;下面这个结果是可以重复的&#xff0c;无论是直接运行cell,还是restart kernel后重新运行&#xff0c;这个结果都是唯一的 import matplotlib.pyplot as plt import numpy as np import pandas as pd …