iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JavaSet接口及常用实现类总结
  • 732
分享到

JavaSet接口及常用实现类总结

JavaSet接口JavaSet接口常用方法JavaSet 2023-01-06 12:01:57 732人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言概述Set 无序性与不可重复性的理解无序性不可重复性Set 接口常用实现类HashSetLinkedHashSetTreeSet前言 Collection的另一个子接口就是S

前言

Collection的另一个子接口就是Set,他并没有我们List常用,并且自身也没有一些额外的方法,全是继承自Collection中的,因此我们还是简单总结一下,包括他的常用实现类HashSet、LinkedHashSet、TreeSet的总结!

概述

  • Set 接口是 Collection 的子接口, set 接口没有提供额外的方法。
  • Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个
    Set 集合中,则添加操作失败。
  • Set 判断两个对象是否相同不是使用 == 运算符,而是根据equals()方法。

Set 无序性与不可重复性的理解

无序性

不等于随机性。

public static void main(String[] args) {
        Set set = new HashSet();
        set.add("aniu");
        set.add(666);
        set.add("yyds");
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

可以看到,他遍历输出的结果不同于元素添加顺序。但千万不要认为这就是无序性,这一点你可以对比LinkedHashSet,他也是无序的,但他区别于HashSet,他可以按照添加顺讯遍历Set。因此,这里无序性要从底层存储数据的角度理解:Set存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值。

不可重复性

保证添加的元素按照equals()判断时,不能返回True,即相同的元素只能添加一个。

需要注意的是,对于自定义类实现的对象,一定要重写hashcode和equals方法才能保证判断他们是否相等。

可以看下面这段代码:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;


public class Demo {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add("aniu");
        set.add(666);
        set.add("yyds");
        set.add(new Stu("aniu",21));
        set.add(new Stu("aniu",21));
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

class Stu{
    String name;
    int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Stu)) return false;

        Stu stu = (Stu) o;

        if (age != stu.age) return false;
        return name != null ? name.equals(stu.name) : stu.name == null;
    }
    
}

可以发现我们之只重写equals是不行的!

重写hashcode后再看结果:

@Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

可以看到成功去掉了自定义对象的重复。这个和Set的底层存储原理有关,我们下面会写到!

Set 接口常用实现类

HashSet

作为Set接口的主要实现类,他是线程安全的,可以存储null值!

HashSet中元素的添加过程

我们以HashSet为例,来大概说一下Set元素的添加过程:

我们向 Hashset 中添加元素 a ,首先调用元素 a 所在类的 hashcode ()方法,计算元素 a 的哈希值,此哈希值接着通过某种算法计算出 HashSet 底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:

1.如果此位置上没有其他元素,则元素 a 添加成功。

2.如果此位置上有其他元素(或以链表形式存在的多个元素),则比较元素a与元素 b 的 hash 值:

a.如果 hash 值不相同,则元素 a 添加成功。

b.如果 hash 值相同,进而需要调用元素 a 所在类的 equals ()方法:

  • equals ()返回 true ,元素 a 添加失败
  • equaLs ()返回 false ,则元素 a 添加成功。

对于添加成功的而言,如果通过hash值计算出的数组索引相同,则元素 a 与已经存在指定索引位置上数据以链表的方式存储。

这也就是上面不可重复性里写到的,对于自定义类实现的对象,一定要重写hashcode和equals方法才能保证判断他们是否相等。

这里源码就不分析了,因为 HashSet的底层是HashMap,我们后面会总结HashMap的源码分析

LinkedHashSet

是HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历!

public static void main(String[] args) {
        Set set = new LinkedHashSet();
        set.add("aniu");
        set.add(666);
        set.add("yyds");
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

LinkedHashSet为什么可以按照添加的元素顺序来遍历呢,看下面这张图就行了:

LinkedHashSet在原有HashSet的基础上提供了双向链表,保证了便历时的顺序输出!

对于频繁的便利操作,LinkedHashSet的效率高于HashSet!

TreeSet

可以按照添加的元素的指定属性进行排序,因此,他要求添加的元素是同一数据类型!

public class Demo {
    public static void main(String[] args) {
        Set set = new TreeSet();
        set.add(3);
        set.add(21);
        set.add(15);
        set.add(6);
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

对于自定义类的对象,就需要我们前面总结的自然排序和定制排序了,这里不再写案例!

那再看看TreeSet的存储结构:

以上就是Java Set接口及常用实现类总结的详细内容,更多关于Java Set接口的资料请关注编程网其它相关文章!

--结束END--

本文标题: JavaSet接口及常用实现类总结

本文链接: https://www.lsjlt.com/news/176986.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaSet接口及常用实现类总结
    目录前言概述Set 无序性与不可重复性的理解无序性不可重复性Set 接口常用实现类HashSetLinkedHashSetTreeSet前言 Collection的另一个子接口就是S...
    99+
    2023-01-06
    Java Set接口 Java Set接口常用方法 Java Set
  • Java常用函数式接口总结
    四大函数式接口 新时代的程序员:lambda 表达式,链式编程,函数式接口,Stream 流式计算 函数式接口: 只有一个方法的接口 @FunctionalInterface...
    99+
    2024-04-02
  • Java Collection接口中的常用方法总结
    目录前言Collection 接口中的常用方法添加求长度判断当前集合是否为空清空集合元素判断当前对象是否在集合中移除判断相等集合转换为数组数组转换为集合结语前言 本节将大概用代码案例...
    99+
    2022-12-08
    Java Collection接口常用方法 Java Collection接口 Java Collection
  • Java中String类常用类型实例总结
    目录1.创建字符串的方法1.1构造1.2引用对象 2.字符串的比较3.字符串的不可改变性4.数组转字符串 5.判断是否是数字字符串  isNumberChar(  ) 6....
    99+
    2024-04-02
  • Java SpringBoot 获取接口实现类汇总
    目录前言一、获取接口的所有实现类1、枚举2、业务接口2.1 实现类3、ApplicationContextAware接口实现类4、获取到所有实现类使用前言 有时候,根据业务逻辑的需求...
    99+
    2024-04-02
  • java集合collection接口与子接口及实现类
    目录概要1 Collection接口的实现子类特性2 通过实现子类ArrayList体现Collection接口方法2.1 代码演示示例3 集合的遍历:①使用Iterator(迭代器...
    99+
    2024-04-02
  • Java中的常用类总结
    这篇文章主要讲解了“Java中的常用类总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的常用类总结”吧!目录Java常用类包装类包装类中的常量包装类的构造方法包装类中的常用方法M...
    99+
    2023-06-20
  • Java常用工具类总结
    目录一、线程协作、控制并发流程的工具类二、CountDownLatch倒计时门闩三、Semaphore信号量四、Condition接口(又称条件对象)五、CyclicBarrier和...
    99+
    2024-04-02
  • BlockingQueue接口及ArrayBlockingQueue实现类的方法
    这篇文章主要介绍“BlockingQueue接口及ArrayBlockingQueue实现类的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“BlockingQueue接口及ArrayBlocki...
    99+
    2023-06-27
  • Java调用第三方http接口的常用方式总结
    目录1.概述在Java项目中调用第三方接口的常用方式有2.Java调用第三方http接口的方式2.1 通过JDK网络类Java.net.HttpURLConnection2.2&nb...
    99+
    2024-04-02
  • Swift 字符串类型及常用方法详解总结
    目录1. 构造2. 拼接3. 字符4. 转义符5. 常用方法Swift 字符串类型及常用方法 1. 构造 // 直接赋值 text = "" // 1. 构造方法 text =...
    99+
    2024-04-02
  • C++中string类的常用方法实例总结
    目录引言C++string类常用方法总结引言 C++中提供了一种新的数据类型——字符串类型(string)。实际上string并不是C++的基本类型,它是在C...
    99+
    2024-04-02
  • JavaString类常用方法梳理总结
    目录一、String类概述概述特点二、使用步骤三、常用方法判断功能的方法获取功能的方法转换功能的方法分割功能的方法一、String类概述 概述 java.lang.String 类代...
    99+
    2024-04-02
  • C#实现异步的常用方式总结
    目录前言.NET异步编程模式C#异步有四种实现方式1、异步方法(Async Method TAP模式)2、任务并行库(TPL, Task Parallel Library&...
    99+
    2023-05-19
    C#实现异步方式 C#实现异步 C# 异步
  • Java中String类的常用方法总结
    目录概述特点使用步骤常用方法判断功能的方法获取功能的方法转换功能的方法分割功能的方法概述 java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如&quo...
    99+
    2022-11-13
    Java String类常用方法 Java String类 方法 Java String类
  • Vue中的常用指令及用法总结
    首先来聊聊Vue框架,Vue是一套用于构建用户界面的渐进式的JavaScript框架,对于初学者来说是非常友好的 , Vue的虚拟Dom , 数据双向绑定 , 都使开发者可以快速上手...
    99+
    2024-04-02
  • 在 Go 中使用泛型类型结构实现接口方法
    问题内容 我想要一个接口,它可以将任何类型的参数传递给它的单个方法,并且我想要一个带有泛型的单个实现结构。 这是我的问题的超级简化版本: package main type MyIn...
    99+
    2024-02-06
    overflow
  • 14个用Python实现的Excel常用操作总结
    目录前言一、关联公式:Vlookup二、数据透视表三、对比两列差异四、去除重复值五、缺失值处理六、多条件筛选七、 模糊筛选数据八、分类汇总九、条件计算十、删除数据间的空格十一、数据分...
    99+
    2024-04-02
  • Java集合之Set接口及其实现类精解
    目录Set接口概述HashSet实现类1、HashSet 具有以下特点: 2、HashSet 集合判断两个元素相等的标准3、向HashSet中添加元素的过程LinkedHashSet...
    99+
    2024-04-02
  • PHP中常见错误类型及其解决方法【总结】
    PHP是一门广泛应用于Web开发、服务器脚本编程的编程语言,具有易学易用、扩展性强、高效稳定等优点。但是在PHP开发过程中,程序员难免会遇到各种各样的错误,下面我们来看一下PHP中常见的错误类型及其解决方法。1. 语法错误语法错误是最常见的...
    99+
    2023-05-14
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作