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

我正在参加「掘金·启航计划」,最近在开发过程中,有段代码需要将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。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYW9b5EY' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片