function contains() is defined in Collection, so List, Set,Queue all have this function.
But the point is that the efficiency is different.
ArrayList
from the source code, we know that the ArrayList is implement by a object[]
transient Object[] elementData;
let’s look into the contains(), we can see it just traverse the array to find the element. so the complexity is O(n)
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
HashSet
HashSet is implement by a HashMap.
private transient HashMap<E,Object> map;
and it will directly use HashMap’s containsKey(). containsKey() will use hash() to calculate the index of the element, the index was the postion in the HashSet, time complexity isO(1).
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}
summary
if you want to use contains() to judge whether a element exist in the <? extends Collection>, you should better use HashSet Rather than ArrayList