当前位置: 首页 > news >正文

重学java 55. 集合 Set接口

我救自己万万次,铮铮劲草,绝不动摇

                                                        —— 24.6.2

一、Set集合介绍

Set和Map密切相关的
Map的遍历需要先变成单列集合,只能变成set集合

二、HashSet集合的介绍和使用

1.概述

        HashSet是Set接口的实现类

2.特点

        a、元素唯一

        b、元素无序

        c、无索引

        d、线程不安全

3.数据结构:哈希表

        a、jdk8之前:哈希表 = 数组 + 链表

        b、jdk8之后:哈希表 = 数组 + 链表 + 红黑树

                加入红黑树的目的:查询速度快

4.方法

        和collection一样

5.遍历

        a、增强for

        b、迭代器

package S87Set;import java.util.HashSet;
import java.util.Iterator;public class Demo241HashSet {public static void main(String[] args) {HashSet<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("王五");set.add("赵六");set.add("田七");// 读取顺序无序System.out.println(set);// 遍历 增强forfor (String s : set) {System.out.println(s);}System.out.println("——————————————————————————");// 迭代器Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

三、LinkedHashSet的介绍以及使用

1.概述

        LinkedHashSet extends HashSet

2.特点

        a、元素唯一

        b、元素有序

        c、无索引

        d、线程不安全

3.数据结构        

        哈希表 + 双向链表        

4.使用

        和HashSet一样

package S87Set;import java.util.Iterator;
import java.util.LinkedHashSet;public class Demo242LinkedHashSet {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("张三");set.add("李四");set.add("王五");set.add("赵六");set.add("田七");// 读取顺序无序System.out.println(set);// 遍历 增强forfor (String s : set) {System.out.println(s);}System.out.println("——————————————————————————");// 迭代器Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

四、哈希值

1.概述:

        是由计算机算出来的一个十进制数,可以看做是对象的地址值

2.获取对象的哈希值,使用的是object中的方法

        public native int hashcode()

3.注意:

        如果重写了hashcode方法,那计算的就是对象内容的哈希值了

        如果不重写hashcode方法,默认计算对象的哈希值

五、字符串的哈希值如何计算出来

直接跑到stringLatin1.hashcode(value)底层源码,

计算abc的哈希值 —> 0xff这个十六进制对应的十进制255任何数据和255做&运算,都是原值

第一圈:
        h=31*0+97 =97
第二圈:
        h=31*97+98 = 3105
第三圈:
        h=31*3105+99=96354
问题:在计算哈希值的时候,有一个定值就是31,为啥?
        31是一个质数,31这个数通过大量的计算,统计,认为用31,可以尽量降低内容不一样但是哈希值一样的情况
        内容不一样,哈希值一样(哈希冲突,哈希碰撞)

六、HashSet的存储去重复的过程

1.先计算元素的哈希值(重写hashCode方法),在比较内容(重写equals方法)

2.先比较哈希值,如果哈希值不一样,存储

3.如果哈希值一样,再比较内容
        a.如果哈希值一样,内容不一样,存
        b.如果哈希值一样,内容也一样,去重复

package S88Hash;import java.util.HashSet;public class Demo244HashTest {public static void main(String[] args) {HashSet<Object> set = new HashSet<>();set.add("abc");set.add("通话");set.add("重地");set.add("abc");System.out.println(set);    // [通话, 重地, abc]}
}

七、Hashset存储自定义类型如何去重复

        1.如果Hashset存储自定义类型,如何去重复呢?重写hashcode和equals方法,让Hashset比较属性的哈希值以及属性的内容
        2.如果不重写hashcode和equals方法,默认调用的是object中的,不同的对象,肯定哈希值不一样,equals比较对象的地址值也不一样,所以此时即使对象的属性值一样,也不能去重复

http://www.lryc.cn/news/360979.html

相关文章:

  • spring项目修改时间格式
  • 每周统计-20240531
  • 【工具】探索 DOU:每用户数据使用量
  • JVM之垃圾判断的详细解析
  • 07- Redis 中的 HyperLogLog 数据类型和应用场景
  • jenkins应用2-freestyle-job
  • K210视觉识别模块学习笔记1:第一个串口程序_程序烧录与开机启动
  • [数据集][目标检测]脑溢血检测数据集VOC+YOLO格式767张2类别
  • 如何借VR之手,让展厅互动更精彩?
  • 微信小程序如何使用地图
  • 力扣 287. 寻找重复数
  • 怎样清理Mac存储空间 苹果电脑内存不够用怎么办 苹果电脑内存满了怎么清理
  • 网络遗忘权的实现方法
  • 【Python内功心法】:深挖内置函数,释放语言潜能
  • JS-09-es6常用知识1
  • SpringBoot 基础之自动配置
  • Oracle dblink 发现Network 等待事件的分析 enq: KO - fast object checkpoint
  • SpringMVC:向三大域对象存数据
  • 如何用python做一个用户登录界面——浔川python社
  • Python知识点9---推导式
  • 用C++做一个跑酷游戏
  • 基于字典树可视化 COCA20000 词汇
  • TypeScript 中的命名空间
  • [C++] 小游戏 斗破苍穹 2.2.1至2.11.5全部版本(上) zty出品
  • 单元测试的心法分享
  • 【python】多线程(3)queue队列之不同延时时长的参数调用问题
  • Java开发常见基础问题
  • 大数据组件doc
  • Docker Hub 国内镜像源配置
  • 持续总结中!2024年面试必问 20 道 Kafka面试题(一)