解读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;

总结

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

相关文章

  • Java高效实现PDF与OFD的相互转换的示例代码

    Java高效实现PDF与OFD的相互转换的示例代码

    在数字化办公日益普及的今天,文档格式的标准化与跨平台兼容性成为企业和开发者面临的重要挑战,OFD作为国家标准,在政务、金融等领域具有不可替代的地位,而PDF则以其广泛的兼容性成为日常交流的首选本文将深入探讨如何高效地实现PDF与OFD的相互转换
    2025-10-10
  • MyBatis Plus工具快速入门使用教程

    MyBatis Plus工具快速入门使用教程

    这篇文章主要介绍了MyBatis Plus工具快速入门使用教程,需要的朋友可以参考下
    2018-05-05
  • Spring Boot 2.4配置特定环境时spring: profiles提示被弃用的原因分析

    Spring Boot 2.4配置特定环境时spring: profiles提示被弃用的原

    这篇文章主要介绍了Spring Boot 2.4配置特定环境时spring: profiles提示被弃用的原因,本文给大家分享详细解决方案,需要的朋友可以参考下
    2023-04-04
  • Java中List与Map初始化的一些写法分享

    Java中List与Map初始化的一些写法分享

    这篇文章主要介绍了Java中List与Map初始化的一些写法有需要的朋友可以参考一下
    2014-01-01
  • Springboot实现缓存预热的方法

    Springboot实现缓存预热的方法

    在系统启动之前通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程,缓存预热的目的是尽可能地避免缓存击穿和缓存雪崩,这篇文章主要介绍了Springboot实现缓存预热,需要的朋友可以参考下
    2024-03-03
  • Mybatis如何使用注解优化代码

    Mybatis如何使用注解优化代码

    这篇文章主要介绍了Mybatis如何使用注解优化代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Springboot Thymeleaf数字对象使用方法

    Springboot Thymeleaf数字对象使用方法

    这篇文章主要介绍了Springboot Thymeleaf数字对象使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2007-09-09
  • java操作hdfs的方法示例代码

    java操作hdfs的方法示例代码

    这篇文章主要介绍了java操作hdfs的相关资料,在本地配置Hadoop和Maven的环境变量,首先需从官网下载与服务器相同版本的Hadoop安装包,配置环境变量后,引入Maven的配置文件,以便管理项目依赖,最后,编写代码实现对HDFS的连接和操作,完成数据的读写,需要的朋友可以参考下
    2022-02-02
  • Spring事务处理流程和原理详解

    Spring事务处理流程和原理详解

    这篇文章主要介绍了Spring事务处理流程和原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot异步处理的四种实现方式

    SpringBoot异步处理的四种实现方式

    本篇文章我们以SpringBoot中异步的使用(包括:异步调用和异步方法两个维度)来进行讲解,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论