Java集合之Set集合

一、HashSet
1、特点:
(1)顺序可能与添加的顺序不同
(2)线程是不同步的
(3)元素值可以是null
2、判断两个元素相等的标准是equals()相等,且hashCode()返回值也相等
3、当把某个类的对象保存到HashSet中,重写这个类的hashCode(),equals()方法时,应尽量保证两个对象equals()方法返回true时hashCode()也相等。
4、当把可变对象添加到hashset中后,尽量不要去修改该集合中参与计算的hashCode(),equals()的实例变量,否则会导致HashSet无法正确操作这些元素。

二、LinkedHashSet
1、特点:
(1)顺序与添加的顺序相同
(2)性能略低于HashSet,以链表维护顺序

三、TreeSet
1、特点:
(1)确保元素处于排序状态,采用红黑树
(2)TreeSet只能添加同一种类型的对象
(3)判断大小的标准compareTo(Object obj)返回0则相等
2、用法
import java.util.TreeSet;

public class TreeSetTest {

	public static void main(String[] args) {
		//基本用法

		TreeSet treeSet=new TreeSet();
		treeSet.add(5);
		treeSet.add(3);
		treeSet.add(-1);
		treeSet.add(9);
		System.out.println("已经处于排序状态"+treeSet);
		System.out.println("第一个元素"+treeSet.first());
		System.out.println("小于5的子集,不包含5"+treeSet.headSet(5));
		System.out.println(">=5的子集"+treeSet.tailSet(5));
		System.out.println("[-1,5]的子集"+treeSet.subSet(-1, 5));
	}

}
3、自然排序,调用compareTo(Object obj)比较大小,升序排列
4、定制排序,如降序排列需在创建TreeSet对象时,提供一个Comparator对象与其关联,如下:
import java.util.TreeSet;

class M {
	int age;

	public M(int age) {
		this.age = age;
	}

	public String toString() {
		return "M[age:" + age + "]";

	}
}

public class TreeSetdingzhi {

	public static void main(String[] args) {
		// 定制排序

		TreeSet treeSet=new TreeSet((o1,o2)->{
			M m1=(M)o1;
			M m2=(M)o2;
			//age越大M越小
			return m1.age>m2.age?-1:m1.age<m2.age?1:0;
		});
		treeSet.add(new M(3));
		treeSet.add(new M(12));
		treeSet.add(new M(-1));
		treeSet.add(new M(-2));
		System.out.println(treeSet);
	}

}

输出
[M[age:12], M[age:3], M[age:-1], M[age:-2]]

四、EnumSet
1、特点:
(1)所有原始是指定枚举类型的枚举值
(2)以枚举值在Enum类的顺序定义元素顺序
(3)不允许null元素
2、用法
import java.util.Collections;
import java.util.EnumSet;
import java.util.SortedSet;
import java.util.TreeSet;

enum Season {
	SPRING, SUMMER, FALL, WINTER;
}

public class EnumSetTest {

	public static void main(String[] args) {

		EnumSet enumSet1 = EnumSet.allOf(Season.class);
		System.out.println(enumSet1);

		EnumSet enumSet2 = EnumSet.noneOf(Season.class);
		System.out.println(enumSet2);

		enumSet2.add(Season.WINTER);
		enumSet2.add(Season.SPRING);
		System.out.println(enumSet2);

		EnumSet enumSet3 = EnumSet.of(Season.SUMMER, Season.WINTER);
		System.out.println(enumSet3);	
	}
}
输出
[SPRING, SUMMER, FALL, WINTER]
[]
[SPRING, WINTER]
[SUMMER, WINTER]

五、各set性能分析
1、只有需要保持有序采用TreeSet否则要用HashSet
2、EnumSet性能最好,但是只能保存枚举值
3、都是线程不安全的,需要手动保持线程同步
SortedSet set=Collections.synchronizedSortedSet(new TreeSet<>());




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值