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? 就一个值了!