首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

HashSet存储遇到的有关问题

2012-12-25 
HashSet存储遇到的问题今天,朋友突然发来一个类测试结果:public class WrappedString {@SuppressWarnings(

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

热点排行