Java集合---Set详解

Set的说明

存储无序的,不可重复的元素,Set中常用的方法都是Collection下定义的。这里面的顺序是无序,但不是随机排序的。其中的不可重复性,当向Set中添加进相同的元素的时候,后面的这个不能添加进去。要求添加进Set中元素所在的类,一定要重写equals()和hashCode()方法,进而保证元素添加的不可重复性。

Set中元素的存储方式

当向Set中添加对象时,首先调用此对象所在类的hashCode()方法计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置,若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置已有对象存储。再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。

LinkedHashSet的特点

使用链表,维护了一个添加进集合中的顺序,导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的。

TreeSet

  • 向TreeSet中添加的元素必须是同一个类的。
  • 可以按照添加进集合中的元素的指定的顺序进行遍历。像String,包装类等默认按照从小到大的顺序遍历。
  • 当自定义类没有实现Comparable接口时,当向TreeSet中添加自定义对象时,会报错。
  • 当向TreeSet中添加自定义类对象的时候,依据Comparable接口中的compareTo()方法确定按照哪个属性进行排列。
  • 当向TreeSet中添加元素时,首先按照compareTo()方法进行比较,一旦返回0,虽然仅是两个对象的子属性值相同,但仍然认为这两个对象相同,进而后面的元素对象无法添加进来
  • 当向TreeSet中添加自定义类对象的时候,有两种排序方法:
  1. 自然排序
    要求自定义类实现Comparable接口并实现compareTo()方法,在这个方法中指明按照自定义类的哪个属性进行排序。
  2. 定制排序
    定制排序代码实现
import java.util.Comparator;
import java.util.HashSet;
import java.util.TreeSet;

public class TestSet {
    public static void main(String[] args) {
        //1.创建一个实现了Comparator接口的类对象
        Comparator comparator = new Comparator() {
            //向TreeSet中添加Customer对象,在此方法中指明是按照Customer的哪个属性排序的
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Customer && o2 instanceof Customer) {
                    Customer c1 = (Customer) o1;
                    Customer c2 = (Customer) o2;
                    int i = c1.getName().compareTo(c2.getName());
                    if (i == 0) {
                        return c1.getAge().compareTo(c2.getAge());
                    } else {
                        return i;
                    }
                }
                return 0;
            }
        };
        //2.将此对象作为形参传递给TreeSet的构造器中
        TreeSet set = new TreeSet(comparator);
        set.add(new Customer("AA", 103));
        set.add(new Customer("BB", 102));
        set.add(new Customer("GG", 104));
        set.add(new Customer("CC", 101));
        set.add(new Customer("CC", 107));

        for (Object object : set) {
            System.out.println(object);
        }

    }
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水哥很水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值