Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

本文主要是介绍Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Set集合

package SetDemo;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class SetDemo {public static void main(String[] args) {/*Set集合的特点:1.Set系列集合的特点:Set集合是一个存储元素不能重复的集合方式,因为存储数据的时候通过判断其元素的hashCode值,不一样再存储。2.Set集合的实现类特点:HashSet: 无序,不重复,无索引LinkedHashSet:有序,不重复,无索引TreeSet:可排序,不重复,无索引3.Set集合的方法与Collection一致需求:利用Set系列的集合,添加字符串,并使用多种方式遍历。迭代器增强forLambda表达式*/// 1.创建set集合的对象Set<String> set = new HashSet<>();// 2.为set对象添加元素boolean b1 = set.add("a");boolean b2 = set.add("a");set.add("c");set.add("b");set.add("e");set.add("d");System.out.println(b1);// trueSystem.out.println(b2);// false// 3.循环输出集合中的元素Iterator<String> iter = set.iterator();// 迭代器while (iter.hasNext()) {System.out.println(iter.next());}// 增强forfor (String s : set) {System.out.println(s);}// lambda表达式set.forEach(System.out::println);}
}

HashSet

package SetDemo;import java.util.HashSet;public class HashSetDemo {public static void main(String[] args) {/*HashSet用于给数据去重,不需要保证数据的添加顺序时用(无序,不重复,无索引)Hash值:1.是根据hashCode方法算出来的int类型的整数2.该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算3.一般情况下,重写hashCode方法,利用对象内部的属性值计算哈希值对象的哈希值特点:1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的2. 如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的3. 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)4. String 和 Integer不需要重写hashCode方法,Java已经重写了,自定义对象要重写hashCode需求:创建一个存储学生对象的集合,存储多个学生对象。使用程序实现在控制台遍历该集合。要求:学生对象的成员变量值相同,我们就认为是同一个对象*///创建学生对象Student stu1 = new Student("张三",18);Student stu2 = new Student("张三",18);Student stu3 = new Student("李四",18);Student stu4 = new Student("王五",19);// 创建HashSet集合HashSet<Student> set = new HashSet<>();// 1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的System.out.println(stu1.hashCode());//189568618System.out.println(stu2.hashCode());//793589513// 将学生对象存入集合( 要重写hashCode,否则就会有重复属性值的元素,因为添加元素是按照hash值来判断的 )set.add(stu1);set.add(stu2);set.add(stu3);set.add(stu4);// 输出集合System.out.println(set);//[name王五, age=19, name张三, age=18, name李四, age=18]// 3.在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。//哈希碰撞System.out.println("abc".hashCode());//96354System.out.println("acD".hashCode());//96354}}

LinkedHashSet

package SetDemo;import java.util.LinkedHashSet;public class LinkedHashSetDemo {public static void main(String[] args) {/*LinkedHashSet :用于给数据去重且要保证数据的添加顺序时用。(有序,不重复,无索引)有序:指的是输出的顺序和添加元素时的顺序一致*///1.创建4个学生对象Student s1 = new Student("zhangsan",23);Student s2 = new Student("lisi",24);Student s3 = new Student("wangwu",25);Student s4 = new Student("zhangsan",23);//2.创建集合的对象LinkedHashSet<Student> lhs = new LinkedHashSet<>();//3.添加元素System.out.println(lhs.add(s3));System.out.println(lhs.add(s2));System.out.println(lhs.add(s1));System.out.println(lhs.add(s4));//4.打印集合System.out.println(lhs);//[namewangwu, age=25, namelisi, age=24, namezhangsan, age=23]}
}

TreeSet

package SetDemo;import java.util.TreeSet;public class TreeSetDemo{public static void main(String[] args) {/*TreeSet:用于数据唯一且需要按指定的要求排序时使用 (不重复,无索引,可排序)可排序:按照元素的默认规则(由小到大)排序,字符类型按照ASCII码表的数字升序排列的TreeSet基于红黑树的数据结构实现排序,增删改查性能都比较好*//*需求:1.存储整数并进行排序2.使用自定义类型,按元素的规则排序排序方法:给Student类实现Comparable接口,重写里面的抽象方法*/TreeSet<Integer> ts  = new TreeSet();// 1.存储整数并进行排序ts.add(3);ts.add(2);ts.add(7);ts.add(6);ts.forEach(System.out::println);// 2 3 6 7// 2.使用自定义类型,按元素的规则排序TreeSet<Student> tss = new TreeSet();Student stu1 = new Student("二",13);Student stu2 = new Student("一",11);Student stu3 = new Student("五",12);Student stu4 = new Student("三",10);tss.add(stu1);tss.add(stu2);tss.add(stu3);tss.add(stu4);System.out.println(tss);//[name三, age=10, name一, age=11, name五, age=12, name二, age=13]}
}

 Student类

package SetDemo;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "name" + name + ", age=" + age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student that = (Student) o;return age == that.age && Objects.equals(name, that.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Override// TreeSet排序规则public int compareTo(Student o) {// 指定排序的规则// 按年龄进行排序;// this表示当前要添加的元素,o表示已经存在于红黑树中的元素System.out.println("this:"+this);System.out.println("o:"+o);return this.getAge()-o.getAge();}
}

这篇关于Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046552

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定