Java中的Set系列集合超详解

 Set

 List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复。更严格地说,Set集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。
  使用Set存储的特点与List相反:元素无序、不可重复。常用的实现方式:HashSet、LinkedHashSet和TreeSet。

Set系列集合概述和特点

  • 底层数据结构是哈希表

  • 存取无序

  • 不可以存储重复元素

  • 没有索引,不能使用普通for循环遍历

set集合的基本应用

 public static void main(String[] args) {Set<String> s=new HashSet<String>();boolean flag1= s.add("aaa");boolean flag2 = s.add("aaa");System.out.println(flag1);System.out.println(flag2);System.out.println(s);//如果当前元素是第一次添加,那么可以添加成功,返回true//如果当前元素是第二次添加,那么添加失败,返回false}

        

存储字符串并遍历

方式一迭代器方式

 public static void main(String[] args) {Set<String> s=new HashSet<String>();s.add("张三");s.add("李四");//迭代器Iterator<String> it = s.iterator();while(it.hasNext()){String str = it.next();System.out.println(str);}}

方式2-增强for

//增强forfor (String str : s) {System.out.println(str);}

方式3lambda表达式

 // Lambda表达式s.forEach((String str)-> System.out.println(str));

总结

HashSet集合概述和特点

  • 底层数据结构是哈希表

  • 存取无序

  • 不可以存储重复元素

  • 没有索引,不能使用普通for循环遍历

哈希值

  • 哈希值简介

    是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

  • 如何获取哈希值

    Object类中的public int hashCode():返回对象的哈希码值

  • 哈希值的特点

    • 同一个对象多次调用hashCode()方法返回的哈希值是相同的

    • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

package set;
/*哈希值:对象的整数表现形式1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的2. 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的3. 但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)*/
public class demo3 {public static void main(String[] args) {//   1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的Student s1 = new Student("zhangsan",18);Student s2 = new Student("zhangsan",18);/*  System.out.println(s1.hashCode());//189568618System.out.println(s2.hashCode());//793589513*///不一样,所以我们要重写hashCode()//  2. 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样System.out.println("------------------");System.out.println(s1.hashCode());//1461067297System.out.println(s2.hashCode());//1461067297// 3. 但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)//哈希碰撞System.out.println("abc".hashCode());//96354System.out.println("acD".hashCode());//96354}
}

练习

package lx;import java.util.HashSet;public class demo1 {public static void main(String[] args) {Student s1 = new Student("张三", 8);Student s2 = new Student("张三", 8);Student s3 = new Student("李四", 18);Student s4 = new Student("王五", 17);HashSet<Student> set = new HashSet<Student>();set.add(s1);set.add(s2);set.add(s3);set.add(s4);//重写hashCode方法就可以去重复的对象//因为重写hashCode方法,比的是属性值,属性值一样,哈希值一样,所以添加不成功//不重写比的是地址值,创建出来的对象地址值永远不一样,所以哈希值不一样,所以添加成功//如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样//重写equals方法也一样 比的也是地址值,不是属性值for (Student student : set) {System.out.println(student);}}
}

注意像String Integer类型的,Java已经在底层重写好了HashSet和equals方法

LinkedHashSet

package LinkedHashSet;import lx.Student;import java.util.HashSet;
import java.util.LinkedHashSet;public class demo1 {public static void main(String[] args) {Student s1 = new Student("张三", 8);Student s2 = new Student("张三", 8);Student s3 = new Student("李四", 18);Student s4 = new Student("王五", 17);LinkedHashSet<Student> set = new LinkedHashSet<Student>();set.add(s3);set.add(s1);set.add(s3);set.add(s4);//LinkedHashSet的存和去顺序一样for (Student student : set) {System.out.println(student);}}
}

 

TreeSet

package TreeSet;import java.util.TreeSet;public class demo1 {public static void main(String[] args) {//利用TreeSet对整数进行排序//默认升序TreeSet<Integer> ts = new TreeSet<>();//添加元素ts.add(4);ts.add(2);ts.add(5);ts.add(8);ts.add(1);//使用增强forfor (Integer t : ts) {System.out.print(t + " ");}}
}

package TreeSet;import java.util.TreeSet;public class demo2 {public static void main(String[] args) {//利用TreeSet对String类型进行排序TreeSet<String> ts = new TreeSet<>();ts.add("va");ts.add("aaa");ts.add("ha");ts.add("aba");ts.add("acd");for (String t : ts) {System.out.print(t + " ");}}
}

练习

 @Overridepublic int compareTo(Student o) {//只看年龄按照升序排序int tmp=this.getAge() - o.getAge();tmp= tmp==0?this.getName().compareTo(o.getName()):tmp;return tmp;}
package TreeSet;import javax.print.DocFlavor;
import java.util.TreeSet;
import java.util.function.Consumer;public class demo3 {public static void main(String[] args) {//利用TreeSet对学生类型进行排序TreeSet<Student> ts = new TreeSet<>();//要求: 按照学生的年龄进行排序//同年按照姓名字母排序//同姓名,同年龄认为同一个人Student s1 = new Student("zhangsan", 18);Student s2 = new Student("lisi", 19);Student s3 = new Student("wangwu", 19);ts.add(s2);ts.add(s3);ts.add(s1);System.out.println(ts);//方式一:默认的排序方式,Student实现一个接口(comparable接口)重写里面的抽象方法//再指定比较规则//hashCode和equals方法跟哈希表有关//TreeSet底层红黑树有关//所以不需要重写hashCode和equals方法}
}

package TreeSet;import java.util.Comparator;
import java.util.TreeSet;public class demo4 {public static void main(String[] args) {//方法二:比较器排序//1.创建集合//2.o1表示当前要添加的元素//3.o2表示已经在红黑树存在的元素//返回值规则跟之前一样TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {@Override/*需求:请自行选择比较器排序和自然排序两种方式;要求:存入四个字符串, “c”, “ab”, “df”, “qwer”按照长度排序,如果一样长则按照首字母排序采取第二种排序方式:比较器排序*/public int compare(String o1, String o2) {//按照长度来int tmp = o1.length() - o2.length();//如果一样长则按照首字母排序tmp = tmp == 0 ? o1.compareTo(o2) : tmp;return tmp;}});//2.添加元素ts.add("c");ts.add("ab");ts.add("df");ts.add("qwer");System.out.println(ts);}
}

package lx2;import java.util.TreeSet;/*  需求:创建5个学生对象属性:(姓名,年龄,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台如果总分一样,按照语文成绩排如果语文一样,按照数学成绩排如果数学成绩一样,按照英语成绩排如果英文成绩一样,按照年龄排如果年龄一样,按照姓名的字母顺序排如果都一样,认为是同一个学生,不存。第一种:默认排序/自然排序第二种:比较器排序默认情况下,用第一种排序方式,如果第一种不能满足当前的需求,采取第二种方式。课堂练习:要求:在遍历集合的时候,我想看到总分。*/
public class demo1 {public static void main(String[] args) {//1.创建学生对象Student s1 = new Student("zhangsan", 23, 90, 99, 50);Student s2 = new Student("lisi", 24, 90, 98, 50);Student s3 = new Student("wangwu", 25, 95, 100, 30);Student s4 = new Student("zhaoliu", 26, 60, 99, 70);Student s5 = new Student("qianqi", 26, 70, 80, 70);TreeSet<Student> st=new TreeSet<>();st.add(s1);st.add(s2);st.add(s3);st.add(s4);st.add(s5);for (Student student : st) {System.out.println(student);}}
}

package lx2;//第一种:默认排序/自然排序
public class Student implements Comparable<Student> {private String name;private int age;//语文成绩private int chinese;//数学成绩private int math;//英语成绩private int english;public Student() {}public Student(String name, int age, int chinese, int math, int english) {this.name = name;this.age = age;this.chinese = chinese;this.math = math;this.english = english;}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}/*** 获取** @return age*/public int getAge() {return age;}/*** 设置** @param age*/public void setAge(int age) {this.age = age;}/*** 获取** @return chinese*/public int getChinese() {return chinese;}/*** 设置** @param chinese*/public void setChinese(int chinese) {this.chinese = chinese;}/*** 获取** @return math*/public int getMath() {return math;}/*** 设置** @param math*/public void setMath(int math) {this.math = math;}/*** 获取** @return english*/public int getEnglish() {return english;}/*** 设置** @param english*/public void setEnglish(int english) {this.english = english;}public String toString() {return "Student{name = " + name + ", age = " + age + ", chinese = " + chinese + ", math = " + math + ", english = " + english + "}";}@Overridepublic int compareTo(Student o) {/* 按照总分从高到低输出到控制台如果总分一样,按照语文成绩排如果语文一样,按照数学成绩排如果数学成绩一样,按照英语成绩排如果英文成绩一样,按照年龄排如果年龄一样,按照姓名的字母顺序排如果都一样,认为是同一个学生,不存。*/int sum1 = this.getChinese() + this.getMath() + this.getEnglish();int sum2=o.getChinese() + o.getMath() + o.getEnglish();int tmp = sum2-sum1;// 如果总分一样,按照语文成绩排tmp = tmp == 0 ? this.getChinese() - o.getChinese() : tmp;// 如果语文一样,按照数学成绩排tmp = tmp == 0 ? this.getMath() - o.getMath() : tmp;//如果数学成绩一样,按照英语成绩排tmp = tmp == 0 ? this.getEnglish() - o.getEnglish() : tmp;//如果英文成绩一样,按照年龄排tmp = tmp == 0 ? this.getAge() - o.getAge() : tmp;// 如果年龄一样,按照姓名的字母顺序排tmp = tmp == 0 ? this.getName().compareTo(o.getName()) : tmp;return tmp;}
}

TreeSet二种排序方式



总结

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

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

相关文章

腾讯云如何设置二级域名?

什么是二级域名&#xff1f; 例如我已申请的域名为&#xff1a; test.com //顶级域名 现在我开发的应用要部署到二级域名&#xff1a; blog.test.com 1、打开腾讯云控制台的我的域名&#xff0c;然后点击解析 2、在我的解析页面点击添加记录&#xff0c;然后需注意红色方框处…

生物素标记的柚皮苷探针;Biotin-Naringin

生物素标记的柚皮苷探针&#xff08;Biotin-Naringin&#xff09;是一种结合了生物素&#xff08;Biotin&#xff09;和柚皮苷&#xff08;Naringin&#xff09;特性的化合物&#xff0c;它在有机合成及药物化学技术领域具有重要意义。以下是对该探针的详细解析&#xff1a; 一…

秋招Java后端开发冲刺——Mybatis

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目&#xff0c;它封装了 JDBC&#xff0c;使开发者只需要关注 SQL 语句本身&#xff0c;而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO&#xff08;Plain …

Everything搜索无法搜索到桌面的文件(无法检索C盘 或 特定路径的文件)

现象描述 在Everything搜索框中输入桌面已存在的文件或随便已知位置的文件&#xff0c;无法找到。 搜索时检索结果中明显缺少部分磁盘位置的&#xff0c;例如无法检索C盘&#xff0c;任意关键字搜索时结果中没有位于C盘的&#xff0c;无论怎样都搜不到C盘文件。 解决方法 在…

图像识别和目标检测在超市电子秤上的应用

目录 前言深度学习的目标检测图像识别技术视觉秤的优势其他应用场景中的技术应用未来展望 前言 随着科技的不断发展&#xff0c;电子秤在生鲜超市中的应用也在不断升级。传统的电子秤需要打秤人员手动输入秤码&#xff0c;这不仅耗时费力&#xff0c;还需要大量的培训以记住各…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…

算法日常练习

对于这个题&#xff0c;如何处理同一个方向的问题&#xff0c;且对于同一组的如果间隔太大如何实现离散化 #include<bits/stdc.h> using namespace std;#define int long long typedef long long ll; map<pair<int,int>,vector<pair<ll,ll>>> mp…

关于机械键盘的购买,该怎么选择?

一.关于轴体的选择。 1.青轴&#xff1a;青轴是机械键盘最有段落感的轴&#xff0c;声音比较大&#xff0c;以吵死人别人著称。有人将其比喻为Cherry的春天&#xff0c;爽快清脆的段落感如春天般舒畅。适合在宿舍、咖啡厅&#xff0c;图书馆使用。&#xff08;我装的 &#xf…

linux源码安装mysql8.0的小白教程

1.下载8.x版本的mysql MySQL :: Download MySQL Community Server (Archived Versions) 2.安装linux 我安装的是Rocky Linux8.6 3.设置ip地址,方便远程连接 使用nmcli或者nmtui设置或修改ip地址 4.使用远程连接工具MobaXterm操作: (1)将mysql8版本的压缩包上传到mybaxterm…

一图看懂 | 蓝卓油气行业解决方案

我国是全球最大的能源消费国&#xff0c;保障国家能源安全是我国能源发展的首要任务&#xff0c;油气作为我国能源体系的重要组成部分&#xff0c;是支撑我国工业和经济社会发展的基础和“压舱石&#xff0c;也是必须筑牢的能源安全底线。 蓝卓根据油气田行业发展趋势&#xf…

前端实现一键复制功能

1、下载插件 npm i vue-clipboard32.0.0 2、在需要复制的文件中引入插件并使用&#xff1a; JS: import useClipboard from "vue-clipboard3"; const { toClipboard } useClipboard(); HTML: <el-tooltip content"复制内容" placement"top&…

自然语言处理基本概念

自然语言处理基本概念 所有学习循环神经网络的人都是看这一篇博客长大的&#xff1a; https://colah.github.io/posts/2015-08-Understanding-LSTMs/ import jieba import torch from torch import nns1 "我吃饭了&#xff01;" s2 "今天天气很好&#xff01…

电脑录屏软件哪个效果最好 怎么一边录屏一边直播 电脑录屏软件好用免费推荐

随着科技的发展&#xff0c;电脑的更新迭代也越来越快&#xff0c;各项功能的进步与完善使得人们的工作和生活越来越离不开电脑&#xff0c;其中录屏功能就很好的体现了网络的便利&#xff0c;人们可以将在电脑画面的变化通过录屏功能记录下来&#xff0c;以便后续学习和回顾。…

python-小理与他的画(赛氪OJ)

[题目描述] 小理是个画家&#xff0c;他希望有一天他的画能让心仪的她看到。 只是后来她有了他&#xff0c;他却只有他的画&#xff0c;他望着他的画&#xff0c;默默的发呆。 可惜做题的你&#xff0c;画不出他画的她&#xff0c;所以&#xff0c;我们只好画点简单的画&#x…

centos9+mysql8.0下mycat1.6部署

#创作灵感# 整理一下mysql代理技术&#xff0c;这个当时是和mysql集群部署一个项目的&#xff0c;一并整理出来供参考。 1、环境准备 此处使用的为M-M-SS双主双从结构集群&#xff0c;集群部署方法放在我的上一篇文章中 防火墙可以使用firewall-cmd放行&#xff0c;演示环境…

民航飞机维修工卡、放行单推广使用电子签章,每天可省约3万张纸

据某民航公司对外公布数据显示&#xff0c;通过在飞机航线维修工作中应用电子签章&#xff0c;以日均1000个航班计算&#xff0c;每天可节省约3万张纸、每年可节约1200多万元的费用成本。 小小一枚印章的转变&#xff0c;电子签章是如何做到的&#xff1f; 据了解&#xff0c;…

PowerCreatorCMS UploadResourcePic 任意文件上传漏洞复现

0x01 产品简介 PowerCreator CMS是翰博尔信息技术有限公司(简称翰博尔PowerCreator)推出的一款教育资源管理平台,专注于教育领域的信息化解决方案。PowerCreator CMS是集成了软件平台和硬件设备、多系统高度融合的教育资源管理平台。它旨在通过技术手段提升教育资源的管理、…

jenkins打包java项目报错Error: Unable to access jarfile tlm-admin.jar

jenkins打包boot项目 自动重启脚本失败 查看了一下项目日志报错&#xff1a; Error: Unable to access jarfile tlm-admin.jar我检查了一下这个配置&#xff0c;感觉没有问题&#xff0c;包可以正常打&#xff0c; cd 到项目目录下面&#xff0c;手动执行这个sh脚本也是能正常…

基于java+springboot+vue实现的作业管理系统(文末源码+Lw)110

基于SpringBootVue的实现的作业管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图演示视频软件包&#xff09; 功能描述&#xff1a; 作业管理系统有管理员&#xff0c;教师&#xff0c;学生三个角色。教师和学生都可以进行注册然后再登录。学生可以修改自己的密码&…

总结之企业微信(一)——创建外部群二维码,用户扫码入群

创建外部群 企微接口中没有直接通过服务端API接口创建外部群 可以通过jssdk创建外部群&#xff1a;引用jssdk调用会话接口wx.openEnterpriseChat https://work.weixin.qq.com/api/doc/90000/90136/90511 创建外部群二维码 需要通过企业微信的应用&#xff0c;并且配置客户联…