HashSet判断重复项原理
Set集合无序,无下标,不可重复,重复后不存储
Set集合的方法全部来自于继承Collection
HashSet哈希表结构:数组+链表,1.8后再加红黑树
存储过程:
- 先用hashCode计算存到哪个位置,为空直接保存
- 再用equals判断是否重复
- 不重复就串一个单向链表
HashSet判断重复项的依据有两项
- 先是hashCode再是equals
- 这两个方法返回的结果都是相等,才判定为重复
Student实体类
基本配置
public class Student implements Comparable<Student>{public String name;
public int age;
public char sex;public Student(){}public Student(String name,int age,char sex){this.age = age;this.name = name;this.sex = sex;
}
重写hashCode()
- 相同数据的字段的hashCode值都是一样的:都是从常量池取值
- 重写hashCode本质:就是判断各个属性的hashCode值,是否相等
为什么乘以31:
31是一个素质数(只有1和它本身两个因数),可以减少散列冲突,尽量让计算结果不同
提高执行效率:31*i = (i << 5) -i:31本身就是2的4次方-1
这是数学家们应该探讨的问题,我们只要知道这个事情就可以了
@Override
public int hashCode() {//return (this.sex + this.age + this.name).hashCode() * 31;/*** Objects是个工具类,* 主要用来优雅的处理null值** hash():返回多个字段的hash总值*/return Objects.hash(name, age, sex);
}
重视equals()
@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;if(o instanceof Student){Student student = (Student) o;return age == student.age && sex == student.sex && Objects.equals(name, student.name);}return false;
}
main()
package com.li.changGe.collections.setGather;import com.li.changGe.pojo.Student;
import java.util.HashSet;
import java.util.Set;public class HashSetDemo01 {public static void main(String[] args) {/*** Set接口只能通过子类实现* 1.8后,new后面的泛型可以不写*/Set<Student> set = new HashSet();Student student = new Student("长歌",18,'女');Student student1 = new Student("世民",22,'男');Student student2 = new Student("则天",20,'女');set.add(student);set.add(student1);set.add(student2);
//------------------------------------------------/*** HashSet判断重复项的依据有两项* 先是hashCode再是equals** 这两个方法返回的结果都是相等,才判定为重复*/set.add(new Student("长歌",18,'女'));/*** 重写前:* 长度:4* [Student{name='则天', age=20, sex=女}* , Student{name='世民', age=22, sex=男}* , Student{name='长歌', age=18, sex=女}* , Student{name='长歌', age=18, sex=女}* ]** 重写后* 长度:3* [Student{name='世民', age=22, sex=男}* , Student{name='长歌', age=18, sex=女}* , Student{name='则天', age=20, sex=女}* ]*/System.out.println("长度:"+set.size()+"\n"+set);}}
HashSet判断重复项原理相关推荐
- es6去除重复项_Excel的去除重复项你真的明白原理吗?浅尝去除重复项的函数奥秘...
Excel函数学习:悟空百问の009:去除重复项的深入思考 我们经常整理一些数据,数据不可以动原数据,又需要进行数据分析处理,整理,数据汇总,如何快速的找到这些重复的值,这成了我们很头疼的东西,今天就 ...
- excel去重函数的使用方法_Excel的去除重复项你真的明白原理吗?浅尝去除重复项的函数奥秘...
Excel函数学习:悟空百问の009:去除重复项的深入思考 我们经常整理一些数据,数据不可以动原数据,又需要进行数据分析处理,整理,数据汇总,如何快速的找到这些重复的值,这成了我们很头疼的东西,今天就 ...
- 判断对象数组中是否存在重复项
需求:判断对象数组中是否存在重复项 解决思路:根据数组去判断是否有重复项. 首先将对象数组转成数组(提取重复的选项) 然后判断数组是否存在重复项即可. 注:此方法适用于单个决定性条件导致重复的对象,多 ...
- HashSet集合存储数据的结构(哈希表)及set集合存储元素不重复的原理
set集合存储元素不重复的原理
- php中 判断表中是否有重复,PHP:最常见的表中回显重复项的数量
我试图回应表中最常见的重复项.我已经能够回显重复项的名称,但我正在寻找的是表中的一个单独的列,显示重复发生的次数.有没有一种方法来回显COUNT(*)值?另外一种按大小组织值的方法会很有帮助. 我的P ...
- 【一图流思维导图】Redis设计与实现 包括( 数据类型-数据结构) 及应用场景(登录次数校验,在线人数统计,分布式session,redis分页,判断重复注册,社交领域共同喜好,排行榜 ,topN)
参照 Redis详解(一)------ redis的简介与安装 Redis详解(二)------ redis的配置文件介绍 Redis详解(三)------ redis的六大数据类型详细用法 Redi ...
- python列表删除重复项_五分钟学会三种Excel重复项删除方法,工作效率大杀器!...
点击蓝字 关注我们 在统计数据过程中, 同一份数据可能由于渠道的不同而进行了多次统计, 在输入数据时, 可能因为操作失误重复输入数据.种种原因造成数据表中的数据存在重复现象, 删除重复数据是数据清洗的 ...
- 算法训练Day11 | LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)
目录 LeetCode232.用栈实现队列 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode225. 用队列实现栈 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 ...
- 使用HashSet去除重复元素的集合
比如,某一个阵列中,有重复的元素,我们想去除重复的,保留一个. HashSet<T>含不重复项的无序列表,从MSDN网上了解到,这集合基于散列值,插入元素的操作非常快. 你可以写一个方法: ...
- LeetCode 25K 个一组翻转链表26删除排序数组中的重复项
如果问题或者其他方法还请分享,如加入打卡微信搜索bigsai回复进群一起打卡. K个一组翻转链表 题目要求 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小 ...
最新文章
- 课工场java新手基础教程_Java新手学习路线,学Java不走弯路
- farbox editor是个好东西
- valid floating point value什么意思_每个位置的球员,都在干些什么
- getX(),getY()等方法的区别(图解)
- 【Java】ThreadLocal SimpleDateFormat 静态代码块 空指针异常
- react生命周期钩子
- Java 8 之后,还有哪些进化的功能?
- 【WPS单元格】汉字转拼音的方法
- Web前端案例——学成网首页制作
- matlab中怎么正弦计算,matlab计算结果中的正弦余弦问题
- Java基础eclipse版(二)——JDK、Eclipse的下载与安装
- 04 vue3 scss 组件component kepp-alive缓存子组件 nextTick
- Linux 内核调试 四:qemu-system-arm功能选项整理
- 连续支付(周期扣款)功能开发及注意事项
- Shiro学习(2)身份验证
- NOIP2012——文化之旅
- matlab graythresh()函数使用的注意点
- 2022“航天宏图杯”遥感影像耕地变化检测第四名方案简介
- 【LC刷题笔记】第四天:23+26+33(1-16)
- 超级详细的 shell编程知识讲解 —— 第二部分(全文3万多字,看完之后不想成为高手也难!)