Java进阶:【集合】set接口

简介: 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简要原理图

1.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十分相似,下图是属性和构造器的分析

1.png


collection总结图

2.png

相关文章
|
1天前
|
Java
java集合
摘要:使用`equals`方法可直接比较两个集合是否完全相同,因Java集合类已重写该方法。快速创建集合可采用`Lists.newArrayList()`。
7 3
|
1天前
|
存储 Java 测试技术
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
【6月更文挑战第15天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
8 1
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
|
2天前
|
运维 Java 程序员
新手进阶:用对if-else,让你的Java逻辑判断不再纠结!
【6月更文挑战第14天】本文介绍了如何有效使用Java中的if-else语句。从基础开始,解释了if-else用于根据条件执行不同代码路径的功能。接着,通过实践演示如何避免过度嵌套以提高代码可读性,利用逻辑运算符简化条件判断,以及在异常处理中运用if-else提升程序健壮性。通过这些最佳实践,旨在帮助开发者更好地掌握if-else,使其成为编程工具箱中的利器。
|
2天前
|
存储 算法 安全
[笔记] 疯狂JAVA讲义(第3版)第8章 Java集合(二)
[笔记] 疯狂JAVA讲义(第3版)第8章 Java集合(二)
|
2天前
|
存储 算法 Java
[笔记] 疯狂JAVA讲义(第3版)第8章 Java集合(一)
[笔记] 疯狂JAVA讲义(第3版)第8章 Java集合(一)
|
2天前
|
Java
深入理解 Java 8 函数式接口:定义、用法与示例详解
深入理解 Java 8 函数式接口:定义、用法与示例详解
4 1
|
2天前
|
安全 Java
Java 并发编程详解:Lock 接口及其实现 ReentrantLock
Java 并发编程详解:Lock 接口及其实现 ReentrantLock
9 1
|
2天前
|
Java API
深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能
深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能
9 2
|
2天前
|
存储 Java
Java 新手进阶:从变量到常量,一步步走向编程巅峰!
【6月更文挑战第14天】Java新手应掌握变量与常量,它们是编程基础。通过示例展示变量(如矩形的长度和宽度)用于存储可变数据,常量(如重力加速度)用于表示固定值。理解不同类型的变量,如字符串、整型和浮点型,并用`final`关键字定义常量。在银行账户管理程序案例中,变量跟踪账户信息,常量表示年利率。熟悉这些概念将提升编程技能。
|
2天前
|
存储 安全 Java
滚雪球学Java(60):深入解析Java中的Vector集合类!
【6月更文挑战第14天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
137 59
滚雪球学Java(60):深入解析Java中的Vector集合类!