- 說說Arrays.asList():
在此我本來想利用將數組轉換成,然後判斷某個數是否在某個數組之中。看起來好像沒什麼問題,那麼我們來仔細看看具體的源碼實現。
先來看看Arrays.asList()方法:
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
這裏創建了一個ArrayList對象,我們接着看看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;
}
//省略
......
}
這裏的Objects.requireNonNull()僅僅是做一個是否爲空的判斷,如果爲空則拋異常,否則直接返回。那麼我們可以看到。如果我們直接傳入int[] ,那麼此時賦值也是int[],並麼有發生任何其他操作。
我們再來看看contains操作,可以看到實際調用的是indexOf方法。回到我們的代碼中ints[i] 是int型(這裏調用contains的時候自動打包成Integer類型,自動裝箱)。所以再這個indexOf中比較時實際調用的是Integer.equals。
來看看Integer.equals:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
由於我們初始化ArrayList的時候使用的是int[] ,所以在調用o.equals(a[i])的時候,傳入的a[i]也是int型的。至此,obj instanceof Integer永遠是false。所以在我們代碼中,用Array.asList().contains判斷某個數是否在數組中存在是不可行的。
- 替代工具ArrayUtils:
ArrayUtils是common.lang中的一個方法類。 我們可以藉助該類來確定一個數組中是否含有某個值。
可以替換爲ArrayUtils.contains(result,ints[i]):
public static void pl2(int[] ints,int[] result,int start){
int[] data = result.clone();
if (ints.length == start){
num++;
System.out.println(num + " : " + Arrays.toString(result));
}else {
for (int i = 0 ;i < ints.length; i ++ ){
if (!ArrayUtils.contains(result,ints[i])){
data[start] = ints[i];
pl2(ints,data,start+1);
}
}
}
}