本来是想用Arrays.asList().contains()来判断某个值是否存在于数组中,可是后来一运行发现String[]判断结构正常,而对int[]值的判断输出结果永远是false。测试代码如下:
public static void main(String[] args) {
String[] strArr = {"0","1","3","4","5","6","X","Y"};
boolean isexistStr1 = Arrays.asList(strArr).contains("1");
boolean isexistStr9 = Arrays.asList(strArr).contains("9");
System.out.println("strArr is exist '1'"+isexistStr1);
System.out.println("strArr is exist '9':"+isexistStr9);
int[] intArr = {0,1,2,3,4,5};
boolean isexistInt1 = Arrays.asList(intArr).contains(1);
boolean isexistInt9 = Arrays.asList(intArr).contains(9);
System.out.println("intArr is exist 1"+isexistInt1);
System.out.println("intArr is exist 9:"+isexistInt9);
}
运行结果如下:
strArr is exist '1’true
strArr is exist ‘9’:false
intArr is exist 1false
intArr is exist 9:false
为什么会出现这样的结果?先来看看Arrays.asList()的源码:
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
创建了一个ArrayList对象,我们再看看Arrays$ArrayList中的实现:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int indexOf(Object o) {
E[] a = this.a;
if (o == null) {
for (int i = 0; i < a.length; i++)
if (a[i] == null)
return i;
} else {
for (int i = 0; i < a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
@Override
public boolean contains(Object o) {
return indexOf(o) != -1;
}
}
当我们调用contains(Object o)这个方法时,传入int型的参数会自动装箱成为Integer 类型。在contains()中调用的是indexOf(Object o),也就是说此时实际上调用的是Integer.equals()。ArrayList中最初调用构造方法给E[] a赋的值是int[],在调用o.equals(a[i])的时候传入的a[i]也是int型的。
接下来看看 Integer.equals() :
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
当Integer.equals()传入参数为int型,obj instanceof Integer永远是false,因此用Array.asList().contains来判断int型数组中是否存在某一个数值是不可行的。
ArrayUtils是common.lang中的一个工具类。
于是用ArrayUtils.contains(int[] array, int valueToFind)取代了之前的方法,代码如下:
public static void main(String[] args) {
String[] strArr = {"0","1","3","4","5","6","X","Y"};
boolean isexistStr1 = ArrayUtils.contains(strArr,"1");
boolean isexistStr9 = ArrayUtils.contains(strArr,"9");
System.out.println("strArr is exist '1'"+isexistStr1);
System.out.println("strArr is exist '9':"+isexistStr9);
int[] intArr = {0,1,2,3,4,5};
boolean isexistInt1 = ArrayUtils.contains(intArr,1);
boolean isexistInt9 = ArrayUtils.contains(intArr,9);
System.out.println("intArr is exist 1"+isexistInt1);
System.out.println("intArr is exist 9:"+isexistInt9);
}
运行得到了期望的结果:
strArr is exist '1’true
strArr is exist ‘9’:false
intArr is exist 1true
intArr is exist 9:false
结论:
在判断某个值是否存在于数组中时,对于String[]使用Arrays.asList().contains()或者ArrayUtils.contains()都是可行的,而对于int[]使用Arrays.asList().contains()并不能得到期望的结果,需要使用ArrayUtils.contains()
参考文章:【Java踩坑记】——JSONObject中的get与getString
看了这篇文章解决了我的问题