【Java笔记】Java8中数组(引用类型)、String、List、Set之间的相互转换问题

2023-11-17

数组、String、List、Set之间的相互转换问题


如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里

本博主要是相理清楚一些转换的逻辑,顺便总结一下贴出来。这里是把一些可以JDK自带的使用方法写出了。不代表没有其他的转换方式。

前提声明:

只要跟集合交流的数组都是引用类型的数组。因为集合本身不与基本类型打交道。如果你要交流,他们的包装类型就是交流的桥梁。而包装类型和基本类型数组之间的转换就要你自己写循环体去一个一个转型了。


数组和String


String转换为char[]

String转换为char[]的一种方法:

	public static void stringToChar(String str){
		
   
   
    
    char
   
   [] chars1 = str.toCharArray();			//通过toCharArray方法
	}

toCharArray()的源码:

    public 
   
   
    
    char
   
   [] toCharArray() {
        // Cannot use 
   
   
    
    Arrays
   
   .copyOf because of class 
   
   
    
    initialization
   
    order issues
        
   
   
    
    char
   
    result[] = new 
   
   
    
    char
   
   [value.length]; //构造返回的char[]变量
        System.arraycopy(value, 0, result, 0, value.length); 
        //通过arraycopy将String的value值拷贝到result上,返回result
        return result;
    }
char[]转换为String

char[]数组转换为String的两种现有方法:

public static void charToString(){

		
   
   
    
    char
   
   [] chars = {'1','2','3','4','5','6'};
		String str1 = new String(chars);			//通过String构造函数
		String str2 = String.valueOf(chars);		//通过String类型转换,实际也是new String(char[])
		
}

第一种构造函数的源码:

  public String(
   
   
    
    char
   
    value[]) {
        this.value = Arrays.copyOf(value, value.length); 
        //深拷贝一个新的char[]数组给String的value(对于基本类型而言都是深拷贝)
  }

第二种String.valueOf()的源码:

   public static String valueOf(
   
   
    
    char
   
    data[]) {
        return new String(data); //实际上还是String的构造函数
   }

数组和List


包装类数组转换为List
public static void arrayToList(){
		
		Character[] chars = {'1','2','3','4','5','6','7','8','9'};
		
		//方式一
		List<Character> list1 = Arrays.asList(chars); //通过Arrays的工具类
		//方式二
		List<Character> list2 = new ArrayList<>();   //通过Collections工具类
		Collections.addAll(list2,chars);

}

Arrays工具类的源码:

   public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);   //返回Arrays类内部的静态内部类ArrayList实例对象
    }

Collections.addAll工具类的源码:

   public static <T> boolean addAll(Collection<? super T> c, T... elements) {
        boolean result = false;
        for (T element : elements) //通过遍历数组
            result |= c.add(element); //每次都把数组插入到集合c中
        return result;
    }
List转换为包装类数组

List转换为包装类数组的一种方式:

public static void listToArray(){
		List<Character> list = new ArrayList<>();
		list.add('1');
		list.add('2');
		Character[] chars =  list.toArray(new Character[list.size()]);//注意toArray()的参数
}

关于源码的实现,就要具体看是那种List了,从List接口中,我们也能知道一些信息

  <T> T[] toArray(T[] a); //参数是什么类型就返回什么类型的数组

注意:
我们这里特地强调了是List和包装类数组之间的转换。因为集合只支持对包装类进行操作。
所以你如过要进行基本类型数组和List之间的转换,比如char[]转换为List,要先转换成它的包装类型数组Character[]


String和List


分隔符String转换为List

String转换为List的两种方式:

	//原理就是首先将String转换成String[]数组,再通过工具类转换为List
	public static void stringToList (String str){
	
		String str1 = "123456";
		//方式一
		List<String>list1  = Arrays.asList(str.split("")); //str.split()返回一个String[]数组
		//方式二
		List<String>list2 = new ArrayList<>();
		Collections.addAll(list2, str.split(""));
	}

所以有两个步骤

  • 首先要将String转换为包装类型(如Character[])或String[]数组
  • 再把包装类型数组转换成List.

注意
要注意的是,通常所说的String转换成List,方式之一通常是通过split方法转换成String[]数组。
如果你想将String.toArrayChar转换成char[],再转换为List,这就比较麻烦了,首先你先得把char[]基本类型转换成Character[]

List转换为分隔符String

List转换为String的一种方式:

public static void listToString(){
		List<String> list = Arrays.asList("1","2","3","4");
		String str = String.join("", list); //"1234"
}

List通过String的join方法直接转换为String,通过""作为分隔符,就相当于字符之间没有分隔符


List和Set


List转换为Set
public static void listToSet(){
		 List<String> list = new ArrayList<>();
		 Set<String> set = new HashSet<>(list);   //直接构造函数即可
}
Set转换为List
 public static void setToList(){
		 Set<String> set = new HashSet<>();
		 List<String> list = new ArrayList<>(set); //直接构造函数即可
}

所以List集合和Set集合之间只要类型参数相同,既可以通过构造函数互相转换

String和Set


String转换为Set
	public static void stringToSet(){
		String str = "12345";
		String[] strs= str.split("");
		
		//方式一
		List<String> list1 = Arrays.asList(strs);
		Set<String> set1 = new HashSet<>(list1);

		//方式二
		Set<String> set2 = new HashSet<>();
		Collections.addAll(set2, strs);
	}

方式一有三个步骤:

  • String转换为String[]数组 或包装类型数组(如Character[])
  • 将数组转换为List,可以使用Arrays或Collections工具类
  • 将list转换为Set

方式二有两个步骤

  • String转换为String[]数组 或包装类型数组(如Character[])
  • 使用Collections工具类将数组转换为Set
Set转换为String
	public static void setToString(){
		Set<String> set = new HashSet<>();
		String.join("", set);
	}

只需要一个步骤,即

  • 使用String的join方法把集合转换为String

数组和Set


数组转换为Set
public static void arrayToSet(){
		Character[] chars = {'1','2','3','4'};

		//方式一
		List<Character> list = Arrays.asList(chars);
		Set<Character> set12 = new HashSet<>(list);

		//方式二
		Set<Character> set1 = new HashSet<>();
		Collections.addAll(set1, chars);

}

两种方式,同样是受到不同工具类的影响
第一种方式的两个步骤:

  • 数组通过Arrays或Collections工具类转换为List
  • 再把list转换为set

第二种方式的一个步骤:

  • 通过Collections将数组转换为Set
Set转换为数组
	public static void setToArray(){
		Set<Character> set = new HashSet<>();
		Character[] chars = set.toArray(new Character[set.size()]);
	}

集合转为数组的方式也很简单,通常都是集合.toArray(T[] t)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java笔记】Java8中数组(引用类型)、String、List、Set之间的相互转换问题 的相关文章

  • 如何查找字典值的长度

    我对这一切都很陌生 所以这可能是一个新手问题 但我正在寻找字典值的长度 但我不知道如何做到这一点 例如 d key hello brave morning sunset metaphysics 我想知道有什么办法可以找到len or 东西的
  • bash: /bin/ls: 参数列表太长

    我需要列出大量文件 40 000 个文件 如下所示 ERR001268 1 100 fastq ERR001268 2 156 fastq ERR001753 2 78 fastq ERR001268 1 101 fastq ERR0012
  • 如何在给定位置的情况下获取列表中的某个元素?

    所以我有一个清单 list myList myList push back Object myObject 我不确定 但我确信这将是数组中的 第 0 个元素 我可以使用任何函数来返回 myObject 吗 Object copy myLis
  • Python - 为什么这段代码被视为生成器?

    我有一个名为 mb 的列表 其格式为 Company Name Rep Mth 1 Calls Mth 1 Inv Totals Mth 1 Inv Vol Mth 2 等等 在下面的代码中 我只是添加了一个包含 38 个 0 的新列表 这
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • 得到“致命错误:索引超出范围”:在 swiftui 的列表项中显示索引

    更新 错误 类型 没有成员 1 如果在list foreach中放置一个if闭包 if self showMarkedOnly name marked 为什么 代码版本4 struct Name Identifiable Hashable
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • 如何将文本小部件内容设置为 Python/Tkinter 中变量的值?

    我正在编写一个程序来协助完成我工作中可以自动化的一小部分 我来这里的目的是 将一段纯文本复制并粘贴到 Tkinter 文本小部件中 使用粘贴的文本块作为变量的值 以便该变量可以将某些字符拉出并返回到行中 我有一些功能正常的代码 例如 这是我
  • 如何将嵌套的数字列表转换为字符串列表?

    我有下面的列表 p 1 2 3 4 2 3 4 1 如何将子列表放入字符串中 例如 期望的结果是 p 1234 2341 可以通过将每个整数转换为字符串并连接字符串来完成 p join map str sub list for sub li
  • 生成字符串及其子字符串列表的排列的算法

    我已经忘记这个算法有一段时间了 假设我得到了字符串 cccaatt 我试图生成重复字母的每个子串的所有可能变体 EG cccaatt 作为输入将返回 猫 卡特 猫 卡特 ccat 卡特 卡特彼勒 卡特彼勒 cccat cccat cccaa
  • 向 python 元组添加条目

    我有一个代表 x y 点的元组列表 我还有每个点的值列表 如何将它们组合成列表列表 即每个点 x y val 一个条目 或元组列表 Thanks 您无法向元组添加条目 因为元组是不可变的 但您可以创建一个新的列表列表 new x y val
  • 测试 python 列表的所有元素是否为 False

    如何返回False如果所有元素都在列表中False 给定的列表是 data False False False Using any https docs python org 2 library functions html any gt
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • 按属性对对象列表进行排序 C#

    我有这门课 public class Leg public int Day get set public int Hour get set public int Min get set 我有一个获取腿列表的函数 称为 GetLegs Lis
  • 如何显示在 Emacs 中 hippie-expand 命令创建的所有可能的补全?

    我想列出所有项目hippie expand创建 然后通过移动光标并按 RET 键从中进行选择 有什么办法可以做到这一点吗 这是我为此目的使用的 global set key kbd M i complete with helm requir
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • 循环列表的值[重复]

    这个问题在这里已经有答案了 我是编码新手 正在尝试编写一个简单的代码 该代码将采用一个列表 例如 1 2 3 并循环元素 n 次 所以如果n 1 我应该得到A 3 1 2 如果n 2 我应该得到A 2 3 1 我写的代码是 n 1 j 0
  • 寻找嵌套列表中的最低值?

    我正在尝试编写一个函数 它接受一个列表并可以打印该列表中的最小整数 现在我试图弄清楚在嵌套列表中该怎么做 如果最低数字位于这些嵌套列表之一中 那么总的来说它将打印该数字 我的代码在这里 def listMin list2 3 4 2 99
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到

随机推荐

  • MyBatis快速入门(一) 搭建环境和单表映射

    MyBatis简介 一说起对象关系映射框架 大家第一时间想到的肯定是Hibernate Hibernate作为一个著名的框架 功能十分强大 我们只需要配置好实体类和数据表之间的关系 Hibernate就会自动帮我们完成生成并执行SQL语句
  • hive使用时的用户权限问题

    0 jdbc hive2 node1 10000 gt create role root Error Error while processing statement FAILED Execution Error return code 1
  • 599. Minimum Index Sum of Two Lists

    Suppose Andy and Doris want to choose a restaurant for dinner and they both have a list of favorite restaurants represen
  • Java跨平台原理

    第二部分 Java跨平台原理 1 什么是平台 Java是可以跨平台的编程语言 那我们首先得知道什么是平台 我们把CPU处理器与操作系统的整体叫平台 CPU大家都知道 如果计算机是人 那CPU就是人的大脑 它既负责思维运算 又负责身体各部件的
  • Hadoop003-Hadoop的I/O操作

    1 数据完整性 重点词汇 1 校验和 checksum 2 复本因子 replication factor 3 一系列datanode组成的管线 4 fs checksum 5 distcp 2 压缩 文件压缩优点 1 减少存储文件所需要的
  • django启动服务器失败-已解决

    参考菜鸟教程 启动失败 解决办法 将python3改为python
  • android手机时钟、闹钟、计时器、秒表app源码

    简 介 此多功能闹钟界面采用TabHost框架 头部包含分别用LinearLayout水平布局显示四个标签闹钟 时钟 计时器和秒表 FrameLayout框架内部采用LinearLayout垂直布局 功能事件的基本实现分别有AlarmVie
  • MyBatis+MySQL 返回插入的主键ID

    需求 使用MyBatis往MySQL数据库中插入一条记录后 需要返回该条记录的自增主键值 方法 在mapper中指定keyProperty属性 示例如下 Xml代码
  • Unity里面实现单侧拉伸

    完成部分功能的时候 需要模型单侧拉伸 模型锚点不好修改下 可以通过父子物体的方式来实现修改锚点从而实现单侧拉伸 普通状况下锚点在中间 直接拉伸会从中间往两侧伸展 通过把目标对象挂靠在一个空的GameObject中 再把目标对象的一角对应在空
  • (详细安装python_pcl) python_pcl+windows+anaconda

    需要根据已有的python pcl whl文件的版本来创建对应anaconda虚拟环境的python版本 这里拿python pcl 0 3 0rc1 cp37 cp37m win amd64 whl 文件来举例 可以根据文件名cp37 来
  • 面试逻辑题

    逻辑题目 逻辑题目现在也是面试中常考的题目 也不清楚面试出这种题目的意义 可能就是考察面试人员是否逻辑清晰 这种题目没有什么好的方法 除非你见过原题 否则 只能根据所给出的条件慢慢分析 尽量不要用常规思路 希望大家要跳跃思维 如果实在不行就
  • 二进制安装kubernetes三主三从高可用集群

    本文基于Kubernetes1 19版本 以二进制文件方式对如何配置 部署一个启用了安全机制 3节点高可用的Kubernetes集群进行说明 对于测试环境 可以适当进行简化 将某些组件部署为单点 一 k8s高可用集群架构 在正式的环境中应确
  • 数据库的数据备份和数据恢复MySQL

    一 数据的备份 在未登录MySQL的状态下输入下列代码 格式如下 mysqldump uusername p gt d db sql 例如 我的用户名为root 我将备份文件放到d盘目录下 将文件取名为db sql 需要注意两个地方 1 p
  • TIME_WAIT机理

    注 本文系转载 尊重原作者原文链接 TIME WAIT状态原理 通信双方建立TCP连接后 主动关闭连接的一方就会进入TIME WAIT状态 客户端主动关闭连接时 会发送最后一个ack后 然后会进入TIME WAIT状态 再停留2个MSL时间
  • H5+css+js的商品放大镜效果

  • vCenter Server安装报错:内存或cpu不足

    vCenter Server安装报错 内存或cpu不足 前言 在安装vCenter Server7 0时报错 Not enough memory in target host EXSI7 0安装在VMware workstation里面 配
  • 解决用steam客户端购买游戏验证登录信息失败的方法

    用steam客户端购买游戏或者订阅Mod的时候会弹出 正在验证登录信息 的界面 然后登陆失败 尽管你已经登陆了steam 但是好像没有登陆到steam服务器上 你就算是重新登录 翻墙 使用steamcommunity插件 使用加速器 电脑杀
  • HJ28 素数伴侣【python3】

    题目描述 若两个正整数的和为素数 则这两个正整数称之为 素数伴侣 如2和5 6和13 它们能应用于通信加密 现在密码学会请你设计一个程序 从已有的 N N 为偶数 个正整数中挑选出若干对组成 素数伴侣 挑选方案多种多样 例如有4个正整数 2
  • 重启kibana的脚本

    2019独角兽企业重金招聘Python工程师标准 gt gt gt bin bash echo e 033 31m stop kibana by 5601 Now 033 0m ps ef netstat anp grep 5601 awk
  • 【Java笔记】Java8中数组(引用类型)、String、List、Set之间的相互转换问题

    数组 String List Set之间的相互转换问题 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 本博主要是相理清楚一些转换的逻辑 顺便总结一下贴出来 这里是把一些可以JDK自带的使用方法写出了 不代表没有