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中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.