int[]转为List<Integer>时遇到的问题

文章讨论了在Java开发中遇到的问题,即如何正确地将int数组转换为Integer列表。原始代码由于未指定泛型和不正确的Arrays.asList()使用导致编译错误和运行时异常。解决方案包括使用Integer数组、IntStream的boxed()方法或IntStream.of()方法进行转换。文章强调了遵循IDE警告和理解类型转换的重要性。
摘要由CSDN通过智能技术生成

最近在开发过程中,有段代码需要将int[] 转换为 List ,但转换完之后取值时,一直报异常。代码大致如下:

int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList(Arrays.asList(array));
System.out.println(list.get(0));

你认为会打印什么??你以为会将42打印出来吗?实际上,会打印类似的东西:

[I@2ff4acd0

那么,问题在哪里?首先,让我们看看IDE显示的警告:

Raw use of parameterized class 'ArrayList' 
Call to 'asList()' with only one argument

可以看到有两个警告:第一个警告的意思是使用了泛型类 ArrayList 但没有指定类型参数,这会导致安全性问题。我们应该使用 ArrayList 而不是简单的 ArrayList 来指定类型参数。第二个警告是我们调用了 Arrays.asList() 方法,但只传递了一个参数。Arrays.asList() 实际上期望接收多个参数来创建列表,但我们只传递了一个数组。我们先来解决第一个警告 ,在ArrayList后面加上泛型:

int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list.get(0));

但加上之后编译报错,提示如下信息:

Required type: List<Integer>
Provided: ArrayList<int[]>

看起来它与我们之前看到的第二个警告相符。原因是Arrays.asList(array)不会将int装箱为Integer,而是创建一个<int[]>List,而不是我们想要的IntegerList。有几种方法可以解决这个问题:

1、array的类型可以从int[]改为Integer[]:
Integer[] array = new Integer[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(Arrays.asList(array)); 
System.out.println(list.get(0));
2、使用装箱的IntStream可以将array转换为List<Integer>:
int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(Arrays.stream(array).boxed().toList());
System.out.println(list.get(0));
3、从int[]创建IntStream的另一种方法是使用IntStream.of():
int[] array = new int[]{42, 5, 1, 3, 4};
List<Integer> list = new ArrayList<>(IntStream.of(array).boxed().toList());
System.out.println(list.get(0));

三种修复方法都可以将代码将打印42。所以,在idea提示代码警告时,不要不当回事,有时候真的会发生一些难以预料的bug。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值