java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Set是无序的吗

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

作者:bingoCoder

这篇文章主要介绍了Java中Set是不是无序的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java Set是无序的吗

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

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

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

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

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;

总结

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

您可能感兴趣的文章:
阅读全文