如果我在这里遗漏了一些核心 Java,请原谅我。
我正在通过HashSet's javadocs 搜索它的实现规范,Collection.containsAll()它显然继承了AbstractCollection根据JDK 8 源代码文档的实现,如下所示:
public boolean containsAll(Collection<?> c) {
for (Object e : c)
if (!contains(e))
return false;
return true;
}
我的问题源于这样一个事实,即虽然HashSet不会覆盖containsAll()它但是会覆盖contains():
public boolean contains(Object o) {
return map.containsKey(o);
}
AbstractCollection同样地:
public boolean contains(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return true;
} else {
while (it.hasNext())
if (o.equals(it.next()))
return true;
}
return false;
}
我的理解是,当实例成员调用未在实例中明确指定时,JVM 会隐式替换它this.instanceMemberCall(),在这种情况下将转换为AbstractCollection'contains()被调用。但是我再次在这里读到HashMap/的时间复杂度将是 O(n),这表明's HashSet( O(1)) 被调用。希望能清楚地了解这背后的实际语义是什么。containsAll()HashSetcontains()
阿波罗的战车
慕码人8056858
相关分类