解读Java中Set真的是无序的吗

 更新时间:2023年07月11日 17:14:05   作者:bingoCoder  
这篇文章主要介绍了Java中Set是不是无序的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java Set是无序的吗

我们经常听说List是有序且可重复的,Set是无序且不重复的。

这是一个误区,这里所说的顺序有两个概念

  • 一是按照添加的顺序排列
  • 二是按,照自然顺序a-z排列

Set并不是无序的传统所说的Set无序指的是HashSet,它不能保证元素的添加顺序,更不能保证自然顺序,而Set的其他实现类是可以实现这两种顺序的。

  • LinkedHashset : 保证元素添加的自然顺序
  • TreeSet : 保证元素的自然顺序

通过下面一段代码来理解上述问题

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
public class Prectice {
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("String1");
		set.add("String4");
		set.add("String3");
		set.add("String2");
		set.add("String5");
		set.forEach(e-> System.out.print(e+" "));
		System.out.println();
		//LinkedHashSet会保证元素的添加顺序
		Set<String> set2 = new LinkedHashSet<>();
		set2.add("String1");
		set2.add("String5");
		set2.add("String3");
		set2.add("String4");
		set2.add("String2");
		set2.forEach(e-> System.out.print(e+" "));
		System.out.println();
		//TreeSet保证元素自然顺序
		Set<String> set3 = new TreeSet<>();
		set3.add("String1");
		set3.add("String5");
		set3.add("String4");
		set3.add("String2");
		set3.add("String3");
		set3.forEach(e-> System.out.print(e+" "));
	}
}

输出结果:

String5 String4 String3 String2 String1       HashSet元素乱序
String1 String5 String3 String4 String2       LinkedHashSet保证元素添加顺序

String1 String2 String3 String4 String5       TreeSet元素按自然顺序排序

java中set集合:有序set集合,集合中的对象存储注意事项

1、LinkedHashSet(有序)

通过链表的形式保证有序;

2、TreeSet(有序)

可以使用比较器:Comparable(内部)与Comparator(外部),通过Collections.sort()进行排序;

内部比较器-对应类上面实现comparable的接口,重写compare的方法;

例如:

Collections.sort(set);

外部比较器--对应类上面,编写内部静态类-比较器,实现对应的comparator接口;

例如:

Collections.sort(set, new AscAgeComparator());

3、set集合中保存对象的时候

去重,要重写对象的hashcode()和equals()方法,原始set的数据结构,在取数的时候,

先取hashcode,如果有多个hashcode相等的值,进一步比较equals的函数值,取出对应节点的数据;

参与计算hashcode的属性值,不要变动,变动会造成hashcode的变化,造成保存数据不可被重新指向,产生垃圾数据,甚至OOM;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解读file.exists(),file.isFile()和file.isDirectory()的区别

    解读file.exists(),file.isFile()和file.isDirectory()的区别

    本文介绍了Java中的File类的三个方法:file.exists()、file.isFile()和file.isDirectory(),并详细解释了它们的区别和使用场景
    2025-02-02
  • Spring声明式事务@Transactional注解实现元数据驱动的事务管理

    Spring声明式事务@Transactional注解实现元数据驱动的事务管理

    这篇文章主要为大家介绍了Spring声明式事务@Transactional注解实现元数据驱动的事务管理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 四个Java必须知道的负载均衡算法分享

    四个Java必须知道的负载均衡算法分享

    我们在设计系统的时候,为了系统的高扩展性,会创建无状态的系统。但是,要使系统具有更好的可扩展性,除了无状态设计之外,还要考虑采用什么负载均衡算法,本文就带领大家认识以下常见的4种负载均衡算法
    2023-01-01
  • Spring中的拦截器HandlerInterceptor详细解析

    Spring中的拦截器HandlerInterceptor详细解析

    这篇文章主要介绍了Spring中的拦截器HandlerInterceptor详细解析,HandlerInterceptor 是 Spring 框架提供的一个拦截器接口,用于在请求处理过程中拦截和处理请求,需要的朋友可以参考下
    2024-01-01
  • 使用Java在线生成pdf文档的代码实现

    使用Java在线生成pdf文档的代码实现

    在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,熟悉这块业务的童鞋,一定特别清楚,目前最常用的解决方案通过一些技术手段生成对应的PDF文件,下面小编给大家详细说说
    2025-04-04
  • JAVA 并发容器的一些易出错点你知道吗

    JAVA 并发容器的一些易出错点你知道吗

    今天给大家带来的文章是Java并发编程的相关知识,文中对java同步容器与并发容器做了非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-09-09
  • JAVA实现心跳检测(长连接)

    JAVA实现心跳检测(长连接)

    本文主要介绍了JAVA实现心跳检测(长连接),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案

    SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案

    SpringBoot中以Bean方式注册Servlet时遇到的问题,通过了解DispatcherServlet的原理,发现默认路径冲突是主要原因,本文介绍SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案,感兴趣的朋友一起看看吧
    2025-03-03
  • Java8不可或缺小帮手之日期应用

    Java8不可或缺小帮手之日期应用

    jdk1.8后引入了新的日期时间处理API,相比传统的date操作更加简便,date中的SimpleDateFormat也是非线程安全的,废话不多说,开干
    2023-05-05
  • Java正则表达式判断字符串中是否包含中文示例

    Java正则表达式判断字符串中是否包含中文示例

    之前一个朋友问我,如何判断字符串中是否包含中文,其实解决的方法很简单,但觉着有必要写出给不知道的朋友们以参考,所以下面这篇文章主要介绍了利用Java正则表达式判断字符串中是否包含中文的方法,需要的朋友可以参考。
    2017-03-03

最新评论