Java进阶:【集合】set接口

set接口

特点:无序,唯一,这里的无序是相对list来说的,不是随机,

API:相对于list,没有索引的相关方法,

那么证明我们的遍历方法有:

(1)迭代器

(2)增强for循环

hashset实现类使用

无序,唯一,我们会发现重复存放的元素,输出的时候只会有一个,那如何验证呢,add()是一个bool返回值方法,所以我们输出add方法来看看去呗

我们可以发现,第一次添加hello,的返回结果时true成功的,第二次重复的时候就是false失败的,

    public static void main(String[] args) {
        HashSet<String> hs = new HashSet<>();
        System.out.println(hs.add("hello")); //true
        hs.add("hello");
        hs.add("hi");
        hs.add("html");
        hs.add("apple");
        hs.add("hello");
        System.out.println(hs.add("hello"));//false
        System.out.println(hs);
        System.out.println(hs.size());
    }

自定义引用类型的数据:

    public static void main(String[] args) {
        HashSet<Student> hs = new HashSet<>();
        hs.add(new Student("小丽",19));
        hs.add(new Student("小hu",29));
        hs.add(new Student("小Li",39));
        hs.add(new Student("小tian",49));
        hs.add(new Student("小丽",19));

        System.out.println(hs.toString());
    }

我自定义的类型不满足,唯一,无序的特点,为什么呢?

HashSet简要原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gT9Gm9MD-1637924738025)(javaSE.assets/image-20210705100134495.png)]

原因:我们的Student类没有重写hashCode和equals方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                name.equals(student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

重写之后,就符合HashSet的无序,唯一的特性了

hashSet原理:

底层与hashmap十分相似,下图是属性和构造器的分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xOz3EbqH-1637924738026)(javaSE.assets/image-20210705115010046.png)]

collection总结图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3JzoND7r-1637924738027)(javaSE.assets/image-20210705103626009.png)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冷环渊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值