java数据结构(红黑树)set集合 HashSet HashSet三个问题 LinkedHashSetTreeSet TreeSet集合默认规则排序规则

news2024/12/24 10:59:53

目录

  • 数据结构(红黑树)
    • 红黑规则
    • 红黑树添加结点规则
  • set集合
  • 小结
    • HashSet
  • HashSet三个问题
  • LinkedHashSet
    • 小结
  • TreeSet
    • TreeSet集合默认规则
    • 排序规则(第一种排序方法)
    • 方式二
      • 练习
    • 小练
  • 总结
  • 总结 集合的使用应该怎么选择

数据结构(红黑树)

在这里插入图片描述
在这里插入图片描述

红黑规则

在这里插入图片描述
后代节点就是比如13根结点 13下面的8和17上的都是后代叶节点
简单路径就是比如随便一个13到8到11到nil就是一个简单路径.但是如果出现13到8然后再8回13再13到8这就不是简单路径了

红黑树添加结点规则

在这里插入图片描述

set集合

在这里插入图片描述

  public static void main(String[] args) {

        Set<String>s=new HashSet<>();


        s.add("张三");
        s.add("李思");
        s.add("王五");
        s.add("老刘");
        //添加元素不能重复 如果重复了打印无结果
        //细节:add有返回值 会先判断这个元素添加过没有


        //打印
        Iterator<String> iterator = s.iterator();
        while (iterator.hasNext()){
            iterator.next();

        }
        System.out.println(s);//[张三, 李思, 王五, 老刘]


        //增强for遍历
        for (String s1 : s) {
            System.out.print(s1);//张三李思王五老刘
        }

        System.out.print("________________");
        //lambda表达式

        s.forEach(new Consumer<String>() {
            @Override
            public void accept(String s2) {
                System.out.print(s2);
            }
        });
        //lambda简化
        s.forEach(s3-> System.out.print(s3));
    }

小结

在这里插入图片描述
简单记忆:hash:杂乱->无序;linked:链锁->有序;tree:树->可排序

HashSet

在这里插入图片描述
在这里插入图片描述

哈希值:对象的整数表现形式
哈希碰撞发生的概率特别小可以不计.

 public static void main(String[] args) {


        //创建对象
        Student s1=new Student("张三",18);
        Student s2=new Student("张三",18);

        //System.out.println(s1.hashCode());//488970385
        //System.out.println(s2.hashCode());//1209271652
        //这是没有重写hash方法 不同对象计算出的哈希值不同


        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        //24022538
        //24022538
        //重写了hash方法 不同对象只要属性值相同计算出的哈希值也相同
        
    }

在这里插入图片描述

hash表保证元素统一的方法.当要添加一个新元素的时候,发现要添加的位置有元素而且是链表挂了两个,挨个进行equals进行比较,如果都不一样才会添加新的元素.如果比较第三个发现第三个一样,要添加的元素会舍弃不存

加载因子0.75就是扩容时机,以这个题为例,当数组存入16×0.75=12个元素的时候这个数组就会扩容至原先的两倍
在这里插入图片描述

当链表的长度过长大于8而且数组长度大于等于64当前链表会自动转化为红黑树

HashSet三个问题

HashSet为什么没有索引因为底层的结构不唯一(就是有时候用链表存数据有时候用的红黑树),结构太多导致于确定索引比较困难,所以舍弃了索引机制
HashSet利用什么机制保证去重重写equals方法和Hash方法
HashSet为什么存和取的顺序不一样因为存入数据的时候可能会用到链表和红黑树的方式所以取的时候也是按照他们的规则存取的
HashSet添加元素的过程2、新元素排在老元素后面

LinkedHashSet

在这里插入图片描述

每一个元素都记录当前元素地址值和后一个元素的地址值所以说他是有序的

   public static void main(String[] args) {

        Student s1=new Student("张三",18);
        Student s2=new Student("王五",13);
        Student s3=new Student("李四",14);
        Student s4=new Student("张三",18);


        java.util.LinkedHashSet<Student>lhs=new java.util.LinkedHashSet<>();

        System.out.println(lhs.add(s1));
        System.out.println(lhs.add(s2));
        System.out.println(lhs.add(s3));
        System.out.println(lhs.add(s4));

        System.out.println(lhs);
        //true
        //true
        //true
        //false
        //[Student{name = 张三, age = 18}, Student{name = 王五, age = 13}, Student{name = 李四, age = 14}]
    }

它可以保证数据的存取顺序

小结

TreeSet

在这里插入图片描述

  public static void main(String[] args) {

        //利用TreeSet存储整数并进行排序

        java.util.TreeSet<Integer>ts=new java.util.TreeSet<>();


        ts.add(2);
        ts.add(1);
        ts.add(3);
        ts.add(4);

        //打印集合
        System.out.println(ts);//[1, 2, 3, 4]


        //遍历集合

        //迭代器
        Iterator<Integer> it = ts.iterator();
        while(it.hasNext()){
            Integer i = it.next();
            System.out.println(i);

        }


        System.out.println("_____________");


        //增强for
        for (Integer t : ts) {
            System.out.println(t);
        }


        System.out.println("_____________");

        //lambda
        ts.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        });



    }

TreeSet集合默认规则

排序规则挨个比较各个字母,如果出现一个比另外下面的大的后面就不用看了

排序规则(第一种排序方法)

在这里插入图片描述
在这里插入图片描述

自定义对象如果未实现接口那么排序报错
实现接口需要自定义对象实现Comparable接口 接口下重写抽象方法compareTo方法 底层就是采用一个红黑树比较

方式二

在这里插入图片描述

练习

帮助理解什么时候使用第一种什么时候使用第二种
需求存入四个字符串 按照长度排序,如果一样长则按照首字母排序
String默认是按顺序排序但是不符合要求这时候就用到了第二种排序比较器排序

    public static void main(String[] args) {

        // 按照长度排序,如果一样长则按照首字母排序
        TreeSet<String>ts=new TreeSet<>(new Comparator<String>() {
            @Override
            //o1表示当前要添加的元素
            //o2表示已经在红黑树存在的元素
            public int compare(String o1, String o2) {
                //按照长度排序

                int i=o1.length()-o2.length();

                //如果长度相同则按照字母
                i=i==0?o1.compareTo(o2):i;
                //解读: i等于0吗如果等于o就是用默认的compare方法.如果不等于0那就是i
                return i;
            }
        });


        ts.add("c");
        ts.add("ab");
        ts.add("df");
        ts.add("qwer");


        System.out.println(ts);
        //[ab, c, df, qwer]这是默认的排序方式使用的是compareTo


        System.out.println(ts);//[c, ab, df, qwer]
//这是使用第二个排序方法后的到的
        

    }

小练

在这里插入图片描述

 @Override
    public int compareTo(Student o) {
        int  sumO=o.getChineseGrade()+o.getMathGrade()+o.getEnglishGrade();
        int totalScore=this.getChineseGrade()+this.getMathGrade()+getEnglishGrade();

        //totalScore表示当前总分
        //sumO表示o的总分


        int i=totalScore-sumO;


        i=i==0?this.chineseGrade-this.getChineseGrade():i;
//这句意思是如果总分一样 比较语文成绩
        i=i==0?this.getMathGrade()-this.getMathGrade():i;
       //如果语文成绩一样比较数学成绩
       i=i==0?this.getEnglishGrade()-this.getEnglishGrade():i;
      //如果数学成绩一样比较英语成绩
      i=i==0?this.getAge()-this.getAge():i;
      //如果英语成绩一样比较年龄
        i=i==0?this.getName().compareTo(o.getName()):i;
       //如果年龄一样按照名字字母排序

       return i;
       
    }
public static void main(String[] args) {

        //首先创建五个学生对象
        Student s1=new Student("zhangsan",13,60,70,80);
        Student s2=new Student("lsii",15,63,79,68);
        Student s3=new Student("wangwu",11,90,75,57);
        Student s4=new Student("neifan",12,46,34,34);
        Student s5=new Student("hebing",16,45,56,62);




        //创建需要使用哪个集合这边采用TreeSet
        TreeSet<Student>ts=new TreeSet<Student>();


        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);


        //System.out.println(ts);
        //选一个排序方式 这边采用第一种默认的

        for (Student t : ts) {
            System.out.println(t);
        }
        //Student{name = neifan, age = 12, chineseGrade = 46, mathGrade = 34, englishGrade = 34}
        //Student{name = hebing, age = 16, chineseGrade = 45, mathGrade = 56, englishGrade = 62}
        //Student{name = lsii, age = 15, chineseGrade = 63, mathGrade = 79, englishGrade = 68}
        //Student{name = zhangsan, age = 13, chineseGrade = 60, mathGrade = 70, englishGrade = 80}
        //Student{name = wangwu, age = 11, chineseGrade = 90, mathGrade = 75, englishGrade = 57}


    }

总结

在这里插入图片描述

总结 集合的使用应该怎么选择

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE基础语法

文章目录 概述发展历程版本环境安装main方法注释标识符关键字数据类型与变量四类八种基本类型常量变量概念定义 类型转换自动类型转换强制类型转换类型提升 字符串类型 运算符算数运算符增量运算符自增自减运算符关系运算符逻辑运算符逻辑与 &&逻辑或 ||逻辑非 !短路求…

can only concatenate list (not “range“) to list

在Python中&#xff0c;你不能直接将range对象与列表进行连接。range对象是数字序列&#xff0c;而列表是元素的序列。这两种类型的数据无法直接连接。 如果你想将一个range对象转化为列表&#xff0c;然后将其与另一个列表连接&#xff0c;你可以先将range对象转化为列表&…

Xshell如何下载文件到本地

法一&#xff1a;命令下载 1、连接到远程服务器并登录 2、使用cd命令进入要下载文件的目录 3、使用以下命令下载文件&#xff1a; scp usernameremote:/path/to/file /path/to/local/directoryusername 远程服务器的用户名 remote 远程服务器的IP地址或主机名 /path/to/file …

windows环境下PHP7.4多线程设置

windows环境下的PHP设置多线程时有一定的难度&#xff0c;难点主要是PHP版本的选择&#xff0c;多线程扩展的选择&#xff0c;以及相关的设置等。 环境 windows 10php-7.4.33-Win32-vc15-x64php_parallel-1.1.4-7.4-ts-vc15-x64phpstudy 8.1.1.2 为了快速的部署PHP环境&…

css控制卡片内部的左右布局

先放效果图 纯css样式 可以根据需求进行更改 <template> <!-- 卡片盒子 --><div class"card_box "><el-card class"box-card w400" v-for"(item,index) in cardList" :key"index"><div slot"heade…

<sa8650>qcxserver 之 QCarCam 6.X API介绍 (第二部分)

@[TOC](<sa8650>qcxserver 之 QCarCam 6.X API介绍 (第二部分)) 2.6 帧信息定 帧信息定义包括缓冲区列表ID、缓冲区索引、帧序列号、每个批处理帧的时间戳、隔行扫描字段类型和标志。 2.6.1 QCarCamHWTimestamp_t 硬件时间戳定义 2.6.2 QCarCamBatchFramesInfo_t 2.6.3…

数字通信和fpga概述——杜勇版本学习笔记

1数字通信处理流程 脉冲调制是每个数字通信系统中间必不可少的环节&#xff0c;通常是使用升余弦滚降滤波器来实现。 超外差接收机原理是利用本地产生的振荡波与输入信号混频&#xff0c;将输入信号频率变换为某个预先确定的频率的方法。超外差原理最早是由E.H.阿姆斯特朗于1…

Windows配置JAVA_HOME但是未生效问题

文章目录 前言问题定位解决方式java_home 修改成 1.6 再试试效果 前言 之前用的都是jdk 1.8&#xff0c;但最近需要修改一个老项目&#xff0c;老项目使用的是1.6。修改java_home为1.6的路径后&#xff0c;在cmd中输入java -version发现并未更改。 问题定位 之前装过简化版的…

python中circle函数的用法

python中circle函数的用法 circle函数简介语法说明代码说明 circle函数简介 Python中的circle函数用于绘制圆形&#xff0c;是Python中非常基础 和重要的函数之一 语法 turtle.circle(radius,extentNone,stepsNone)说明 第一个参数- 半径是 radius - radius 可以是负数 - r…

真正解决jellyfin硬解码转码

前段时间入手一个DS423集成显卡UHD600&#xff0c;搭了一个jellyfin&#xff0c;发现网上关于硬解码的教程基本都存在问题&#xff0c;没有真正解决我的硬解码问题。经过一系列分析修改&#xff0c;最终实现硬解码。先贴效果图&#xff1a; 下载安装jellyfin这里就不叙述&#…

猫罐头什么牌子好?精选5款口碑好的猫主食罐头推荐!

亲爱的猫咪朋友们&#xff0c;你们是否还在为如何挑选适合猫咪的猫主食罐头而烦恼呢&#xff1f;猫主食罐头不仅仅是一种美味的食物&#xff0c;更是对维护猫咪健康有益的重要食品。猫罐头什么牌子好&#xff1f;作为在宠物店工作了7年的店长&#xff0c;这些年来店里的猫猫吃过…

【MongoDB】索引 – 文本索引(指定语言)

一、语言列表 语言名称 代码 danish da dutch nl english en finnish fi french fr german de hungarian hu italian it norwegian nb portuguese pt romanian ro russian ru spanish es swedish sv turkish tr 二、指定默认语言 创建文本索…

零基础学网络安全要怎么学?五分钟看懂

网络安全因何而重要&#xff1f; 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 截至2022年6月,我国网民规模为10.51亿&#xff0c;互联网…

伐木猪小游戏

欢迎来到程序小院 伐木猪 玩法&#xff1a;控制小猪点击屏幕左右砍树&#xff0c;不能碰到树枝&#xff0c;考验手速与眼力&#xff0c;记录分数&#xff0c;快去挑战伐木吧^^。开始游戏https://www.ormcc.com/play/gameStart/199 html <script type"text/javascript…

Centos7开放及查看端口

1、开放端口 firewall-cmd --zonepublic --add-port8888/tcp --permanent # 开放8888端口 firewall-cmd --zonepublic --remove-port8888/tcp --permanent #关闭8888端口 firewall-cmd --reload # 配置立即生效 2、查看防火墙所有开放的端口 firewall-cmd --zonepubl…

5 Tensorflow图像识别(下)模型构建

上一篇&#xff1a;4 Tensorflow图像识别模型——数据预处理-CSDN博客 1、数据集标签 上一篇介绍了图像识别的数据预处理&#xff0c;下面是完整的代码&#xff1a; import os import tensorflow as tf# 获取训练集和验证集目录 train_dir os.path.join(cats_and_dogs_filter…

有关python库

官方库 #1、导入某模块 import os #2、导入OS模块中的system方法 from os import system #3、导入某模块中的孙子模块中的xx方法&#xff0c;并重命名 from module.xx.xx import xx as rename #4、导入OS中的所有模块 #不用进行OS.method(),直接method&#xff08;&#xff0…

ST 任意内核 移植freertos系统

FREERTOS系统移植&#xff0c;先下载系统文件并解压如下 keil5移植后效果如图 注意事项 注意内核类型&#xff0c;ST的f1为M3,F4为m4&#xff0c;h7&#xff0c;f7为m7 再include包含.h路径即可 任务函数一定要写到while&#xff08;1&#xff09;否则无法运行 void lvgl_demo…

AVL树 c语言版本 插入部分

目录 引入平衡树 为什么要变平衡 怎么判断是否需要变平衡 怎么变平衡 LL型失衡 RR型失衡 LR型失衡 RL型失衡 补充 左旋补充 右旋补充 Code 开辟一个新节点 初始化 获取树的高度 左旋函数 更新树高 树高的求法 右旋转函数 插入 InsertNode() 更新树高 getbala…

ZZ308 物联网应用与服务赛题第G套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;G卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…