Set集合无序,无下标,不可重复,重复后不存储

Set集合的方法全部来自于继承Collection

HashSet哈希表结构:数组+链表,1.8后再加红黑树

存储过程:

  1. 先用hashCode计算存到哪个位置,为空直接保存
  2. 再用equals判断是否重复
  3. 不重复就串一个单向链表

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:
  1. 31是一个素质数(只有1和它本身两个因数),可以减少散列冲突,尽量让计算结果不同

  2. 提高执行效率:31*i = (i << 5) -i:31本身就是2的4次方-1


  3. 这是数学家们应该探讨的问题,我们只要知道这个事情就可以了

@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判断重复项原理相关推荐

  1. es6去除重复项_Excel的去除重复项你真的明白原理吗?浅尝去除重复项的函数奥秘...

    Excel函数学习:悟空百问の009:去除重复项的深入思考 我们经常整理一些数据,数据不可以动原数据,又需要进行数据分析处理,整理,数据汇总,如何快速的找到这些重复的值,这成了我们很头疼的东西,今天就 ...

  2. excel去重函数的使用方法_Excel的去除重复项你真的明白原理吗?浅尝去除重复项的函数奥秘...

    Excel函数学习:悟空百问の009:去除重复项的深入思考 我们经常整理一些数据,数据不可以动原数据,又需要进行数据分析处理,整理,数据汇总,如何快速的找到这些重复的值,这成了我们很头疼的东西,今天就 ...

  3. 判断对象数组中是否存在重复项

    需求:判断对象数组中是否存在重复项 解决思路:根据数组去判断是否有重复项. 首先将对象数组转成数组(提取重复的选项) 然后判断数组是否存在重复项即可. 注:此方法适用于单个决定性条件导致重复的对象,多 ...

  4. HashSet集合存储数据的结构(哈希表)及set集合存储元素不重复的原理

    set集合存储元素不重复的原理

  5. php中 判断表中是否有重复,PHP:最常见的表中回显重复项的数量

    我试图回应表中最常见的重复项.我已经能够回显重复项的名称,但我正在寻找的是表中的一个单独的列,显示重复发生的次数.有没有一种方法来回显COUNT(*)值?另外一种按大小组织值的方法会很有帮助. 我的P ...

  6. 【一图流思维导图】Redis设计与实现 包括( 数据类型-数据结构) 及应用场景(登录次数校验,在线人数统计,分布式session,redis分页,判断重复注册,社交领域共同喜好,排行榜 ,topN)

    参照 Redis详解(一)------ redis的简介与安装 Redis详解(二)------ redis的配置文件介绍 Redis详解(三)------ redis的六大数据类型详细用法 Redi ...

  7. python列表删除重复项_五分钟学会三种Excel重复项删除方法,工作效率大杀器!...

    点击蓝字 关注我们 在统计数据过程中, 同一份数据可能由于渠道的不同而进行了多次统计, 在输入数据时, 可能因为操作失误重复输入数据.种种原因造成数据表中的数据存在重复现象, 删除重复数据是数据清洗的 ...

  8. 算法训练Day11 | LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    目录 LeetCode232.用栈实现队列 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode225. 用队列实现栈 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 ...

  9. 使用HashSet去除重复元素的集合

    比如,某一个阵列中,有重复的元素,我们想去除重复的,保留一个. HashSet<T>含不重复项的无序列表,从MSDN网上了解到,这集合基于散列值,插入元素的操作非常快. 你可以写一个方法: ...

  10. LeetCode 25K 个一组翻转链表26删除排序数组中的重复项

    如果问题或者其他方法还请分享,如加入打卡微信搜索bigsai回复进群一起打卡. K个一组翻转链表 题目要求 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小 ...

最新文章

  1. 课工场java新手基础教程_Java新手学习路线,学Java不走弯路
  2. farbox editor是个好东西
  3. valid floating point value什么意思_每个位置的球员,都在干些什么
  4. getX(),getY()等方法的区别(图解)
  5. 【Java】ThreadLocal SimpleDateFormat 静态代码块 空指针异常
  6. react生命周期钩子
  7. Java 8 之后,还有哪些进化的功能?
  8. 【WPS单元格】汉字转拼音的方法
  9. Web前端案例——学成网首页制作
  10. matlab中怎么正弦计算,matlab计算结果中的正弦余弦问题
  11. Java基础eclipse版(二)——JDK、Eclipse的下载与安装
  12. 04 vue3 scss 组件component kepp-alive缓存子组件 nextTick
  13. Linux 内核调试 四:qemu-system-arm功能选项整理
  14. 连续支付(周期扣款)功能开发及注意事项
  15. Shiro学习(2)身份验证
  16. NOIP2012——文化之旅
  17. matlab graythresh()函数使用的注意点
  18. 2022“航天宏图杯”遥感影像耕地变化检测第四名方案简介
  19. 【LC刷题笔记】第四天:23+26+33(1-16)
  20. 超级详细的 shell编程知识讲解 —— 第二部分(全文3万多字,看完之后不想成为高手也难!)

热门文章

  1. 小学计算机教师面试试题及答案,2019上半年小学信息技术教师资格证面试试题及答案(精选)第一批...
  2. 一本正经的聊一聊面试官的心理
  3. Dell电脑重装系统
  4. 适合普通大学生的前端开发学习路线
  5. 蜗牛星际安装U-NAS
  6. RabbitMQ(二)
  7. 缠论找日线找第二类买点买入程序
  8. c# 使用正则表达式 提取章节小说正文全本篇
  9. 酒桌上的学问(搜集整理帖)
  10. Raid5数据恢复原理_两块盘离线数据恢复方法