ArrayList.contains 确实
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;
}
LinkedList 类似,只是它使用 .next() 来遍历元素,所以没有太大区别。
public int indexOf(Object o) {
int index = 0;
if (o==null) {
for (Entry e = header.next; e != header; e = e.next) {
if (e.element==null)
return index;
index++;
}
} else {
for (Entry e = header.next; e != header; e = e.next) {
if (o.equals(e.element))
return index;
index++;
}
}
return -1;
}
HashMap.containKey 使用键的散列来获取具有该散列的所有键(这很快),然后仅在这些键上使用 equals,因此那里有改进;但是 containsValue() 使用 for 遍历值。
TreeMap.containsKey 似乎使用比较器进行知情搜索以更快地找到密钥,因此更好;但是 containsValue 似乎仍然会遍历整个三个,直到找到一个值。
总的来说,我认为你应该使用这些方法,因为它们比每次都循环更容易编写:)。