HashSet的存储机制
来源:互联网 发布:json.parse 无效 编辑:程序博客网 时间:2024/06/10 15:27
Java中Set接口下的HashSet类是一个存储不可重复数据的集合,可是我们在用的时候往往发现,明明看似重复的数据,HashSet仍然存储了进去,这不免让我们感到疑惑,不是说存储不可重复的数据的吗?下面通过实验一步一步搞懂HashSet的存储机制。
1、假设有以下类
public class Student {String stuName;public Student() {// TODO Auto-generated constructor stub}public Student(String s){this.stuName = s;}public String getStu(){return this.stuName;} }2、在test类中主函数中写入如下代码
Set<Student> testSet = new HashSet<Student>(); Student s1 = new Student("stu1"); Student s2 =new Student("stu1"); Student s3 =new Student("stu2"); testSet.add(s1); testSet.add(s2); testSet.add(s3); Iterator<Student> it = testSet.iterator(); while(it.hasNext()){ Student tempStu =it.next(); System.out.println(tempStu.getStu()); }Eclipse中的输出为 stu1,stu1,stu2
大家会说,当然了,因为Student类没有比较嘛,下面我们在Student类中重写Object的equals方法
@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubStudent s =(Student)obj;return this.stuName.equals(s.getStu());}仍然是输出三个结果,通过观察Object类的方法,我们发现一个hashCode()方法,HashSet会不会跟这个方法有点关系呢?下面重写这个方法。
@Overridepublic int hashCode() {// TODO Auto-generated method stubif(stuName=="stu1")return 1;else {return super.hashCode();}}Eclipse的输出为stu1 ,stu2
通过给stuName为stu1的Student对象的hashCode赋值为相同的1,我们得到的输出是一个stu1,满足了存储不可重复的目的。下面我们做个有趣的事情。将上面重写的equals方法改为如下代码。
@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubreturn false;}输出 stu1,stu2,stu1
通过给equals方法重写,使其始终返回false,导致即使两个stu1的hashCode相同,仍然可以插入,至此,我们明白了HashSet的存储机制。
HashSet在存一个新的对象的时候,先比较其跟已有的对象中的hashCode是否有相同的,如果没有相同的,则直接添加,不会调用equals方法进行判断,所以导致即使我们重写了equals方法也无法避免重复值的插入,只有当有两个hashCode相同的时候,它才会调用equals方法进行比较,如果返回的是true,则不添加,如果返回false,则添加进集合,所以在最后我们给定stu1的hashCode为1的时候,因为equals始终返回false,所有两个stu1均存到了集合中。
至此,我们搞清楚了HashSet的存储机制,但对于hashCode方法的重写,又会使得我们头疼了,如何使属性相同的hashCode不同呢?好在有Eclipse帮助我们,只要在Student类中右击->source->重写hashCode方法和equals方法,在弹出的窗口中选择相关属性即可,作为小白的我,不得不感叹Eclipse的伟大之处
- hashSet的存储机制
- HashSet的存储机制
- hashmap和hashset的存储机制
- 观察比较ArrayList,HashSet,HashMap的存储机制
- 通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
- 通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
- HashSet的存储原理
- Java中HashMap和HashSet存储机制
- Hash存储机制 - HashMap原理 HashSet原理
- Java中HashMap和HashSet存储机制
- HashSet存储的对象问题
- java-通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
- 跟着源码看ArrayList、LinkedList、HashMap、HashSet的内部存储机制
- HashSet中的add()机制是怎么样的。
- Java中HashSet的存储原理
- HashSet存储自定义集合
- HashSet 存储规则
- HashSet存储自定义对象
- 关键字yield
- 秒杀系统设计的知识点
- CSS 颜色代码大全
- JAVA基础之理解JNI原理
- 静态链接库和动态链接库的区别
- HashSet的存储机制
- 动态规划
- spring与rmi结合使用
- OpenFire源码学习之二十九:openfire集群配置
- POJ 1741 Tree 树+点分治
- java 单向链表
- hdu-4632(区间dp)
- 生产环境下JAVA进程高CPU占用故障排查
- 提高第5课时,实践1,求解分段函数的值