關于Set集合類你都知道什么?來自《卷Ⅰ》的靈魂提問

在這里插入圖片描述

??各位小伙伴們大家好,歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄,在這個系列專欄中我將記錄淺學這本書所得收獲,鑒于 看到就是學到、學到就是賺到 精神,這波簡直就是血賺

💡涉及的知識點速通

  • 🛫 關于Set集合類你都知道什么?
    • 🪂 如何理解Set集合元素的無序不可重復?
    • 🪂 如何重寫equals和hashCode方法?
    • 🪂 HashSet和LinkedHashSet的異同?
    • 🪂 TreeSet都需要注意哪些?
    • 🪂 集合和數組之間如何相互轉換?
  • 🛫 Collection集合類的關系圖

🛫 關于Set集合類你都知道什么?

??我們將實現了Set接口的類稱為是List集合類,List集合類中元素存儲有一個特點:無序、不可重復,Set接口常用的有三個實現類:HashSet、linkedHashSet、TreeSet

🪂 如何理解Set集合元素的無序不可重復?

??無序性: 以HashSet集合為例,HashSet底層創建的是HashMap,而HashMap最主要的數據結構就是散列表,java使用鏈表數組來實現散列表,也就是一種數組加鏈表的結構,在這里數組中的每個元素被稱為是(bucket,默認為16)。所謂的元素無序存儲指的是:存儲的元素并不是按照索引順序依次存入數組,而是使用哈希算法也就是將元素的散列碼(hash值)對桶數進行取模運算,得到的結果就是該元素在數組中存儲的索引位置在這里插入圖片描述??Object類中定義的有hashCode方法可以獲取該對象對應的散列碼(hash值),又因為Object類是所有類的超類,所以每一個類的對象都能通過hashCode方法獲取到它所對應的散列碼,但是值得注意的是:使用hashCode生成的散列碼不同意味著它們肯定不相等,但是散列碼相等并不就意味著它們一定相等,所以說如果想要判斷它們是否相等需要再進行equals對比,如果equals的結果也為true的話表示它們一定相等

??不可重復性: 這里我們同樣以HashSet集合為例,散列碼相同的元素一定會被分到數組的同一個索引位置進行存儲,此時如果我們再判斷一下新添加的元素與該索引位置上鏈表元素的散列碼是否相等,如果相等再進行equals比較,如果還相等則說明新增元素是個重復元素,這樣的話就可以保證set集合中的元素不會重復了

??元素添加順序: 在jdk7和jdk8中新元素的添加順序也是不一樣的,在jdk7中是新元素 “上位” 指向鏈表中原來最新的元素;而jdk8中則是將新元素 “下位” 放在鏈表的末尾,原來最新的元素指向新元素。可以使用成語 “七上八下” 方便記憶在這里插入圖片描述

🪂 如何重寫equals和hashCode方法?

??眾所周知的是,Object類是所有類的超類,所以說如果在不重寫equals和hashCode方法的情況下,set集合判斷添加的是否是重復元素使用的就是Object類中的equals和hashCode方法,但是Object中的equals方法比較的是地址值、hashCode方法是通過地址值生成一個hash值。由此可見,即使自定義類的屬性值都一樣依然會被set集合識別為非重復值,因為他們存儲的地址不同。所以說,自定義類如果使用到hash結構的話,最好重寫equals和hashCode方法

??重寫后的equals和hashCode方法要盡量保持結果一致,也就是說當equals結果為true的時候hashCode的散列碼也要相等,那么如何做到這一點呢?那就是在重寫這兩種方法進行比較或者生成hash值的時候,盡量使用相同的字段,這里可以參考IDEA中默認重寫的equals和hashCode的寫法在這里插入圖片描述

🪂 HashSet和LinkedHashSet的異同?

??三者相同點:HashSet、LinkedHashSet和TreeSet都實現了Set接口,所以它們存儲數據的特點都一致,那就是無序、不可重復。而且Set接口中并沒有額外定義新的API方法,也就是說Set集合類中的API都是從Collection接口中繼承過來的

??HashSet是LinkedHashSet的父類,HashSet和LinkedHashSet中可以存儲null元素,而且這兩種set集合都是線程不安全的。除此之外,二者的差距就是LinkedHashSet在HashSet的基礎上又可以將所有的元素按照存入的順序遍歷出來,這并不就意味著LinkedHashSet中存儲的元素就是有序的,而是它在HashSet底層散列表的基礎上又使用雙向鏈表將元素按照順序前后鏈接起來,當遍歷集合元素的時候就可以順著雙向鏈表依次輸出

🪂 TreeSet都需要注意哪些?

??首先TreeSet不可以存儲null元素,否則就會拋出NullPointerException異常。其次TreeSet可以將添加的元素進行排序,但是添加進來的必須是相同類型的元素,否則就會拋出ClassCastException異常在這里插入圖片描述??在類型一致的情況下,如果添加的元素是自定義類型的話,必須手動定義排序規則,定義的方式主要有兩種

??第一種是自然排序,即實現Comparable接口重寫compareTo方法,在方法中指定TreeSet集合元素排序的規則,具體使用可以參考下面的截圖在這里插入圖片描述??第二種是定制排序,即創建TreeSet集合對象時向參數中傳遞一個comparator對象,該對象應該重寫compare方法并指定排序規則,具體使用可以參考下面的截圖在這里插入圖片描述??從上面兩個例子可以得知一個十分重要的結論:TreeSet集合判斷元素是否重復的規則不再是equals加hashCode方法,而是compareTo方法或者compare方法的返回值,返回值為零則說明元素重復,無法添加到集合中。

🪂 集合和數組之間如何相互轉換?

集合轉數組
??使用Collection接口里的toArray方法,可以將集合轉成一個object數組,而且還可以使用數組對象作為參數指定轉換的數組類型在這里插入圖片描述數組轉集合
??數組轉List集合的話可以使用Arrays的asList方法,轉成其他集合的話應該使用循環將數組中的元素依次添加到空集合中,并沒有現成的API可以使用在這里插入圖片描述由此可見,Arrays中的asList方法將基本數據類型數組對象當成一個元素轉換成List集合,但是該類型對應的包裝類數組是將數組中的數據對象當成一個元素轉換成List集合

🛫 Collection集合類的關系圖

??至此,我們已經學習了整個Collection集合的常用實現類,在這里我整理了一下Collection集合的關系圖譜供大家參考學習在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535003.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

流程圖虛線框表示什么_UI設計|APP的交互線框布局設計

一.流程圖設計流程圖(Flow Chart):用圖示的方式反映出特定主體為了滿足特定需求而進行的有特定邏輯關系的一系列操作過程。流程圖的四種基本結構:順序結構,條件結構(又稱選擇結構),循環結構,分支結構。1.流程圖的常用符…

使用Redis完成商品秒殺業務

各位小伙伴們大家好,歡迎來到這個小扎扎的Redis 6專欄,在這個系列專欄中我對B站黑馬的Redis教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛ 💡Redis知識點速覽&#…

表格列隱藏_【excel每日提升】Excel隱藏列,不讓別人打開!

【新朋友】點擊標題下面藍色字“王俊東“關注。 【老朋友】點擊右上角,轉發或分享本頁面內容。excel系列課程excel特效系列課程開始了,今天第2節!第1節:Excel有公式的單元格標記顏色,很簡單!第2節&#xf…

map與weakmap,ES6 Map和WeakMap有什么區別?

Looking this and this MDN pages it seems like the only difference between Maps and WeakMaps is a missing "size" property for WeakMaps. But is this true? Whats the difference between them?解決方案The experienced JavaScript programmer will notice…

“畢業季”|一個java開發實習生的OFFER之路

哈嘍哈嘍大家好,這里是小扎扎的博客。相信有關注過我的好盆友們可能會發現我已經有一段時間沒有出來劃水了,那么這段時間小扎扎都在干什么呢?沒錯!我確實是去找實習了!接下來就給大家介紹一下本次戰役的戰況如何 活動地…

virtualbox 該內存不能為written_系統提示“該內存不能為read”的原因和解決辦法...

我們單位的電腦經常顯示這個對話框,已經有好幾年了,單位的老頭們都不怎么懂電腦,我本人也不愛管閑事。但是出現這種對話框的原因是什么呢?又怎么解決呢?一般電腦經常出現藍屏和死機,而且頻繁出現。有時會出…

插件properties_Mybatis3系列 - 4. mybatis-config的properties屬性詳解

前兩章簡單的講解了MyBatis的使用方式. 接下來先全局的說一下MyBatis的全局的xml配置詳細說明.XML格式定義-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">configuration 的映射文件(根據定義順序說明)properties 屬性…

【Redis 6】秒殺業務——分布式鎖

各位小伙伴們大家好,歡迎來到這個小扎扎的Redis 6專欄,在這個系列專欄中我對B站黑馬的Redis教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛ 💡Redis知識點速覽&#…

python讀取文件最后幾行_如何用python獲取文件的最后一行,文件可能會比較大

展開全部 #!/usr/bin/env python import os import sys def get_last_n_lines(logfile, n): blk_size_max 4096 n_lines [] with open(logfile, rb) as fp: fp.seek(0, os.SEEK_END) cur_pos fp.tell() while cur_pos > 0 and len(n_lines) < n: blk_size min(blk_si…

360oauth token是什么意思_Oauth/access token

oauth/access_token第三放應用使用開始的request_token來換取用戶授權過的Access_tokenURL格式標準的OAuth http返回格式HTTP請求方式POST請求數限制false請求參數oauth_consumer_key: 創建應用時生成的APP KEY。oauth_token:經過用戶授權的Request Token。oauth_signature_met…

【Swagger】看這一篇就夠了

各位小伙伴們大家好&#xff0c;歡迎跟著小扎扎一起學習【Swagger】這門技術&#xff0c;在本片博客中我對B站狂神的Swagger教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Swagger知識點…

python mockito arg_that_wqingxiao

偶然間在脈脈上看到了一道頭條的算法面試題按照題目的理解&#xff0c;簡單的寫了一個html網頁pool開始{{index}}{{index}}var vm new Vue({el: #vue_det,data: {list: [],i: 0},methods: {details: function () {return this.site " - 學的不僅是技術&#xff0c;更是夢…

用python畫大雄_python制作斗圖生成器

網上各種帶文字的表情圖片都被大家玩壞了&#xff0c;今天就和大家一起用 python 親自做一個帶字表情圖片生成器。 不知道大家有沒有看到網上有很多人都在說 "人生苦短&#xff0c;我用 python"&#xff0c;這句話我之前也不是很理解&#xff0c;覺得人生苦短和用pyt…

【spring cloud】(一)使用idea創建可相互調用的多模塊應用

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的spring cloud專欄&#xff0c;在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;spr…

epson彩色打印機加墨水_愛普生打印機墨盒如何加墨?

展開全部掌握以下幾點步驟&#xff0c;即可輕松加墨。1、首先&#xff0c;從打印機上取下墨盒&#xff0c;32313133353236313431303231363533e4b893e5b19e31333365646234這里就不好做介紹了&#xff0c;取下墨盒的方法因機而異。將墨盒上的一層貼紙撕掉&#xff0c;并拿出所需材…

python字符串百分號_Python字符串格式化的2種方法

本文介紹了Python字符串格式化&#xff0c;主要有兩種方法&#xff0c;分享給大家&#xff0c;具體如下 用于字符串的拼接&#xff0c;性能更優。 字符串格式化有兩種方式&#xff1a;百分號方式、format方式。 百分號方式比較老&#xff0c;而format方式是比較先進的&#xff…

【踩坑,已解決】spring cloud刪除子模塊后創建同名模塊時遇到的刪除不凈,java、resources包失效,java、resources包被標記為模塊等問題

&#x1f4a1;問題速覽&#x1f4cc; 問題復現&#x1f4cc; 沒有任何操作&#xff0c;model又出現了&#x1f4cc; 模塊重建后java、resources包失效&#x1f4cc; 模塊重建后java、resources包被標記為了模塊&#x1f4cc; 問題復現 本人是在跟著B站尚硅谷的視頻練習Spring c…

藍牙掃描過程解析_智慧定位系統之藍牙網關在室內定位技術的原理淺析-新導智能...

藍牙室內定位技術是利用在室內安裝的若干個藍牙局域網接入點&#xff0c;把網絡維持成根據多用戶的基礎網絡連接形式&#xff0c;并確保藍牙局域網接入點始終是這個微網的主設備&#xff0c;然后經過丈量信號強度對新加入的盲節點進行三角定位。蘇州新導實時定位體系(RTLS)和室…

【spring cloud】(二)服務的注冊發現——Eureka

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的spring cloud專欄&#xff0c;在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;spr…

python選擇題題庫百度文庫_大學Python程序題題庫

程序設計 題目&#xff1a;補充 fun 函數&#xff0c;其功能是判斷一個整數是否是素數&#xff0c;在主 函數 main 中輸入一個整數&#xff0c;調用該 fun 函數進行判斷并輸 出結果。 要求&#xff1a;使用 math 相關函數 import math def fun(n): i,w2,0 if n<1: w1 while …