Java集合:Set集合

一、Set接口的特点

一个不包含重复元素的collection。更确切地讲,Set不包含满足e1.equals(e2)的元素对 e1和e2,并且最多包含一个null元素。

Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection接口,因此包含了Collection接口的所有方法。其主要实现类有HashSet和TreeSet,在HashSet的基础上又延伸出了LinkedHashSet。

HashSet和TreeSet的不同就在于如何判断两个数是否相同的方法上。

1.HashSet判断两个对象是否相同的方法时继承自Object类的equals方法

(public boolean equals(Object o)方法只可以比较是否相等,相等返回true,反之返回false)。

2.TreeSet判断两个对象是否相同的方法则是Comparable接口中的compareTo()方法

(public void int compareTo(Object o)方法不仅可以比较是否相等,还可以比较大小,如果相等返回0,调用者大于参数则返回正数,否则返回负数)

所以可以得到添加到TreeSet中的对象必须实现Comparable接口。同时如果使用HashSet则最好重写equals()方法。

二、HashSet

HashSet实现了Set接口,基于HashMap进行存储。遍历时不保证顺序,并不保证下次遍历的顺序和之前一样。HashSet中允许null值。

进入到HashSet源码中我们发现,所有数据存储在

private transient HashMap<E, Object> map;
private static final Object PRESENT = new Object();

意思就是HashSet的集合其实就是HashMap的key的集合,然后HashMap的val默认都是PRESENT。HashMap的定义即是key不重复的集合。使用HashMap实现,这样HashSet就不需要再实现一遍。

所以所有的add,remove等操作其实都是HashMap的add、remove操作。遍历操作其实就是HashMap的keySet的遍历

1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构

2.哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每个单向链表都有一个独一无二的hash值,代表数组的下表。在某个单向链表中的每个节点上的hash值是相同的。hash值实际上是key调用hashCode方法,再通过“hash function”转换成的值。

3.如何向哈希表中添加元素?

先调用存储的key的hashCode方法,经过 某个算法得到hash值,如果这个哈希表中不存在这个hash值,则直接加入元素。如果该hash值已经存在,继续调用key之间的equals方法,如果equals方法返回false,则将该元素添加。如果equals方法返回true,则放弃添加该元素 ,即元素重复。HashMap和HashSet的初始化容量是16,默认加载因子是0.75。

另外,HashSet完全继承了Set或者Collection里的方法实现add、addAll、clear、isEmpty、size、contains、iterator、remove等

三、TreeSet

TreeSet类型是J2SE中唯一可实现自动排序的类型

​ TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。

​ TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0

TreeSet集合:可以对Set集合中的元素进行排序。是不同步的。

但是TreeSet集合的存储是有序的,即:存储到集合中的元素是按自然顺序存储的。

判断元素唯一性的方式:

根据比较方法的返回值来判断。是0(零)就存入集合,不是0就不存。因为Set集合是不能有重复的元素,无序。

TreeSet要注意的事项:

1.往TreeSet里面添加元素时候,如果元素本具备自然顺序特性,那么就按照元素的自然顺序排序存储.

2.往TreSet里面添加元素时候,如果元素不具备自然顺序特性,那么该元素就必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法中

3.如果比较元素的时候,compareTo返回的是0,那么该元素被视为重复元素,不允许添加 (注意:TreeSet与HashCode,equals没有任何关系)

4.往TreeSet里面添加元素时候,如果元素本身不具备自然自然顺序特性,而且元素所属类也没有实现Comparable接口,那么我们必须要在创建TreeSet的时候传入一个比较器.

自定义比较器

自定一个比较器只需要实现接口 Comparator即可,把元素与元素之间的比较规则定义在compare方法内即可

自定义比较器的格式:

class 类名 implements Comparator<T>{}

(一)、自然排序

实现Comparable接口比较元素

自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。

Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。

obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。

如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0

(二)定制排序

自定义比较器比较元素

自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int **compare(To1,To2)**方法

(三)TreeSet总结:

1.特点

TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列

2.使用方式

(1)自然顺序(Comparable)

TreeSet类的add()方法会把存入的对象提升为Comparable类型

调用对象的comparaTo()方法和集合中的对象比较

根据comparaTo()方法返回的结果进行存储

(2)比较器顺序

创建TreeSet的时候可以指定一个Comparator

如果传入了Comparator的子类对象,那么TreeSet就会按照比较器的顺序排序。

add()方法内部会自动调用Comparator接口中的compare()方法排序

调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

(3)两种方式的区别

TreeSet构造函数什么都不传,默认按照类中Comparable的顺序(没有就报错ClassCastException)

TreeSet如果传入Comparator,就有先按照Comparator

四、LinkedHashSet

(一)、LinkedHashSet概述

LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素。

LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

(二)LinkedHashSet结论

输出LinkedHashSet集合中的元素时,元素的顺序总是和添加顺序一致。

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

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

相关文章

谈谈我对MYSQL乱码的解决办法

经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧: WINDOWS 下导入应该这样使用MYSQL的命令在DOS命令下进入mysql的bin目录下,输入mysql -uroot -p密码 数据库名称<要恢复的数据库, 例如我们…

Java集合:Map集合

一、简述 public interface Map<K,V>将键映射到值的对象。一个映射不能包含重复的键&#xff1b;每个键最多只能映射到一个值。 注意&#xff1a;Map中的集合不能包含重复的键&#xff0c;值可以重复。每个键只能对应一个值。 Map集合是键值对形式存储值的&#xff0c…

用离线编辑器Zoundry写zblog日志

Zoundry是免费的离线网志发布工具&#xff0c;由于家里的网络很差&#xff0c;写了一半的日志经常因为掉线而丢失&#xff0c;这样一款软件的确是很必要的。今天下载试用了一下&#xff0c;感觉的确不错。使用起来也很简单&#xff1a; 1.下载并安装zoundry软件&#xff1a;现…

MySQL:基本命令

一、数据库操作 1、查询数据库&#xff0c;命令如下: SHOW DATABASES;2、我们可以在登陆 MySQL 服务后&#xff0c;使用 create 命令创建数据库&#xff0c;命令格式: CREATE DATABASE 数据库名;3、使用 drop 命令删除数据库&#xff0c;命令格式&#xff1a; drop databas…

CentOS 5打造全功能Web服务器

转&#xff1a;主要做为历史记录&#xff0c;以后用。另外很少见这么好的编译的文章&#xff0c;其实我不推荐用编译安装。但这个文章不错.V3.0 2007年11月11日 将搭建教程划分阶段以适应不同需要。加入程序优化&#xff0c;程序安全&#xff0c;加入memcache&#xff0c;squid…

MySQL:查询条件

查询条件 1、使用 WHERE 子句从数据表中读取数据的通用语法&#xff1a; SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....查询语句中你可以使用一个或者多个表&#xff0c;表之间使用逗号**,** 分割&#x…

linux下的ImageMagick安装

检查系统有无安装ImageMagick官方网址是&#xff1a; www.imagemagick.org 从官方不好下载&#xff0c;提供 sourceforge的下载地址&#xff1a; imagemagick.sourceforge.net shell> rpm -qa | grep ImageMagick 没有就开始安装ImageMagickshell> rpm -Uvh ImageMagi…

MySQL:进阶应用

一、进阶应用 1、可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。 JOIN 按照功能大致分为如下三类&#xff1a; INNER JOIN&#xff08;内连接,或等值连接&#xff09;&#xff1a;获取两个表中字段匹配关系的记录。**LEFT JOIN&#xff08;左连…

Hive-常用操作

一. 数据库操作 1、创建数据库 //用户可以用 IF NOT EXISTS 选项来忽略这个异常。create database [ if not exists ] myhive ;2、创建数据库并指定hdfs存储位置 create database myhive2 location /myhive2;3、修改数据库&#xff0c;可以使用alter database 命令来修改数据…

linux下nmap工具的使用

nmap NMap&#xff0c;也就是Network Mapper&#xff0c;是Linux下的网络扫描和嗅探工 具包&#xff0c;其基本功能有三个&#xff0c;一是探测一组主机是否在线&#xff1b;其次是扫描主机端口&#xff0c;嗅探所提供的网络服务&#xff1b;还可以推断主机所用的操作系统 。N…

Hive-分区分桶概述

一、分区 简介 为了对表进行合理的管理以及提高查询效率&#xff0c;Hive可以将表组织成“分区”。 分区是表的部分列的集合&#xff0c;可以为频繁使用的数据建立分区&#xff0c;这样查找分区中的数据时就不需要扫描全表&#xff0c;这对于提高查找效率很有帮助。 分区是…

定时提醒你休息的脚本

本文来源于阿里西西WEB开发社区http://www.alixixi.com收集整理&#xff0c;欢迎访问。 定时弹窗提醒功能脚本..把以下代码存为.vbs运行即可. 以下是引用片段&#xff1a;set WshShell WScript.CreateObject("WScript.Shell") ’对话框标题 alerttitle "你的…

Hive-分区分桶操作

在大数据中&#xff0c;最常用的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff0c;就是我们可以把大的数据&#xff0…

ubuntu好文收集

ubuntu全程配置手册 http://ljlau.blogdriver.com/ljlau/1220277.html ubuntu下向系统日志写记录 http://linux0818.bokee.com/viewdiary.14153197.html aptitude 使用快速参考 http://linuxtoy.org/archives/aptitude_quick_reference.html

Flume简单介绍

在一个完整的离线大数据处理系统中&#xff0c;除了HDFSMapReduceHive组成分析系统的核心之外&#xff0c;还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统&#xff0c;而这些辅助工具在hadoop生态体系中都有便捷的开源框架&#xff0c;在此&#xff0c;我们首先来…

linux系统优化篇之---top

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法。 top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48Tasks: 29 total, 1 running, 28 sleeping, …

Flume安装部署

1.安装部署 1、解压tar -zxvf apache-flume-1.9.0-bin.tar.gz 2、改名mv apache-flume-1.9.0-bin flume-1.9.0 3、配置环境变量 vi /etc/profile,source /etc/profile #flume export FLUME_HOME/usr/local/apps/flume-1.9.0 export PATH$PATH:$FLUME_HOME/bin4、将conf下的…

ubuntu学习摘要-ubuntu root用户

在我安装好后root的密码是什么&#xff1f;我怎样使用root帐号&#xff1f; 当你第一次安装好Ubuntu后&#xff0c;root帐号不能用。在安装期间创建的第一个用户对系统有管理权&#xff0c;通过“sudo”能象root运行程序.使用时仅需它的普通用户密码。例如: sudo apt-get updat…

Elasticsearch 简介入门

Elasticsearch 是一个分布式的开源搜索和分析引擎&#xff0c;适用于所有类型的数据&#xff0c;包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成&#xff0c;由 Elasticsearch N.V.&#xff08;即现在的 Elastic&#xff0…

Elasticsearch 7.x 安装及配置

一、下载安装 1、下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 2、解压安装&#xff1a;tar -zxcf elasticsearch-7.9.0-linux-x86_64.tar.gz 二、新建es用户 在某个版本以后&#xff0c;elasticsearch为了安全性&#xff0c;是不能用root用户启…