Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet

文章目录

    • Set接口概述
    • HashSet实现类
    • LinkedHashSet实现类
    • TreeSet实现类



Set接口概述

1、Set接口是Collection的子接口,set接口没有定义额外的方法,使用的都是Collection接口中的方法。
2、Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。

在这里插入图片描述
3、Set:存储无序的、不可重复的数据
(以HashSet为例说明)
①无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值。
②不可重复性:保证添加的元素按照equals()判断时,不能返回true。即:相同的元素只能添加一个。



HashSet实现类

1、HashSet 具有以下特点:
①不能保证元素的排列顺序
②HashSet 不是线程安全的
③集合元素可以是 null

2、HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。因此对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode()方法,以实现对象相等规则,即:“相等的对象必须具有相等的散列码”。

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

如果此位置上没有其他元素,则元素a添加成功。—>情况1
如果此位置上有其他元素b(或以链表形式存在多个元素),则比较元素a与元素b的hash值:

如果hash值不相同,则元素a添加成功。—> 情况2
如果hash值相同,进而需要调用元素a所在类的equals()方法:

如果equals()返回true,元素a添加失败
如果equals()返回false,则元素a添加成功。—>情况3

对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。(七上八下)
jdk 7 : 新来元素a放到数组中,指向已存在的旧元素。
jdk 8 : 已存在的旧元素在数组中,指向新来元素a

在这里插入图片描述
底层为“数组+链表”,数组初始容量为16,当如果使用率超过0.75(16*0.75=12)就会扩大容量为原来的2倍。(16扩容为32,依次为64,128…等)

重写equals()方法的时候一般都需要同时复写hashCode()方法。通常参与计算hash值的对象的属性也应该参与到equals()中进行计算

在这里插入图片描述



LinkedHashSet实现类

1、LinkedHashSet 是 HashSet 的子类,也是根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。

2、LinkedHashSet插入性能略低于 HashSet,但在迭代访问(遍历) Set 里的元素时有很好的性能。

3、LinkedHashSet 不允许集合元素重复。

在这里插入图片描述



TreeSet实现类

1、TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。元素应为相同类的对象。

2、TreeSet底层使用红黑树结构存储数据。

3、TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。

4、自然排序
①TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按条件排列。如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。实现 Comparable 的类必须重写compareTo(Object obj) 方法,两个对象通过compareTo(Object obj) 方法的返回值来比较大小。
②向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添
加的所有元素都会调用compareTo()方法进行比较。
③因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同
一个类的对象。
④对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是两个对象通过 compareTo(Object obj) 方法比较的返回值。

import java.util.Iterator;
import java.util.TreeSet;/*** @Author: Yeman* @Date: 2021-09-16-16:48* @Description:*/class Student implements Comparable{String name;int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Override//姓名从小到大,年龄从大到小排列public int compareTo(Object o) {if (o instanceof Student){Student student = (Student) o;int nameResult = this.name.compareTo(student.name);if (nameResult == 0){return -Integer.compare(this.age,student.age);}else {return nameResult;}}else throw new RuntimeException("类型不匹配");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class TreeSetTest {public static void main(String[] args) {TreeSet treeSet = new TreeSet();treeSet.add(new Student("Tom",18));treeSet.add(new Student("Tom",22));treeSet.add(new Student("jim",18));treeSet.add(new Student("Anne",19));treeSet.add(new Student("Lily",25));treeSet.add(new Student("LiLei",25));Iterator iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}

在这里插入图片描述
5、定制排序
①定制排序,通过Comparator接口来实现,需要重写compare(T o1,T o2)方法。
②要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。
③仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。
④使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;/*** @Author: Yeman* @Date: 2021-09-16-16:48* @Description:*/class Student{String name;int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class TreeSetTest {public static void main(String[] args) {Comparator com = new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Student && o2 instanceof Student) {Student student1 = (Student) o1;Student student2 = (Student) o2;return Integer.compare(student1.age, student2.age);} else throw new RuntimeException("类型不匹配");}};TreeSet treeSet = new TreeSet(com);treeSet.add(new Student("Tom",18));treeSet.add(new Student("Tom",22));treeSet.add(new Student("jim",18));treeSet.add(new Student("Anne",19));treeSet.add(new Student("Lily",25));treeSet.add(new Student("LiLei",25));Iterator iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php设置超链接,怎么给一个PHP密码访问页面加超链接

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼$password "1234"; // 这里是密码$p "";if(isset($_COOKIE["isview"]) and $_COOKIE["isview"] $password){$isview true;}else{if(isset($_POST["pwd"])){if($_POST["…

Java集合(6)--Map接口

文章目录Map接口概述Map结构的理解Map接口常用方法Map接口概述 Map与Collection并列存在,用于保存具有映射关系的数据:key-value Map中的 key 和 value 都可以是任何引用类型的数据 常用String类作为Map的“键”。key 和 value 之间存在单向一对一关系&#xff0…

php+js表单验证数字,.validate表单验证js

$("#signupForm").validate({rules: {name: {required: true},id:{required:true校验类型:}},messages: {name: {required: "请输入姓名"},id{required: 必填校验类型:}}})name可以填入div里的idrequired 设置必填校验类型取值描述requiredtrue|false必填字…

java低延迟_像Java这样的C ++具有低延迟

java低延迟总览 以前,我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是,经过思考,我认为像Java这样的C 是一个更好的术语,因为您仍在使用OOP惯例(不是C惯例),但是您需要投入更多…

Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties

文章目录HashMap类LinkedHashMap类TreeMap类Hashtable类Properties类HashMap类 1、HashMap类概述 HashMap是 Map 接口使用频率最高的实现类,允许使用null键和null值,与HashSet一样,不保证映射的顺序。 所有的key构成的集合是Set&#xff1a…

为什么SpringBoot如此受欢迎,以及如何有效地学习SpringBoot?

SpringBoot是最流行和使用最广泛的Java框架。 有时这种讨论“为什么SpringBoot如此受欢迎?” 来我和我的朋友/同事之间。 另外,我确实收到了许多人发来的电子邮件,询问“春天很大,如何快速学习?” 。 在这篇文章中&…

支持linux系统摄像头模块,在Linux操作系统上使用摄像头

我的公家笔记本的摄像头一直没啥用,偶尔用 vmware player 2.0模拟个 msn 用(其实到目前一次都没用过)。搞过安全对这东西严重不信任通常都不驱动,忽然想起重案6组那个警察兄弟说搞高科技的最怕高科技产品。linux 下一直没装,晚上闲着没啥事&a…

Java实现复数Complex的加减乘除运算、取模、求幅角角度

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) /*** Author: Yeman* Date: 2021-09-23-9:03* Description:*/…

linux 域账户密码忘记,linux基础命令-用户域用户组管理

//与用户相关的配置文件:/etc/passwd: #用户的配置文件, 保存用户账户的基本信息/etc/shadow #用户影子口令文件一、用户帐号文件——passwd1.“/etc/passwd”文件是UNIX安全的关键文件之一。该文件用于用户登录时效验用户的登录名、加密的口令数据项、…

Java集合(8)--集合工具类Collections

Collections 是一个操作 Set、List 和 Map 等集合的工具类。 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。 排序操作 reverse(List):反转 List 中元素的顺…

Java程序员应在2018年学习的3种JVM语言

如果您是Java程序员,并且想学习更多的编程语言以扩展您的知识和技能,但是不确定选择哪种编程语言,那么您来对地方了。 在本文中,我将分享Java程序员可以在2018年学习的3种JVM语言以及为什么要学习它们。 成为多语种开发人员的素质…

Java泛型(1)--集合使用泛型Generic、自定义泛型、泛型在继承上的体现、通配符的使用

文章目录泛型的概念集合中使用泛型自定义泛型结构泛型在继承上的体现通配符的使用泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个…

linux 内存 面试,【Linux内存面试题】面试问题:查看机器配置命… - 看准网

1、查看内存大小solari:prtconf -vp | grep Memlinux :grep MemTotal /proc/meminfo2、查看硬盘大小solari:df -klinux :fdisk -l[rootssoldap ~]# fdisk -lDisk /dev/sda: 146.6 GB, 146685296640 bytes255 heads, 63 sectors/tr…

蚂蚁组件 axure 蚂蚁_蚂蚁属性细微差别

蚂蚁组件 axure 蚂蚁每隔一段时间,我会想起Ant属性的一些细微差别 ,一旦忘记它们,在与Ant交互时会引起混乱。 特别是, Ant属性 通常是不可变的 (不包括Ant 1.8以来的局部属性 ),并且在其第一次设…

JavaIO流(1)--File类的使用

文章目录File类概述常用构造器常用方法File类概述 File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。 要在Java程序中表示一个真实存在的文件或目录,那么必…

linux抓包提示没有权限,linux下wireshark不用sudo权限抓包包

ubuntu安装了wireshark,发现打不开网络接口,后来从网上得知要用sudo从命令行执行,确实可以,但是执行过程中一直要开一个命令行窗口,不爽,想直接用单击图标的方法运行之,在网上查询找到以下两个方…

Http基本身份验证在Spring Security中如何工作?

在上一篇文章中,您学习了如何在基于Spring安全性的Java应用程序中启用Http基本身份验证 ,现在,我们将进一步进一步了解http基本身份验证在Spring安全性中的工作原理。 如果您还记得的话,当您使用HTTP Basic进行身份验证时&#xf…

JavaIO流(2)--IO流原理、流的分类及节点流文件流操作

文章目录IO流简介IO流原理流的分类IO 流体系节点流和处理流节点流操作IO流简介 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。 Java程序中,对于数据的输入/输出操作…

linux权限体系有哪些角色,详解Linux下系统权限

一、权限概述1. 什么是权限权限:在计算机系统中,权限是指某个计算机用户具有使用软件资源的权利。软件资源:Linux系统中,一切皆文件!SO,这里的软件资源就是文件资源。所以,我们今天所讲的权限&a…

试用期java_Java 7试用资源

试用期javaJava 7为完成使用后需要关闭的资源(例如文件,流,数据库连接和套接字)提供了更好的资源管理。 这种语言构造称为try-with-resources语句。 完成这项工作的机制称为AutoCloseable接口。 Java 7资源类均实现此接口。 该接口…