Java扩展之part21 Set系列集合

Set系列集合

在这里插入图片描述

特点:

无序不重复,无索引

set系列实现类的特点:

  • HashSet:无序,不重复,无索引
  • LinkedHashSet:有序,不重复,无索引
  • TreeSet:排序(按大小排序),不重复,无索引

哈希值:JDK根据对象的地址,按照某种规则算出来的int类型的数值

Object类的API:

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

对象哈希值的特点:

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

set系列集合底层的数据结构

HashSet

现在哈希值跟数组的长度求余计算出应存入的位置,在JDK8之前,采用数组+链表的方式。哈希表是一种对于增删改查数据性能都较好的结构,在JDK8之后就采用数组+链表+红黑树的结构。

set集合可以去除重复的原因:先判断哈希值,在判断equals

那么如果希望set集合认为两个内容相同的对象不应该去除重复的咋办?

在实体类中,增加equals和hashCode(使用快捷键自动生成即可)。

LinkedHashSet

有序,不重复,无索引

底层数据结构依然是哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序

TreeSet

排序,不重复,无索引

基于红黑树数据结构实现排序的

注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序

TreeSet的排序规则

数值:Integer,Double按大小升序排序

字符串:按首字母编号升序排序

自定义类型:需要制定排序规则

方式一:使用类自定义比较规则(在实体类中实现)

首先需要在实体类中实现自定义比较规则的接口implements Comparable<Apple>,这一步不要忘记

@Override
public int compareTo(Apple o){
    /*
    >:正整数
    <:负整数
    =:0.去重复
    */
    return this.wigth-o.wigth>=0?1:-1;
}

方式二:集合自带比较器对象进行规则定制(在实现类中使用)

Set<Apple> apples=new TreeSet<>(new comparator<Apple(){
    @Override
    public int compare(Apple o1,Apple o2){
        return o1.getweight()-o2.getweight();//升序
	}
}>)

浮点类型建议直接使用Double.compare进行比较

Set<Apple> apples=new TreeSet<>(new comparator<Apple(){
    @Override
    public int compare(Apple o1,Apple o2){
        return Double.compare(o1.getPrice()-o2.getPrice());//升序
	}
}>)

使用lambda表达式书写:

Set<Apple> apples=new TreeSet<>((o1,o2)->Double.compare(o2))

假设同时使用了这两种方式,则采用就近原则。

可变参数

public static void sum(int...nums){
    
}
  • 一个形参列表中只能有一个可变参数()
  • 可变参数必须放在形参列表的最后面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值