本文主要是介绍关于Arrays.asList的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天刷算法时遇到一个 Arrays.asList 的使用问题
int[] arr0 = {2,5,6,7,1283};List list0 = Arrays.asList(arr0);System.out.println(list0.contains(1283));
返回false
Integer[] arr = {2,5,6,7,1283};List list = Arrays.asList(arr);System.out.println(list.contains(1283));
返回 true。
这是泛型的问题,你不能对泛型传入基本数据类型
来看下 Arrays.asList 源码
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}
这里创建的是Arrays私有的静态内部类ArrayList
private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable{private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}
若你的数组是 Integer 类型,则这里的 a 就是 Integer[ ] a
跟踪 contains 方法
public boolean contains(Object o) {return indexOf(o) != -1;}
最后调用的是 o.equals(a[i]) 进行的比较。o 就是我们例子中的1283
Object ob = 1283;System.out.println(ob.getClass().getName());
返回 java.lang.Integer,也就是说当我们调用 Arrays#contains(1283) 实际上调用的是 Integer#equals 进行的比较,
Integer#equals:public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}
若对象不是 Integer 类型则返回false,这里若传入 int 则会有一个装箱过程。
若我们用 int[ ] 构建,则最后得到的元素是什么类型
int[] arr0 = {2,5,6,7,1283};List list0 = Arrays.asList(arr0);System.out.println(list0.get(0).getClass().getName());
返回 [I,所以 list0.contains(1283) 才会返回false。
关于 Integer 与 int 的比较问题:java中int与Integer用==比较详解
这篇关于关于Arrays.asList的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!