今天,朋友突然发来一个类测试结果:
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 就一个值了!
分享到:
相关推荐
HashSet的实现原理 ,HashSet与HashMap的区别 以及 HashSet的底层实现方式
简述了HashSet去重原理
主要介绍了Java HashSet集合存储遍历学生对象代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
hashSet底层去重原理
这个是关于java语言的hashset集合类的一些基本用法和详解了个方法的使用
效率较高:HashSet 的查找、插入和删除操作的时间复杂度通常是常数时间 O(1),因为它使用了哈希表进行存储和检索。 非线程安全:HashSet 类本身不是线程安全的,在多线程环境下需要进行外部同步操作,或者使用 ...
treemap treeset hashset hashmap 简要介绍
Set是java中一个不包含重复元素的collection。更正式地说,set 不包含满足e1....HashSet与TreeSet都是基于Set接口的实现类。其中TreeSet是Set的子接口SortedSet的实现类。Set接口及其子接口、实现类的结构如下所示。
通过 HashMap、HashSet 的源代码分析其 Hash 存储机制1
HashSet 是一个没有重复元素的集合。 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素。 HashSet是非同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它...
Qt4.8.5 Bug Patch File
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
20220424-笔记-HashSet扩容机制
自己写的例子,关于HashSet遍历和HashMap遍历的. 感谢大家参考
c++一个用vector实现java的HashSet集合类,可以将任何类,数字,字符串,vector等等存放到里面
hashMap可以通过一个键值与一个对象一一对应的关系找到我们要找的对象,再调用对象里面的方法
随机数,HsahSet,排序,输出.随机数,HsahSet,排序,输出.
HashSetHashSetHashSetHashSetHashSetHashSetHashSetHashSetHashSet