今天,朋友突然发来一个类测试结果:
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 就一个值了!