JAVA Set、Map集合<TreeSet>与<HashSet>

本文详细介绍了Java集合框架中的TreeSet和HashSet。TreeSet基于红黑树,支持自然排序和自定义比较器排序。自然排序需实现Comparable接口,比较器排序则需传入Comparator实现类。HashSet基于哈希表,无序且不可重复,存储元素需重写hashCode()和equals()。此外,还探讨了两者在存储和排序上的差异。

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

Set:不可重复,无序(可排序)

Map集合与Set集合的区别是储存的是键值对,其他一样

1.TreeSet

      TreeSet:底层是红黑树
           自然排序:
               存储的对象必须实现 Comparable 接口,重写 compareTo();
               在 compareTo() 里指定排序规则
               返回负数,代表在树的左边,正数代表在树的右边,0则不存储
               compareTo() 中 this 要存储的对象,参数代表已存储的对象
               需要针对存储的对象对应的类进行改变


          比较器:
               在实例化 TreeSet 集合的时候,通过构造方法传递 Comparator 接口的实现类
               对象,并重写 Comparator 接口的 compare()方法
               compare() 中第一个参数是即将存储的对象,第二个参数为集合中已存储的对象
               不需要对存储的对象进行改变,但是创建集合的时候需要传递比较器

       如果自然排序和比较器都使用,则使用比较器的规则,因为使用自然排序和比较器是根据
       比较器是否为 null 进行判断

自然排序写法

public class User implements Comparable<User>{
    private int id;

    public User(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    
    //按id从大到小
    //当前对象为要存储的对象,参数为已存储进集合的对象
    @Override
    public int compareTo(User o) {
        return o.getId()-this.getId();
    }
}

比较器写法

public class MyComparator implements Comparator<User> {
    //第一个参数为要存储的对象
    //第二个是已存储的对象
    @Override
    public int compare(User o1, Usero2) {
        return o2.getId()-o1.getId();
    }
}

使用比较器

Set<Teacher> set = new TreeSet(new MyComparator());

2.HashSet

HashSet:无序不可重复
       底层是hash表+链表+红黑树
       hash表中的元素个数超过容量的负载因子数则会发生数组扩容,容量为原来的2倍
       链表的元素超过8位则会转换成红黑树

       如果希望存储的对象内容相同则覆盖,需要重写hashCode()和equals()
       运转流程:获取对象hash值,通过equals比对内容
public class Demo01 {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(11);
        set.add(55);
        set.add(33);
        set.add(55);
        set.forEach(item -> {
            System.out.println(item);
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值