Collection—Set

Collection接口下的另一个子接口Set:不允许数据重复、没有扩充方法(get()是List接口的方法)
Set集合的本质:Set集合就是Value值相同的Map集合,先有Map才有Set,底层是哈希表+红黑树
Set接口下的子类
在这里插入图片描述

HashSet:

特点:无序存储(存取数据不一致)允许存放null
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能(分桶后更加方便查找)。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。
存储数据的流程:
调用add()方法存储元素时,首先调用hashcode方法判断hash码是否存在,若不存在直接存储,存在就调用equals方法,若返回true就不存储,false才存储。
注意equals和hashcode方法关系:
若两个对象equals方法返回true,那么他们的hashCode必然要保证相等。
但是两个对象的hsahCode相等,equals不一定相等
当且仅当equals与hashCode方法均返回true时,才认为两个对象真正相等
这时就引入一个经典问题问题:为什么HashSet中要覆写equals还要覆写hashcode()
在Object类中hashcode()方法是一个本地方法,会针对不同的对象返回不同的整数,如果只是覆写了equals()(这里的equals()方法覆写标准为根据属性值判断是否相逢),那若是属性值相等的两个对象要存入HashSet中永远都会被认为不是同一个对象,因为object类的hashcode()方法对不同的对象永远返回不同的值。
这时就要同时覆写hashcode()方法,覆写的标准是为了保证属性相同的不同对象在调用其hashCode方法后,返回的是同样的哈希码。这时才可以保证HashSet中没有重复的元素。

TreeSet

特点:底层使用红黑树,不允许出现空值、有序存储
有序存储的原因是实现了Comparable、Comparator 接口
**存储:**存储元素的方式是升序
自定义类要想保存在TreeSet或TreeMap中 :
(1)要么该类直接实现Comparable接口
(2)要么实现一个比较器传入TreeSet或TreeMap来进行外部比较

//自定义Student如何比较大小
    @Override
    public int compareTo(Student o) {
        if (this.age > o.age){
            return 1;
        }else if (this.age < o.age){
            return -1;
        }else {
            return this.name.compareTo(o.name);
        }
     }

将自定义类对象存入TreeSet中

public static void main(String[] args) {
        Set<Student> set = new TreeSet<>();
        set.add(new Student("liyifeng",18));
        set.add(new Student("offila",17));
        System.out.println(set);
    }

**实现Comparable:**传入比较器
若要控制某个自定义类的顺序,而该类本身不支持排序(类本身没有实现Comparable接口)。我们可以建立一个该类的“比较器”来进行排序。实现了Comparator接口的类作为比较器,通过该比较器来进行类的排序。

class AscAgeComparator implements Comparator<Work>{//Work是自定义类

    @Override
    public int compare(Work o1, Work o2) {
        return o1.getAge()-o2.getAge();

    }
}
public class TestComparator {
    public static void main(String[] args) {
        //在TreeSet构造方法中传入一个Comparator的对象 
        Set<Work> set = new TreeSet<>(new AscAgeComparator());
        set.add(new Work("liyifeng",19));
        set.add(new Work("offila",18));
        System.out.println(set);
    }
}

此时这个实现了Comparator接口的这个第三方的类,相当于一个外部的比较器,专门来进行自定义类的排序(相当于一个外部的比较器)——策略模式
策略模式:策略模式让算法独立于使用它的客户而独立变化。
如上面的实现了Comparator的类就包装了一种算法,要是想让自定义类有不桶的额排序方式,可以重新定义一个类封装另一种算法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值