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