java中List的toArray()方法

2024-05-10 20:12
文章标签 java 方法 list toarray

本文主要是介绍java中List的toArray()方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

toArray()介绍
toArray()方法是List接口中提供的方法,用来实现List对象转换为数组对象的功能。

toArray()方法有两种形式,无参方法和带泛型的方法,接下来给出例子。

1.toArray()

	// toArray()源码public Object[] toArray() {return Arrays.copyOf(elementData, size);}

该方法不能指定转换数组的类型,返回值只能是Object()数组,所以得到返回值后往往需要做类型转换,将Object[]转换为我们需要的类型。但是,往往在转换这一部会出问题,如下例:

List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Integer[] res = new Integer[list.size()];res = (Integer[])list.toArray();

该代码能通过语法检查,但是在运行时会报类型转换错误,说明Object()不能简单地转换为其他类型的数组。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

2.toArray(T[] a)

	// toArray(T[] a)源码public <T> T[] toArray(T[] a) {if (a.length < size)// Make a new array of a's runtime type, but my contents:return (T[]) Arrays.copyOf(elementData, size, a.getClass());System.arraycopy(elementData, 0, a, 0, size);if (a.length > size)a[size] = null;return a;}

该方法比前一种无参的方法更灵活,要求用户提供一个目标对象的泛型,在数组转换后,会返回一个指定类型的数组,不存在类型转换错误。使用举例:

		List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");String[] res = new String[list.size()];

这样就可以将List对象转换为String[]了。

List转换为int[]的三种方法

上边介绍toArray()时给出了两种方法,第二种带泛型的方法使用范围更广。我最近使用了第二个方法,发现了一些问题。我要实现的功能如下:

给定 一个List对象:List list = new ArrayList<>();将其转换为一个int[]数组。

我toArray()带泛型的方法来实现,代码如下:

		List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);int[] res = new int[list.size()];res = list.toArray(res);

但是实际上上面的代码是错的,因为toArray()的泛型参数不能是int,只能是其包装类Integer,所以通过toArray()不能直接将List对象转换为一般类型的数组,具体的转换方法有如下三种:

法一:循环赋值

将List中的元素一个个取出来,赋值到int[]数组中的对应位置。

		List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);int[] res = new int[list.size()];for(int i = 0; i < list.size(); i++){res[i] = list[i];}

这个方法虽然需要遍历,但是思路简单,一般不会出错。

法二:通过泛型实现转换

以最终目标数组为int[]为例,从List转换为int[]数组,可以借助于Integer[]数组来实现,代码如下:

     

		List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Integer[] res = new Integer[list.size()];res = list.toArray(res);

这样可以得到一个Integer[]数组,然后再使用循环赋值将Integer[]数组转换为int[]数组即可。

法三:使用流

使用Java1.8中提供的新方法来实现。以下是List、Integer[]、int[]三者的相互转换代码

		int[] data = {4, 5, 3, 6, 2, 5, 1};        // int[] 转 List<Integer>       List<Integer> list1 = Arrays.stream(data).boxed().collect(Collectors.toList());       // Arrays.stream(arr) 可以替换成IntStream.of(arr)。      // 1.使用Arrays.stream将int[]转换成IntStream。       // 2.使用IntStream中的boxed()装箱。将IntStream转换成Stream<Integer>。       // 3.使用Stream的collect(),将Stream<T>转换成List<T>,因此正是List<Integer>。        // int[] 转 Integer[]       Integer[] integers1 = Arrays.stream(data).boxed().toArray(Integer[]::new);       // 前两步同上,此时是Stream<Integer>。      // 然后使用Stream的toArray,传入IntFunction<A[]> generator。       // 这样就可以返回Integer数组。      // 不然默认是Object[]。// List<Integer> 转 Integer[]       Integer[] integers2 = list1.toArray(new Integer[0]);       //  调用toArray。传入参数T[] a。这种用法是目前推荐的。      // List<String>转String[]也同理。        // List<Integer> 转 int[]       int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray();       // 想要转换成int[]类型,就得先转成IntStream。      // 这里就通过mapToInt()把Stream<Integer>调用Integer::valueOf来转成IntStream         // 而IntStream中默认toArray()转成int[]。       // Integer[] 转 int[]       int[] arr2 = Arrays.stream(integers1).mapToInt(Integer::valueOf).toArray();      // 思路同上。先将Integer[]转成Stream<Integer>,再转成IntStream。       // Integer[] 转 List<Integer>       List<Integer> list2 = Arrays.asList(integers1);       // 最简单的方式。String[]转List<String>也同理。        // 同理       <br>         String[] strings1 = {"a", "b", "c"};      // String[] 转 List<String>       List<String> list3 = Arrays.asList(strings1);       // List<String> 转 String[]       String[] strings2 = list3.toArray(new String[0]);   

        

这篇关于java中List的toArray()方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977443

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。