关于Arrays.asList的坑

本文围绕刷算法时遇到的Arrays.asList使用问题展开。指出不能对泛型传入基本数据类型,分析了Arrays.asList源码及contains方法调用的比较逻辑。还探讨了用int[]构建时元素类型,以及Integer与int用==比较的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天刷算法时遇到一个 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用==比较详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值