HashSet的去重
发布日期:2022-02-01 14:28:19
浏览次数:47
分类:技术文章
本文共 1886 字,大约阅读时间需要 6 分钟。
HashSet的去重
HashSet
HashSet存储的数据结构是哈希表,也就是数组和链表的组合物。
此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
Hash:哈希——实际含义散列,就是一种算法,把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
哈希表:数组加链表,既有数组的优点也有链表的优点。
存储特点:
相对无序存储,不可以存储相同元素(排重),通过哈希表实现的集合
HashSet去重
HashSet底层依赖的是哈希表,在元素存放时候,会先根据元素的hashcode值来判定,如果没有相等的hashcode值则放入数组中,(hashCode()是Object中的方法,每个对象的hashCode值是唯一的,所以可以理解成hashCode值表示这个对象在内存中的位置
字符串String的hashCode(),是根据内容计算的。)若hashcode相等,则会用equls方法来比较,equals()方法是Object类中的方法,表示比较两个对象是否相等,若不重写相当于比较对象的地址,因此当用HsshSet来去重字符串和基本数据类型的时候,hashcode比较的是内容。
》》当我们在添加相同的学生类对象的时候,我们发现相同的属性信息的学生也可以添加进去,便会产生疑惑,为什么HashSet不是又去冲的效果吗?怎么还会有重复的元素呢?
张三实行是相同的运行结果还是会有两个相同张三,并没有去除重复
这是因为当我们传入的对象是对象类型的时候,由于每个对象的hashcode值都不一样,而我们传入对象的属性却又可不能一样的,这样hashset依然不能将属性相同的对象看作同一对象,那么这时候我们可以重写对象类中的hashcode方法和equls方法,用对象的属性值相同与否来确定是否重复代码如下:
public class Student { private String name; public Student(String name) { super(); this.name = name; } public Student() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [name=" + name + "]"; } @Override //重写equals public boolean equals(Object obj) { //先判断传入的参数对象是否是Student对象,若不是直接返回false if(obj instanceof Student) { //若是,强转成Student对象,并比较属性的值 Student s = (Student) obj; if(this.name.equals(s.name)) { //若属性的值相同,则返回true return true; } } return false; } @Override public int hashCode(){ /*hashCode方法返回值是int类型,所以重写时需要找到int类型的数据返回,还要保证此方法的返回值与对象的所有属性都相关,所以返回姓名属性的字符串的长度*/ return this.name.hashCode(); }}
这里我们在Student类中重写了hashcode和equls方法,将对象的属性值来作为去重的判定条件,这样在添加属性相同的对象时候,属性相同的对象就不会被添加进去。
!!!同样HashSet的remove()方法底层也是哈希表来实现的 当我们删除一个元素时候在remove中添加一个对象张三,虽然属性值相同,但是两个对象的hashcode和equls没有重写时候对象地址值是不同的,因此传入的对象在没有重写两个方法时候,也是不能删除的哈上图看一下: 运行的结果还是… 重写hashcode和equls方法在添加和删除就都ok了。(IDEA中都会有自带的重写方法快捷键 :Alt+ins)转载地址:https://blog.csdn.net/shunshizhen120412/article/details/98843698 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月15日 16时32分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode 1324. 竖直打印单词
2019-04-28
LeetCode 692. 前K个高频单词(优先队列)
2019-04-28
LeetCode 583. 两个字符串的删除操作(动态规划)
2019-04-28
LeetCode 332. 重新安排行程(欧拉路径)
2019-04-28
LeetCode 1452. 收藏清单(std::includes判断子集)
2019-04-28
LeetCode 1453. 圆形靶内的最大飞镖数量(几何题)
2019-04-28
LeetCode 372. 超级次方(快速幂)
2019-04-28
LeetCode 393. UTF-8 编码验证(位运算)
2019-04-28
LeetCode 373. 查找和最小的K对数字(自定义优先队列BFS)
2019-04-28
Feature Engineering 特征工程 1. Baseline Model
2019-04-28
LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)
2019-04-28
LeetCode 388. 文件的最长绝对路径(不用栈,前缀和)
2019-04-28
LeetCode 424. 替换后的最长重复字符(滑动窗口)
2019-04-28
LeetCode 416. 分割等和子集(动态规划)
2019-04-28
LeetCode 662. 二叉树最大宽度(递归)
2019-04-28