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

相关文章

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu