JavaSE小笔记--17(集合3-Set集合)

1.HashSet

API中Set集合中和Collection集合中的方法一致,没有特殊的方法;主要注重Set集合如何保证元素的唯一不重复

Set集合,无索引;不可以重复;无序(存取不一致);允许包含值为null的元素,但最多只能有一个

向集合添加的顺序是啊a,b,c,d;但是输出的结果是d,b,c,a.所以说Set集合的存取不一致

HashSet如何保证元素的唯一呢?

我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()比较,效率较低,哈希算法提高了去重复的效率,降低了使用equals()方法的次数

当 HashSet调用add()方法存储对象的时候,先调用对象的 hashCode()方法得到一个哈希值,然后在集台中查找是否有哈希值相同的对象

*如果没有哈希值相同的对象就直接存入集合

*如果有哈希值相同的对象,就和哈希值相同的对象逐个进行 equals()比较,比较结果为false就存入,true则不存

将自定义类的对象存入 HashSet去重复

类中必须重写 hashCode()和equals()方法

hashCode():属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率)

equals():属性相同返回true,属性不同返回false,返回false的时候存储

2.LinkedHashSet

看名字知道它属于HashSet这一"派系的",但是这个相对于HashSet来说有一个很大的不一样是LinkedHashSet是有序的---可以保证怎么存就怎么取。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

代码如下:

Set<String> set = new LinkedHashSet<String>();
for(int i= 0;i<6;i++){
    set.add(i+"");
}
set.add("3"); //重复数据,不会写入
set.add(null); //可以写入空数据
Iterator<String> iter = set.iterator();
while(iter.hasNext()){
    System.out.println(iter.next()); //输出是有序的
}

 

输出结果:

0
1
2
3
4
5

null

3.TreeSet(基于叉树的数据结构)

在保证元素唯一的同时,可以给元素排序,排序规则分为以下两种

1:存入的元素自身具备比较性。

元素自身具备比较性,需要元素所属的类实现Comparable接口,重写当compareTo()方法,也就是让元素自身具备比较性,这种方式叫做元素的自然排序也叫做默认排序

TreeSet类的add()方法中会把存入的对象提升为 Comparele类型
调用对象的 compareTo()方法和集合中的对象比较
根据 compareTo()方法返回的结果进行存储

在TreeSet集合中如果存储元素,取决于compareTo()方法的返回值

当compareTo()方法返回0时,集合中只有一个元素

当compareTo()方法返回正数时,集合会怎么存怎么取

当compareTo()方法返回负数时,集合会倒序存储

2:给TreeSet指定排序规则。

当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重写compare方法,并将该接口的子类实例对象作为参数传递给TreeSet集合的构造方法。

创建 TreeSet的时候可以制定一个Comparator
如果传入了 Comparator的子类对象,那么 TreeSet就会按照比较器中的顺序排序

add()方法内部会自动调用 Comparator接囗中 compare()方法

这个例子中在TreeSet的构造方法中传入了比较器的子类对象,不过用的时匿名内部类,以后回顾的时候可以多看一下

注意:

TreeSet构造函数什么都不传,默认按照类中 Comparable的顺序(没有就报错classCastException);

当Comparable比较方式和Comparator(比较器)比较方式同时存在时,以Comparator的比较方式为主;

注意:在重写compareTo()或者compare()方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一直的人为相同的人,如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,因为可能姓名不同(年龄相同姓名不同的人是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.

集合中涉及了数组,链表,树等数据结构,有空要自己再看看数据结构的知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值