1

そのように WrappedString を hashSet に追加することの違いを特定するのを手伝ってください:

public class WrappedString {
private String s;
 public WrappedString(String s) { this.s = s; }
 public static void main(String[] args) {
 HashSet<Object> hs = new HashSet<Object>();
 WrappedString ws1 = new WrappedString("aardvark");
 WrappedString ws2 = new WrappedString("aardvark");
 hs.add(ws1); hs.add(ws2);
 System.out.println(hs.size()); // outputs 2

   }

}

そして以下:

public class WrappedString {
private String s;
 public WrappedString(String s) { this.s = s; }
 public static void main(String[] args) {
 HashSet<Object> hs = new HashSet<Object>();
 String s1 = new String("aardvark");
 String s2 = new String("aardvark");
 hs.add(s1); hs.add(s2);
 System.out.println(hs.size()); // outputs 1
   }

}

どのオブジェクトも hashSet 内に一度だけ存在し、型の 2 つのインスタンスはWrappedString同じ値を持っていても異なる変数と見なされることを知っていますが、型 String の 2 つのインスタンスを異なる方法で扱う理由 (2 つの異なるにもかかわらず、1 つのインスタンスのみが格納されます)オブジェクト)?

4

3 に答える 3

6

主な違いは、それがString実装されているequalsのに対し、あなたが実装してWrappedStringいないことです。したがって、HashSet の観点からは、必要なだけ追加できnew String("aardvark")ます。それらはすべて同じと見なされ (new String("aardvark").equals(new String("aardvark"))真であるため)、1 つだけが追加されます。

2 つの異なるWrappedStringインスタンスは、それらに含まれる文字列が等しい (new WrappedString("aardvark").equals(new WrappedString("aardvark"))が false であるため) であっても等しくないため、セットはそれらを重複とは見なしません。

と同様の動作が必要な場合は、クラスにandStringを実装する必要があります。equalshashcodeWrappedString

于 2013-03-14T12:45:38.007 に答える
0

WrappedString クラスのオーバーライドequalsとメソッドを使用すると、期待どおりに動作します。hashcodeそれらのオブジェクトに同じ文字列オブジェクトが含まれていても、WrappedString は異なるオブジェクトです。以下のようにハッシュコードとイコールを追加します。

public class WrappedString {
    private String s;

    public WrappedString(String s) {
        this.s = s;
    }

    public static void main(String[] args) {
        HashSet<Object> hs = new HashSet<Object>();
        WrappedString ws1 = new WrappedString("aardvark");
        WrappedString ws2 = new WrappedString("aardvark");
        hs.add(ws1);
        hs.add(ws2);
        System.out.println(hs.size()); // outputs 2

    }
    @Override
    public boolean equals(Object obj) {
        WrappedString ws = (WrappedString)obj;
        return this.s.equals(ws.s);
    }
    @Override
    public int hashCode() {
        return this.s.hashCode();
    }

}

ハッシュセットのサイズは 1 になります。

于 2013-03-14T12:45:55.330 に答える
0

「equals」メソッドを検討してください。文字列の場合:new String("aardvark").equals(new String("aardvark"))が返さtrueれ、ハッシュ セットは 2 つの等しいインスタンスを追加しません。ラッパーでは equals メソッドを実装していないため、アドレスが比較され、2 つのインスタンスが等しくないため、両方がセットに挿入されます。

于 2013-03-14T12:47:05.487 に答える