私はここにいくつかのコアのJavaを欠けている場合はすみません。
私は、を検索してHashSet
のそれの実装の仕様のためのjavadocを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
/ HashSet
さんは、containsAll()
ことを示唆しているO(n)となりますHashSet
S ' contains()
(O(1))と呼ばれています。この背後にある実際の意味が何であるかに関して、いくつかの明確さをお願い申し上げます。
いいえ、これは単純に多型です。メソッドがオブジェクトで呼び出されるたびに、真のそのオブジェクトの種類は、他に何も問題にしません。
意味:問題ではありませんfoo()
ベースで実装されています。ときfoo()
のコールbar()
とbar()
子で上書きされています。あなたは子オブジェクトを持っている場合、それは常に子供になりbar()
呼び出されるバージョン。
あなたの例では、this
AbstractSetないが、それはですHashSet
!
それとも、再び他の言葉で:それは、メソッドが呼び出され、「どこ」問題ではありません。重要なのは、それが呼び出されたオブジェクトのタイプです。言ったように、あなたのオブジェクトの型はHashSetのです!