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

相关文章

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在