`
fwgforce
  • 浏览: 9386 次
  • 性别: Icon_minigender_1
  • 来自: 中国
最近访客 更多访客>>
社区版块
存档分类
最新评论

HashSet存储遇到的问题

阅读更多

今天,朋友突然发来一个类测试结果:

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()!

  ws1,ws2,s1,s2都是不同的对象,为什么会出现3个不同的hash值!那是因为ws1和ws2这种对象和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  就一个值了!

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics