这是它的源码:
public boolean containsValue(Object value) {
Node<K,V>[] tab; V v;
if ((tab = table) != null && size > 0) {
for (int i = 0; i < tab.length; ++i) {
for (Node<K,V> e = tab[i]; e != null; e = e.next) {
if ((v = e.value) == value ||
(value != null && value.equals(v)))
return true;
}
}
}
return false;
}
是在遍历数组里先得到头节点,然后再遍历链表得到value,,时间复杂度是O(n)还是O(n²)
介于O(n)和O(n²)之间,更接近于O(n),取决于key的hash重合度,如果所有的value都分布于单独的key,则复杂度就是O(n)。
肯定是O(n²),因为需要先循环出key 才能得到key封装的值。
O(n²),先循环key,在取的value,底层也是用equals比较!
楼主可以先去读hashmap的put方法的源码 了解一下HashMap的数据结构
james_zhg 正解
你得看这个数据长啥样
这样的话
0 1 2数组长3每个位置链表长3
0 0 0
1 1 1
2 2 2
是O(n²)
或者数组长9每个位置链表长1
0 1 2 3 4 5 6 7 8 9
是O(n)
因为是要key的hash值一样的数据才回放到链表中
所有一般O(n²)是不会出现的,比较接近O(n)