0

次のようなコードがある場合:

Collection<Object> c = new HashSet<Object>();

コレクションに重複する値を含めることができないというプロパティは保持されますか。つまり、次のような状況ではどうなるでしょうか。

String h = "Hello World!";
c.add(h);
c.add(h);
4

5 に答える 5

2

あなたは「コレクションを構築」していません。新しい参照を作成するだけです。そうです、呼び出しているのは元のオブジェクトのメソッドであるため、基になるプロパティはすべて保持されます。

于 2012-06-01T00:17:55.913 に答える
2

はい、 の動作とプロパティSetは引き続き保持されます。cの1つのインスタンスのみが含まれます"Hello World!"

public static void main(String[] args)
{
    Collection<Object> c = new HashSet<Object>();
    String h = "Hello World!";
    c.add(h);
    c.add(h);
    System.out.println("c contains " + c.size() + " item(s): " + c);
    System.out.println("c is an instance of " + c.getClass());
}

上記のmainメソッドは以下を出力します。

c contains 1 item(s): [Hello World!]
c is an instance of class java.util.HashSet
于 2012-06-01T00:17:15.493 に答える
1
HashSet<T> theSet = new HashSet<T>();
Collection<T> collection = theSet;
Iterable<T> iterable = theSet;
Object object = theSet;

これらの4つの変数はすべて異なるタイプです(HashSetちなみに、それらはすべてスーパータイプである必要があります)が、それらはすべて、タイプが。である同じオブジェクトを参照していますHashSet。オブジェクトへのアクセスに使用する変数に関係なく、オブジェクトは常に同じように動作します。これは、ポリモーフィズムの重要な機能の1つです。

唯一の違いは、継承ツリーを上に移動するほど(上はより一般的なタイプに向かって移動することを意味します)、アクセスできるメソッドとフィールドが少なくなることです。object.iterator()したがって、などのメソッドを呼び出すことはできませんがiterable.size()、すべての変数に共通のメソッドを呼び出すと、常に同じように動作します。

theSet.toString(); // produces []
collection.toString();  // produces []
iterable.toString()  // produces []
object.toString(); // produces []
于 2012-06-01T00:28:51.300 に答える
1

短い: はい - 参照している変数の型が HashSet のスーパー型であっても、HashSet のオブジェクトです。

于 2012-06-01T00:18:13.723 に答える
0
String h = "Hello World!";
c.add(h);//Returns true
c.add(h);//Returns false since duplicate elements are not allowed in HashSet

So only one instance of h will be added to HashSet
于 2012-06-01T00:22:59.130 に答える