4
public class abc1 {

 private String s;

 public abc1(String s){this.s=s;}
 public static void main(String args[])
 {
  HashSet<Object> hs=new HashSet<Object>();
  abc1 a1= new abc1("abc");
  abc1 a2= new abc1("abc");
  String s1= new String("abc");
  String s2= new String("abc");
  hs.add(a1);
  hs.add(a2);
  hs.add(s1);
  hs.add(s2);
  System.out.println(hs.size());

 }
}

上記のプログラム出力が 3 なのはなぜですか?

編集

以下のコメントを見て、質問を拡張しています:

System.out.println (s1 == s2);

s1 と s2 は同じオブジェクトを参照していますか? 上記のステートメントは true を出力するはずですが、その出力は false です。

ハッシュコードに関しては似ていますが、それでも違いますか?

4

8 に答える 8

10

( orabc1をオーバーライドしないことに注意してください)の 2 つの等しくないインスタンスと、セット内の 1 つの文字列があります。4 つの呼び出しを見てみましょう。equalshashCodeadd

hs.add(a1);

もともとセットは空なので、明らかに値が追加されます。

hs.add(a2);

これらは別個のオブジェクトであり、equals/のデフォルトの実装hashCodeは基本的に参照 ID であるため、これにより値もセットに追加されます。

hs.add(s1);

これにより、文字列が現在の値 (文字列ではない) のいずれとも等しくないため、値がセットに追加されます。

hs.add(s2);

2 番目の文字列が最初の文字列と等しいため、これはセットに何も追加しません。equals(文字列は/をオーバーライドしますhashCode。)

その結果、3 つのアイテムが入ったセットになります。

于 2010-04-28T17:09:51.793 に答える
2

set構造(ハッシュマップがセットによってどのようにサポートされているかに注意してください)では、2つの等しいオブジェクトを格納できないためです。これがセットの動作です。

a1さて、あなたは両方とa2が等しいと考えることに騙されるかもしれませんが、それらがオーバーライドしない場合equals、またはhashCodeJavaの場合、それらは等しくありません。ただし、文字列s1s2、は、文字列の実装がすでにequalshashCodeメソッドをオーバーライドしているため、実際には同じです。やってみると、結果s1.equals(s2)が得られます。trueあなたがそうするならば、a1.equals(a2)あなたは得るでしょうfalse

最後に、ハッシュセットにはa1、a2、およびs1が含まれます。

あなたはあなたの質問を拡張したので、それに答えるために...

s1 and s2 are not referring to the same object, they are two different String objects but both represent the same set of characters. Since they are not the same object, System.out.println(s1 == s2) prints false. They are equal(), but not the same object.

于 2010-04-28T17:21:29.443 に答える
1

問題は次のとおりです。

String s1= new String("abc");
String s2= new String("abc");

あなたはやろうとすることができます:

System.out.println (s1 == s2);

そして、あなたが参照してくださいtrue。セットに同じオブジェクトを含めることはできないため、s2 のみが格納されます。

于 2010-04-28T17:13:01.903 に答える
0

簡単な答え:HashSetは数学的なセットのようなものであり、定義上、別個の(一意の)オブジェクトのみを保持するためです。そして、他の人がここで言っているように、あなたが入れた2つのオブジェクトは明らかに互いに区別されていると評価されていません。

于 2010-04-28T17:17:52.260 に答える
0

Set interfaceは、重複する要素を許可しません。これが、出力として3を取得する理由です。

String s1= new String("abc");
  String s2= new String("abc");

上記は2つのオブジェクトを作成しますが、同じ要素です。

于 2010-04-28T17:20:12.560 に答える
0

与えられた

  abc1 a1= new abc1("abc");
  abc1 a2= new abc1("abc");

equals()a1!= a2は、含まれている文字列が同じである場合にa1とa2が同じであることを示すオーバーライドを指定しなかったためです。

..と..

HashSet一意のオブジェクトのみを保持します。

于 2010-04-28T17:21:54.840 に答える
0

3 つの一意のオブジェクトを追加しているため、2 つの ab​​c1 オブジェクト (同等性を定義するには equals メソッドと hashCode メソッドを実装する必要があります) と String (これらのメソッドを実装しているため、1 つだけが追加され、データは比較されます) String オブジェクトは等しい)。

于 2010-04-28T17:11:33.843 に答える
0

HashSet は Set インターフェースを実装します。

public interface Set<E> extends Collection<E>

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Set.htmlから:

重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。

答え:

s1 と s2 は等しいことがわかり、両方をセット内に含めることはできないと思います。abc1 オブジェクトが「等しい」かどうかを判断する方法はありません。したがって、両方が追加されます。

于 2010-04-28T17:14:05.683 に答える