Set集合

文章详细介绍了Java中的Set系列集合,包括HashSet的无序性及其底层哈希表原理,以及如何通过重写hashCode()和equals()实现元素去重复。LinkedHashSet保持插入顺序,而TreeSet则提供排序功能,基于红黑树实现。同时,文章讨论了在TreeSet中自定义排序规则的两种方式:实现Comparable接口或提供Comparator比较器。
摘要由CSDN通过智能技术生成

二、Set系列集合

1.Set系列集合概述

1)Set系列集合特点:
①无序:存取顺序不一致(只会无序一次,第二次执行与第一次一样)
②不重复
③无索引:没有带索引的方法
2)set集合实现类特点:
①Hashset:无序,不重复,无奈引
② LinkedHashset:有序,不重复,无奈引
③TreeSet:排序、不重复,无索引
Set集合的功能上基本上 Collection的API一致

2、HashSet元素无序的底层原理:哈希表

1)HashSet底层原理

①Hashsat集合底层采取哈希表存储的数据
②哈希表是一种对于增删改查数据性能都较好的结构

2)哈希表的组成

JDK8之后,底层来用(数组+链表+红黑树)相成3)哈东值哈希值跟数组的长度求余

3)哈希值(哈希值跟数组的长度求余)

是JDK根据对象的地址,按照某种规则(哈希值跟数组的长度求余)算出来的int类型的数值

4)Object类的API

public int hashCode()
返回对象的哈希值

5)对象的哈希值特点

①同一个对多次调用hashCde()方法返回的哈希值是相同的
②默认情况下,不同对象的哈希值是不同的.

3、HashSet元素去重复的底层原理

1)如果希望Set集合认为2个内容相同的对象是重夏的应该怎么办?

重写对的hashCode() 和equals()方法。

@Override
public int hashCode() {
return Objects.hash(age, name, sex);
}

/*
 * 只要两个内容一样,结果一定是true
 */
@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Student other = (Student) obj;
	return age == other.age && Objects.equals(name, other.name) && sex == other.sex;
}

4、实现类:ListedHashSet

1)LinkedHashSet集合概述和特点

①有序,不重复,无索引
②这里有序指的是保证存储和取出的元素顺序一致
③原理:底层数据结构依哈希表,只是每元素又额外的多了一个双链表的机制记录存储的顺序。

5、实现类:TreeSet

1)TreeSet集合概述和特点

①不重复、无索引、可排序
②可排序:按照元素的大小默人升序(由小到大)排序
③TreeSet集合底层是基于红黑树数据结构实现排序的,增删改查性能都较好。
注:TreeSet 集合是一定要排序的,可以将元素按照指定的规则进行排序。

2)TreeSet集合默认的规则

①对于数值类型:Integer,Double
官方默认按照大小进行升序排序.
②对于字符串类型:默认按照首字母符的编号升序排序。
③对于自定义类型如Studert对象,Treset无法直接排序,需自己制定排序规则

3)自定义排序规则

Teset集合存储对象的时候有2种方式河以设计自定义比较规则
①方式一:
让自定义的类实现Comparable 接口重写里面的compareTo方法来定制比较规则

}
/*
* 方式一:自定义比较规则
* o1.compareTo(o2)
*/
@Override
public int compareTo(Apple o) {
// TODO Auto-generated method stub
// return this.weight-o.weight;//去除重量重复的元素
return this.weight-o.weight>=0? 1:-1;//保留重量重复的元素
}
@Override
public String toString() {
return “Apple [name=” + name + “, color=” + color + “, price=” + price + “, weight=” + weight + “]”;
}

③方式二:
TeeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则

// 方式二:集合自带比较器对象进行规则定制
//注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序
// Set a=new TreeSet<>(new Comparator() {
//
// @Override
// public int compare(Apple o1, Apple o2) {
// // TODO Auto-generated method stub
return o1.getWeight()-o2.getWeight();//升序
return o2.getWeight()-o1.getWeight();//降序
return Double.compare(o1.getPrice(), o2.getPrice());//升序
// return Double.compare(o2.getPrice(), o1.getPrice());//降序
// }
// });
Set a=new TreeSet<>((o1,o2)-> Double.compare(o2.getPrice(), o1.getPrice()));
a.add(new Apple(“红富士”,“红色”,18.9,500));
a.add(new Apple(“青苹果”,“青色”,9.9,300));
a.add(new Apple(“绿苹果”,“绿色”,20.9,200));
a.add(new Apple(“黄苹果”,“黄色”,9.8,500));
System.out.println(a);

注:如果TreeSet集合存储的对象有实现比较集合也自带比较器,默认使用集合自带的比较器排序.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值