ArrayList APIを調べていると、奇妙に見えるものに気づきました。
実際、ここでは、コレクションが引数として渡されたArrayListコンストラクターの実装です。
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
そしてここでHashSetクラスに相当するもの:
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
したがって、ArrayListの1つは、パラメーターのコレクションによって提供される要素のCOPY(Arrays.copyOf)を使用しましたが、HashSetの1つは、addAll()メソッドを使用していることがわかります。
そしてもちろん、addAll()メソッドは要素をコピーせず、HashSetコレクションへの参照を追加するだけです。
この微妙な違いは、それを無視する発信者にとって「危険」だと思います。
同じ参照を持つコレクションを期待する人もいれば、ArrayList APIをよく読む人は、元のコレクションからの要素のコピーを期待するでしょう。
SunがこれらのCollectionsサブクラスに同じ概念を提供しなかったのはなぜですか?