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

相关文章

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 中 RestTemplate 的核心用法指南

《SpringBoot中RestTemplate的核心用法指南》本文详细介绍了RestTemplate的使用,包括基础用法、进阶配置技巧、实战案例以及最佳实践建议,通过一个腾讯地图路线规划的案... 目录一、环境准备二、基础用法全解析1. GET 请求的三种姿势2. POST 请求深度实践三、进阶配置技巧1

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

SpringBoot整合Zuul全过程

《SpringBoot整合Zuul全过程》Zuul网关是微服务架构中的重要组件,具备统一入口、鉴权校验、动态路由等功能,它通过配置文件进行灵活的路由和过滤器设置,支持Hystrix进行容错处理,还提供... 目录Zuul网关的作用Zuul网关的应用1、网关访问方式2、网关依赖注入3、网关启动器4、网关全局变

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoot的全局异常拦截实践过程

《SpringBoot的全局异常拦截实践过程》SpringBoot中使用@ControllerAdvice和@ExceptionHandler实现全局异常拦截,@RestControllerAdvic... 目录@RestControllerAdvice@ResponseStatus(...)@Except

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过