Set系列集合:Hashset、LinkedHashset、TreeSet --java学习笔记

Set系列集合

  • Set系列集合特点:无序、不重复、无索引
  • 添加数据的顺序和获取出的数据顺序不一致;
  • Hashset:无序、不重复、无索引
  • LinkedHashset:有序、不重复、无索引
  • TreeSet:排序、不重复、无索引

代码演示:

import java.util.*;

public class ListTest5 {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>(); //一行经典代码,多态写法,创建了一个HashSet集合对象
        //HashSet集合:无序,不重复,无索引
        set.add(555);
        set.add(222);
        set.add(222);
        set.add(111);
        set.add(333);
        set.add(333);
        set.add(444);
        System.out.println(set);    //[555, 444, 333, 222, 111]
        System.out.println("---------------------------------");
        Set<Integer> set2 = new LinkedHashSet<>();
        //LinkedHashSet集合:有序,不重复,无索引
        set2.add(555);
        set2.add(222);
        set2.add(222);
        set2.add(111);
        set2.add(333);
        set2.add(333);
        set2.add(444);
        System.out.println(set2);   //[555, 222, 111, 333, 444]
        System.out.println("---------------------------------");
        Set<Integer> set3 = new TreeSet<>();
        //TreeSet:可排序,不重复,无索引
        set3.add(555);
        set3.add(222);
        set3.add(222);
        set3.add(111);
        set3.add(333);
        set3.add(333);
        set3.add(444);
        System.out.println(set3);   //[111, 222, 333, 444, 555]
    }
}

注意:Set要用到的常用方法,基本上就是Collection提供的!
自己几乎没有额外新增一些常用功能!

在学习Set系列之前得先了解哈希值

哈希值

  • 就是一个int类型的数值,Java中每个对象都有一个哈希值
  • Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值

对象哈希值的特点

  • 同一个对象多次调用hashcode()方法返回的哈希值是相同的
  • 不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞,小概率)

Hashset集合的底层原理

  • 基于哈希表实现
  • 哈希表是一种增删改查数据,性能都较好的数据结构

哈希表

哈希表是一种增删改查数据性能都较好的结构

  • JDK8之前,哈希表=数组+链表
    1、往哈希表添加数据时,会创建一个默认长度16的数组,默认加载因子为0.75,数组名table
    2、使用元素的哈希值对数组的长度求余计算出应存入的位置
    3、判断当前位置是否为null,如果是null直接存入
    4、如果不为null,表示有元素,则调用equals方法比较
            相等,则不存;不相等,则存入数组
           JDK 8之前,新元素存入数组,占老元素位置,老元素挂下面
           JDK 8开始之后,新元素直接挂在老元素下面

  • JDK8开始,哈希表=数组+链表+红黑树
    如果数组快占满了,链表会过长,导致查询性能降低
    此时就会进行扩容
    当数组占满长度*加载因子(16*0.75=12)个位置时,会将数组的长度翻倍,将原来的数据重新存入数组
    并且从JDK8开始,当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树

    红黑树,就是可以自平衡的二叉树
    红黑树是一种增删改查数据性能相对都较好的结构

深入理解HashSet集合去重复的机制

Hashset集合默认不能对内容一样的两个不同对象去重复!因为它们哈希值一样
比如内容一样的两个学生对象存入到Hashset集合中去,Hashset集合是不能去重复的!

例:

import java.util.HashSet;

public class SetTest2 {
    public static void main(String[] args) {
        Student s1 = new Student("小明","男","170");
        Student s2 = new Student("小明","男","170");
        Student s3 = new Student("小明","男","170");
        HashSet<Student> students = new HashSet<>();
        students.add(s1);
        students.add(s2);
        students.add(s3);
        System.out.println(students);

    }
}

运行结果:

如果希望Set集合认为2个内容一样的对象是重复的必须重写对象的hashcode()和equals()方法

LinkedHashset集合的底层原理

  • 有序、不重复、无索引
  • 依然是基于哈希表(数组、链表、红黑树)实现的
  • 但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置,会有头节点变量和尾结点变量记录第一个和最后一个元素(空间换时间)

TreeSet集合的底层原理

  • 不重复、无索引、排序(默认)
  • 排序的原理:基于红黑树实现的排序

注意:

  • 对于数值类型:Integer,Double,默认按照数值本身的大小进行升序排序
  • 对于字符串类型:默认按照首字符的编号升序排序。
  • 对于自定义类型如Student对象,Treeset默认是无法直接排序的,

自定义排序规则

TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则

  • 方式一:让自定义的类(如学生类)实现comparable接口,重写里面的compareTo方法来指定比较规则
     
  • 方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对象比较器对象,用于指定比较规则

方法一:

import java.util.Objects;

public class Student implements Comparable<Student>{
    private String name;
    private String sex;
    private double height;

    //按照身高升序排序
    @Override
    public int compareTo(Student o) {
        return Double.compare(this.getHeight(), o.getHeight());
    }

    //......
}

方法二:

public class SetTest3 {
    public static void main(String[] args) {
        Student s1 = new Student("小明","男",170);
        Student s2 = new Student("小美","女",168);
        Student s3 = new Student("小黑","男",188);
        //按照身高升序排序
        TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o1.getHeight(),o2.getHeight());
            }
        });
        students.add(s1);
        students.add(s2);
        students.add(s3);
        System.out.println(students);
    }
}

两种方式中,关于返回值的规则:

  • 如果认为第一个元素 > 第二个元素 返回正整数即可
  • 如果认为第一个元素<第二个元素返回负整数即可
  • 如果认为第一个元素=第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复

注意:如果类本身有实现Comparable接口,Treeset集合同时也自带比较器,默认使用集合自带的比较器排序

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言食堂就餐排队问题290行

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 数据结构 函数设计 结构设计 总结 效果截图 ​ 主函数代码 题目 设计一个程序来模拟食堂就餐排队问题&#xff0c;通过输入学生人数和面包数量&#xff0c;计算有多少学生能够吃到午餐。 数据结构 该…

【链表】Leetcode 2. 两数相加【中等】

两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c; 并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数都不…

Python核心编程 --- 高级数据类型

Python核心编程 — 高级数据类型 字符串 列表 元组 字典 1.序列 序列&#xff1a;一组按顺序排列的数据集合。 在Python中存在三种内置的序列类型&#xff1a;字符串、列表、元组 优点&#xff1a;可支持索引和切片操作 特点&#xff1a;第一个正索引为0&#xff0c;指…

web学习笔记(四十三)ajax

目录 1.相关基础概念 1.1客户端与服务器 1.2URL地址 1.3 客户端和服务器端通信的过程 1.4 一个URL地址放入浏览器&#xff0c;到页面渲染发生了什么事情 1.5 数据 1.6资源的请求方式 2.Ajax 2.1什么是Ajax 2.2 jQuery 中的Ajax 2.2.1 $.get()的语法 2.2.2$.post()…

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a; Sentinel 承接了阿里巴…

Linux-Arm环境下配置编译qt-everywhere及交叉编译环境

前言 最近在搞交叉编译的事&#xff0c;手上拿了个同事的香橙派玩交叉编译&#xff0c;现在来到了第一步&#xff0c;就是先在arm上配置qt的开发环境。当然了Qt没有直接提供qt on arm&#xff0c;而是需要自行在arm环境下编译一个qt环境出来&#xff0c;所以这里需要使用到qt提…

集简云新增“文本语音转换”功能,实现智能语音交互

为丰富人工智能领域的应用集成&#xff0c;为用户提供更便捷和智能化的信息获取和视觉创作方式&#xff0c;本周集简云上线了内置应用—文本语音转换。目前支持OpenAI TTS和TTS HD模型&#xff0c;实现文本语音高效智能转换&#xff0c;也可根据你的产品或品牌创建独特的神经网…

lvgl 窗口 windows lv_port_win_visual_studio 版本 已解决

不知道的东西&#xff0c;不知道lvgl窗口。一切从未知开始 lv_port_win_visual_studio 主分支 对应的分支 v7版本更新git submodule update --init --recursive同步 lvgl代码随后打开 visualSudio 打开.sln 文件 编译 release模式 允许 一切正常代码部分

Windows Insiders WSLg Linux GUI App 支持尝鲜

2021 年 4 月 21 日&#xff0c;微软在 Developer Blogs 发布了 Windows 预览版 WSL&#xff08;Windows Linux 子系统&#xff09; 对 Linux GUI App 的支持的公告&#x1f517;&#xff0c;碰巧&#x1f600;我最近重装了波电脑&#xff0c;系统换成了 Windows Insiders&…

【数据结构刷题专题】——二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

​CC-EasyCommonInput: 基于uni-app原生input组件封装的增强实用输入框组件

CC-EasyCommonInput&#xff1a;基于uni-app原生input组件封装的增强实用输入框组件 摘要&#xff1a; 在前端开发中&#xff0c;输入框&#xff08;Input&#xff09;是一个常见的UI组件&#xff0c;用于获取用户输入的数据。然而&#xff0c;为了满足不同的业务需求和用户体验…

LED显示屏视频播放器的8大功能

随着中国LED显示屏企业的规模发展和产品技术的不断创新&#xff0c;LED显示屏在各个领域中的应用得到了广泛推广。然而&#xff0c;LED显示屏的出色表现离不开LED视频播放器这一关键设备的支持。下面将介绍LED视频播放器的8大功能&#xff0c;以及它们如何提升LED显示屏的显像效…

VSCode最强插件合集,助你代码开发效率翻倍!

大家好&#xff0c;我是宝哥。 今天给大家推荐14个VSCode靠前的编程辅助插件&#xff0c;它们可以帮助你提高代码编写、调试、阅读和管理效率。 1.ESLint 简介&#xff1a;用于检查JavaScript代码的语法和风格错误。 功能特色&#xff1a;支持多种规则&#xff0c;可以自定义规…

stdlib.h中的 atoi 函数

记忆方法&#xff1a; atoi可以理解为 arr to int 表示将char类型的字符串转换成int类型的整数。例如"1234"转换成 1234。 传入值传出值&#xff1a;int atoi(char* arr); 将arr里面的字符型数字转变成整形数字。函数开始会跳过除了0到9的数字字符&#xff0c;…

STM32初识3

中断和事件 什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的 程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行。 什么是EXTI&#xff1f; …

【办公类-16-07-08】“2023下学期 大班户外游戏2(做成打印用的的贴墙版样式--A4横版撑满)”(python 排班表系列)

背景需求&#xff1a; 运用代码做出了中班每个班级用的户外游戏&#xff08;新版&#xff09;的表格&#xff08;包含有场地的贴墙版和无场地的贴周计划版&#xff09; 【办公类-16-07-07】“2023下学期 大班户外游戏2&#xff08;有场地和无场地版&#xff0c;每天不同场地&…

部署prometheus 监控k8s集群

目录 1、主机清单 2、拉取镜像 3、服务安装 4、安装prometheus-operator 5、查看custom metrics api 6、获取prometheus端口 7、将 alertmanager-main 、grafana、prometheus-k8s的端口暴露出来 8、再次查看prometheus端口 9、浏览器访问IP&#xff1a;31940 部署k8集群…

【Linux】线程的概念{虚拟地址堆区细分/缺页中断/页/初识线程/创建线程/优缺点}

文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写…

Ps:色彩平衡

色彩平衡 Color Balance命令可改变阴影、中间调、高光中的颜色平衡&#xff0c;从而改善图像的整体色彩表现或为图像创造特定的氛围。 Ps菜单&#xff1a;图像/调整/色彩平衡 Adjustments/Color Balance 快捷键&#xff1a;Ctrl B Ps菜单&#xff1a;图层/新建调整图层/色彩平…

飞桨ONNX推理部署初探

ONNX&#xff0c;全称Open Neural Network Exchange&#xff08;开放神经网络交换&#xff09;&#xff0c;是一个用于表示深度学习模型的标准&#xff0c;它定义了一组与环境、平台均无关的标准格式。这使得不同的人工智能框架&#xff0c;如飞桨、MXNet等&#xff0c;可以采用…