关于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用==比较详解

你可能感兴趣的:(Java)