Set接口

本文深入解析了Set接口的特点,包括无序、不可重复等属性,并详细介绍了其主要子类:HashSet、LinkedHashSet和TreeSet。探讨了不可重复性的判定规则及hashCode和equals方法的重写,同时提供了TreeSet自定义排序的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Set接口

1.说明

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和e2 ,并且最多包含一个 null 元素。
特点:

  • 无序
  • 不可重复
    在这里插入图片描述
    主要子类:
    • HashSet
    • LinkedHashSet
    • TreeSet

不可重复的判定规则:
是先计算hashcode,hashcode相同时再计算equals方法。所以一般会同时重写这两个方法,hashCode重写是为了将想要判断变量加入到判断,不想判断的可以不写入,equals方法也是。

原码中hashCode的算法:
在这里插入图片描述
通常在传入的是一个类的时候需要在类中重写equals和hashCode方法,为打印显示方便也会重写类的toString方法

@Override
public int hashCode() {

        return Objects.hash(name, age);
 }
 @Override
 public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age &&
            Objects.equals(name, student.name);
}

2.HahSet

在这里插入图片描述

3.LinkedHashSet

在这里插入图片描述

  • 是HashSet的子类
  • 说明是一种特殊的HashSet 【有序(添加顺序)、不可重复】可以通过增强for循环遍历,也可以通过迭代器进行循环Iterator iterator = set.iterator();

4.TreeSet

在这里插入图片描述

  • 使用元素的自然顺序对元素进行排序,
  • 或者根据创建 set 时提供的Comparator 进行排序,
  • 具体取决于使用的构造方法。

特点:

  • 有序,不可重复
  • 自然排序(字母表的顺序)
  • 自定义排序
    在这里插入图片描述

4.1自定义比较器

在这里插入图片描述

比较器用来排序两个参数,根据第一个参数小于等于或大于第二个参数分别返回负整数,零或正整数

使用方法:
定义实现类:

public class MyComparator implements Comparator<Integer> {
	@Override
	public int compare(Integer o1, Integer o2) {
		return o2-o1;
	}
}
TreeSet<Integer> treeSet = new TreeSet<>(new MyComparator());

实际案例:

public static void main(String[] args) {
	List<Integer> integers = Arrays.asList(20, 18, 23, 22, 17, 24, 19, 18,24);//数组转 集合。
	// TreeSet<Integer> treeSet = new TreeSet<>(integers);这个是默认的排序方式
	//如果想从大到小排序,怎么办? 相当于自定义的比较规则。
	//使用创建时提供比较器的构造方法
	//由于我们实际开发中,这个比较器只使用一次。没有必要定义一个类出来。
	// 所以更多的是是用匿名内部类
	TreeSet<Integer> treeSet = new TreeSet<>(new Comparator<Integer>() {
		@Override
		public int compare(Integer o1, Integer o2) {
				return o2-o1;
		}
	});
	treeSet.addAll(integers);
	System.out.println(treeSet);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值