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.pswp.cn/news/535705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535705.shtml
英文地址,請注明出處:http://en.pswp.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用戶啟…