Прошу прощения, если мне не хватает некоторого ядра Java здесь.
Я искал в javadocs HashSet
спецификацию его реализации 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
s contains()
, который вызывается.Но опять же Я прочитал здесь , что сложность времени для HashMap
/ HashSet
* containsAll()
будет O (n), предполагая, что HashSet
* contains()
(O (1)) называется.Был бы признателен за некоторую ясность относительно фактической семантики, стоящей за этим.