解读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()的区别
本文介绍了Java中的File类的三个方法:file.exists()、file.isFile()和file.isDirectory(),并详细解释了它们的区别和使用场景2025-02-02
Spring声明式事务@Transactional注解实现元数据驱动的事务管理
这篇文章主要为大家介绍了Spring声明式事务@Transactional注解实现元数据驱动的事务管理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-10-10
Spring中的拦截器HandlerInterceptor详细解析
这篇文章主要介绍了Spring中的拦截器HandlerInterceptor详细解析,HandlerInterceptor 是 Spring 框架提供的一个拦截器接口,用于在请求处理过程中拦截和处理请求,需要的朋友可以参考下2024-01-01
SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案
SpringBoot中以Bean方式注册Servlet时遇到的问题,通过了解DispatcherServlet的原理,发现默认路径冲突是主要原因,本文介绍SpringBoot集成WebServlet出现自定义servlet请求失败的问题解决方案,感兴趣的朋友一起看看吧2025-03-03


最新评论