HashSetストレージで発生した問題

1890 ワード

今日、友达は突然クラスのテスト結果を出しました.
public class WrappedString {

	@SuppressWarnings("unused")
	private String s;

	public WrappedString(String s) {
		this.s = s;
	}
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		HashSet hs = new HashSet();
		WrappedString ws1 = new WrappedString("aardvark");
		WrappedString ws2 = new WrappedString("aardvark");
		String s1 = new String("aardvark");
		String s2 = new String("aardvark");
		hs.add(ws1);
		System.out.println(hs.size());
		hs.add(ws2);
		System.out.println(hs.size());
		hs.add(s1);
		System.out.println(hs.size());
		hs.add(s2);
		System.out.println(hs.size());
	}
}

彼は私になぜ出力結果が1,2,3,3なのかと聞いた.
本当に気がふさいで、久しぶりにこのものをひっくり返して、基本的な功はすべて悪くありません.ああ、恥ずかしい!その後、hashsetが分割して格納されているのがhash値、すなわちhashcode()であることが分かった.
ws 1,ws 2,s 1,s 2はすべて異なるオブジェクトで、どうして3つの異なるhash値が現れますか!それはws 1とws 2というオブジェクトとStringタイプのオブジェクトとではhashの計算方法が異なるため、objectクラスにおけるhashの方法はオブジェクトのこの内部id番号を直接返すことであり、stringのhashの方法とは異なり、objectのhashの方法は異なるオブジェクトを区別することができる.元のobjectオブジェクトにはハッシュを計算するための意味のある値がないからです.
やれやれ!
コードを次のように変更しました.
HashSet hs = new HashSet();
		WrappedString ws1 = new WrappedString("aardvark");
		WrappedString ws2 = new WrappedString("aardvark");
		String s1 = new String("aardvark");
		String s2 = new String("aardvark");
		hs.add(ws1.s);
		System.out.println(hs.size());
		hs.add(ws2.s);
		System.out.println(hs.size());
		hs.add(s1);
		System.out.println(hs.size());
		hs.add(s2);
		System.out.println(hs.size());

 
結果は、hashsetに追加するたびに文字列タイプの値が増加していることがわかります.だから結果は1,1,1,1で1つの値になります!