【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之间的相互转换问题 的相关文章

随机推荐

  • 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自带的使用方法写出了 不代表没有