JAVA踩坑之Arrays.asList().contains()

Arrays.asList().contains()没有得到期望值

本来是想用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.contains()

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
看了这篇文章解决了我的问题

猜你喜欢

转载自blog.csdn.net/xfx_1994/article/details/103527413