Java中的Set集合和Hash值和TreeSet的使用

2024-04-28 16:52
文章标签 java 使用 set 集合 hash treeset

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

Set集合的特点

不包含重复元素的集合

没有带索引的方法,所以不能使用普通for循环遍历

HashSet对集合的迭代顺序不作任何保证

Set集合的遍历

有两种方式遍历一种是迭代器一种是增强for

package dayhou40.day49;
​
import java.util.HashSet;
import java.util.Set;
​
public class SetTest {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("hello");set.add("hi");set.add("hello");set.add("last");for (String s : set) {System.out.println(s);}}
}
​

Set集合没有什么 特殊的功能需要我们学习它的功能全部来自Collection集合

哈希值

哈希值:是根据jdk对象的地址或者字符或者数字算出来的的int类型的数值

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

package dayhou40.day50;
​
public class 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;}
}
​
package dayhou40.day50;
​
public class hashCodeTest {public static void main(String[] args) {student s1 = new student("张三", 12);System.out.println(s1.hashCode());System.out.println(s1.hashCode());student s2 = new student("张三", 12);System.out.println(s2.hashCode());
​}
}
​

我们由上面可以得到结论:

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

默认情况下,实现不同对象的Hash值是不同的

通过重写Hashcode方法得到的Hash值是相同的

package dayhou40.day50;
​
import java.util.Objects;
​
public class 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 int hashCode() {return 0;}
}
​

注意String重写了object中的hashcode

HashSet保证集合元素唯一性的原因

如果Hash表未初始化,就对其进行初始化

根据对象的哈希值计算对象的存储位置,如果该位置没有元素,就存储元素

如果有元素则存入的元素和以前的元素进行比较Hash值

如果Hash值不同,会继续执行下去,把元素添加进来

如果哈希值相同则通过equals()方法比较如果都相同则不存储,否则就存储

LinkedHashSet

特点

1.哈希表和链表实现的set接口,具有可预测的迭代次数

2.由链表保证元素有序,也就是说元素的存储顺序和取出顺序是一致的

3.由哈希表保证元素的唯一性

package dayhou40.day51;
​
import java.util.LinkedHashSet;
​
public class LinkedhashsetTest {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("hi");set.add("hello");set.add("world");set.add("world");for (String s : set) {System.out.println(s);}}
}
​

TreeSet集合

Treeset集合的特点

  1. 元素有序性(这个有序性不是指存入和取出的顺序一致而是按照一定的规则进行排序,具体方法取决于构造方法)

    1. TreeSet():根据元素的自然排序进行排序

    2. TreeSet(Comparator comparator):根据指定的比较器排序

  2. 由于没有索引所以不能使用普通for遍历

  3. 是set集合不存在重复元素

自然排序

package dayhou40.day51;
​
import java.util.TreeSet;
​
public class TreesetTest {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(30);set.add(20);set.add(30);set.add(10);set.add(90);for (Integer integer : set) {System.out.println(integer);}}
}
​

Comparable的使用

package dayhou40.day52;
​
public class student {private String name;public 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;}
}
​
package dayhou40.day52;
​
import java.util.TreeSet;
​
public class comparableTest {public static void main(String[] args) {TreeSet<student> set = new TreeSet<>();student s1 = new student("张三", 22);student s2 = new student("李四", 23);student s3 = new student("王五", 20);set.add(s1);set.add(s2);set.add(s3);for (student student : set) {System.out.println(student.getName()+" "+student.getAge());}}
}
​

结果出现了报错

这是为什么呢? 因为自然排序实现了compareTo方法 而在我们的学生类中我们没有继承comparable接口重写compareTo方法

这个规则如果返回值是0那么就会存储一个元素

这个规则如果返回值是1那么就会按照升序排序

这个规则如果返回值是-1那么就会按照降序排序

那么如何按照年龄的升序排序呢?

package dayhou40.day52;
​
public class student implements Comparable<student>{private String name;public 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 int compareTo(student o) {return this.getAge()-o.getAge();}
}
​

如果想要升序this就放在前面,如果想要降序this就放在后面

ComparaTo方法的使用

package dayhou40.day52;
​
public class student{private String name;public 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;}
​
​
}
​
​
package dayhou40.day52;
​
import java.util.Comparator;
import java.util.TreeSet;
​
public class comparableTest {public static void main(String[] args) {TreeSet<student> set = new TreeSet<>(new Comparator<student>() {@Overridepublic int compare(student o1, student o2) {int sum1= o1.getAge()-o2.getAge();int sum2= o1.getAge()==o2.getAge()?o1.getName().compareTo(o2.getName()):sum1;return sum2;}});student s1 = new student("张三", 22);student s2 = new student("李三", 22);student s3 = new student("李四", 23);student s4 = new student("王五", 20);set.add(s1);set.add(s2);set.add(s3);set.add(s4);for (student student : set) {System.out.println(student.getName()+" "+student.getAge());}}
}
​

我们在TreeSet<>(new Comparator<student>()然后进行排序

这篇关于Java中的Set集合和Hash值和TreeSet的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.