java學習之高級語法——Set 集合

2020-12-11 全棧技術資源社區

Set 集合

java.util.Set 接口 extends Collection 接口

Set 接口的特點:

(1)不允許存儲重複的元素

(2)沒有索引,沒有帶索引的方法,也不能使用普通的for循環遍歷

java.util.HashSet 集合 implements Set接口

HashSet 接口的特點:

(3)是一個無序集合,存儲元素和取出元素的順序可能不一致

(4)底層是一個哈希表結構,特點是 「 查詢速度快 」

哈希值是一個十進位的整數,由系統隨機給出

(就是對象的地址值,是一個邏輯地址,是模擬出來得到的地址,不是數據實際存儲的物理地址)

在Object類有一個方法可以獲取對象的Hash值:int hashCode() ; --- 該方法返回調用這個方法的對象的哈希碼值

hasCode方法的源碼: public native int hashCode() ;

native:代表該方法調用的是本地作業系統的方法

public class Person extends Object {

}

public class DemoHahCode {

public static void main(String[] args) {

// Person類繼承了Object類,所以可以使用Object類的hashCode方法

Person p1 = new Person() ;

int h1 = p1.hashCode();

System.out.println(h1);

Person p2 = new Person() ;

int h2 = p2.hashCode();

System.out.println(h2);

}

HashSet集合存儲數據的結構 --- 哈希表(哈希表的特點:速度快)

jdk1.8版本之前 :哈希表 = 數組+鍊表

jdk1.8版本之後 :哈希表 = 數組+鍊表

哈希表 = 數組+紅黑樹(提高查詢速度)

【 什麼時候用紅黑樹呢?如果鍊表的長度超過了8位,則會把鍊表轉換為紅黑樹以提高查詢速度 】

數組結構:把元素進行分組(相同哈希值的元素一組)

鍊表 / 紅黑樹結構:把相同哈希值的元素連接到一起

Set集合存儲元素不重複的原理

前提:存儲的元素必須重寫hashCode方法和equals方法

具體說明:

Set集合在調用add方法的時候,add方法會調用元素的hashCode方法和equals方法,判斷元素是否重複

---> add方法會調用s1的hashCode方法,計算字符串「abc」的哈希值,哈希值是96354,在集合中找有沒有96354這個哈希值的元素,發現沒有,就會把s1存儲到集合中。

---> add方法會調用s2的hashCode方法計算字符串「abc」的哈希值,哈希值是96354,在集合中找有沒有96354這個哈希值的元素,發現有(哈希衝突),則s2會調用equals方法和哈希值相同的元素進行比較,s2.equals(s1)返回true,兩個元素的哈希值相同,equals方法返回true則說明兩個元素相同,這樣就不會把s2存儲到集合中。

---> add方法會調用「重地」的hashCode方法計算字符串的哈希值,哈希值是1179395,在集合中找有沒有1179395這個哈希值的元素,發現沒有,就會把「重地」存儲到集合中。

---> add方法會調用「通話」的hashCode方法計算字符串的哈希值,哈希值是1179395,在集合中找有沒有1179395這個哈希值的元素,發現有(哈希衝突),「通話」會調用equals方法和哈希值相同的元素進行比較,「通話」.equals(「重地」)返回false,兩個元素的哈希值相同,equals方法返回false則說明兩個元素不同,就會把「通話」存儲到集合中。

HashSet 存儲自定義類型元素

set集合報錯元素唯一:存儲的元素(String,Integer,...,Student,Person,...)必須重寫hashCode方法和equals方法

要求:同名同年齡的人視為同一個人,只能存儲一次

LinkedHashSet 集合

java.util.LinkedHashSet集合 extends HashSet集合

LinkedHashSet集合特點:底層是一個哈希表(數組+鍊表/紅黑樹)+鍊表 ----- 多了一條鍊表(記錄元素的存儲順序,保證元素有序)

可變參數

可變參數是 jdk1.5 之後出現的新特性

可變參數使用前提:當方法的參數列表數據類型已經確定,但是參數的個數不確定就可以使用可變參數

使用格式:定義方法時使用

修飾符 返回值類型 方法名(數據類型...變量名){ }

可變參數的原理:可變參數的底層就是一個數組,根據傳遞參數個數不同,會創建不同長度的數組,來存儲這些參數,傳遞的參數的個數可以是 0個(不傳遞)、1、2、...、多個

可變參數的注意事項:

(1)一個方法的參數列表只能有一個可變參數

(2)如果方法的參數有多個,那麼可變參數必須寫在參數列表的末尾

相關焦點

  • JAVA多線程 集合同步
    原文連結:http://www.javamadesoeasy.com/2015/12/how-to-synchronize-arraylist-in-java-to.html幾乎所有的集合非線程安全的?
  • 「009期」JavaSE面試題(九):集合之Set
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫開篇介紹大家好,我是Java面試題庫的提褲姐,今天這篇是面試系列的第九篇,主要總結了
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    Java在程式語言排行榜中一直牢牢佔據榜首位置,幾乎所有的大中型網際網路的應用系統在伺服器端開發首選都是Java編程,正因如何吸引這不少年輕人投入該行業,Java雖不想其它程式語言那麼複雜,但是知識體系還是很龐大的,因此想要學好並非容易之事,不少想要跨入Java編程行業的同學們通過網絡搜索各式各樣的學習資料,卻往往缺乏系統而全面的學習路線。
  • java集合詳解合集
    集合類主要負責保存、盛裝其他數據,因此集合類也被稱為容器類。所以的集合類都位於java.util包下,後來為了處理多線程環境下的並發安全問題,java5還在java.util.concurrent包下提供了一些多線程支持的集合類。在學習Java中的集合類的API、編程原理的時候,我們一定要明白,"集合"是一個很古老的數學概念,它遠遠早於Java的出現。
  • Javaweb開發學習路線及Java三大框架分享
    學習目標:Java程式設計師1: 熟悉jdk,jvm,eclipse,安裝於配置jdk2:熟悉並掌握java的基礎語法,類,抽象類,接口,內部類等概念3: java核心編程,如輸入輸出流,多線程,集合,XML,正則表達式等4:java
  • 程式設計師:java集合介紹,帶你深入理解list集合
    在程序運行時,Java集合可以動態的進行擴展,隨著元素的增加而擴大。在Java中,集合類通常存在於java.util包中。Java集合主要由2大體系構成,分別是Collection體系和Map體系,其中Collection和Map分別是2大體系中的頂層接口。
  • Java基礎自學寶典,學習路線圖大梳理
    學習是一個循序漸進的過程,是一件非常難得堅持的事情。如果真的想學Java,一定要下定決心!這裡我分享給你的Java學習線路圖,希望對你有幫助:java學習線路圖這個學習線路圖我分為了幾個階段,每個階段能學到什麼,能做什麼,具體知識點請往下看,每個階段知識點我都整理出來了,更適合學習!
  • Python數據類型之集合set
    # 集合:用來存儲一個無序的不重複的元素序列# 集合的標識也是大括號{},中間的元素使用逗號","隔開# 集合的創建方式:# set(序列)# s = {"123","qwe"}# 創建一個空集合必須用 set() 而不是 { },因為 { } 是用來創建一個空字典# s = {},這種是創建空的字典# 集合的兩大功能:# 集合可以實現去重的功能
  • 黑馬程式設計師:Java集合類重點是List集合、Set集合習題
    習題總結:本問的習題內容注意要是圍繞Java當中常用集合類,從Collection、Map根接口開始。重點在於List集合、Set集合、Map集合之間的區別。通過習題的內容,我們需要掌握各種集合類的使用場景,以及需要注意的細節。掌握泛型的使用以及工具類。
  • java基礎教程:Collection集合,Collection 常用API
    集合概述在前面基礎班我們已經學習過並使用過集合ArrayList<E> ,那麼集合到底是什麼呢?集合:集合是java中提供的一種容器,可以用來存儲多個數據。集合和數組既然都是容器,它們有什麼區別呢?數組的長度是固定的。集合的長度是可變的。
  • Java和 NET哪個就業前景更好?.NET轉Java難嗎?
    java程式語言的優劣勢1、Java語言是簡單的。Java語言的語法與C語言和C++語言很接近,使得大多數程式設計師很容易學習和使用Java。2、Java語言是一個面向對象的。另外Java程式語言很多東西是開源的,所以說很多框架什麼的都是人家寫好的,這個框架可能最近流行,但過幾年另外的誰開發了一個更好的框架,我們就要重新學習了,但學習.NET就不用那麼費勁 只要專注於微軟就可以了 他更新什麼我們就學習什麼就可以了,還有就是由於.NET開發的方便和快捷,導致許人多隻知道拖拽窗口,根本不了解真正的含義。
  • 沒用Java 8,怎麼優雅地避免空指針?
    JDK8新特性之Optional,這篇推薦看下。:56) - value1 =nullINFO [main] (BaseUserGuava.java:60) - value2 =5Set asSet()如果引用存在,返回只有單一元素的集合;若為NULl返回空集合publicstaticvoidtest5(){ Optional<Integer> nulloptional
  • 學習java的優勢是什麼?學習難度怎麼樣
    學習java成為了現在比較熱門的話題。Java是一種可以撰寫跨平臺應用軟體的面向對象的程序設計語言。  他容易學而且很好用,如果你學習過C++語言,你會覺得C++和Java很像,因為Java中許多基本語句的語法和C++一樣,像常用的循環語句,控制語句等和C++幾乎一樣,其實Java和C++是兩種完全不同的語言,Java只需理解一些基本的概念,就可以用它編寫出適合於各種情況的應用程式。同時截止到2018年8月,java領先其它語言幾乎4.5%。為世界第一程式語言。
  • 程式設計師:一文掌握java集合框架的Collection接口
    集合可以看作是一種容器,用來存儲對象信息。所有集合類都位於java.util包下,但支持多線程的集合類位於java.util.concurrent包下。集合和數組的區別(1)數組長度不可變化而且無法保存具有映射關係的數據;集合類用於保存數量不確定的數據,以及保存具有映射關係的數據。(2)數組元素既可以是基本類型的值,也可以是對象;集合只能保存對象。
  • Java入門書籍推薦,讀完你也可以帥氣的寫代碼了!
    此書是根據學習理論所設計的,讓你可以從學習程序語言的基礎開始一直到包括線程、網絡與分布式程序等項目。最重要的,你會學會如何像個面向對象開發者一樣去思考。2、Effective JavaEffective Java《Effective Java 中文版》是Joshua Bloch所著的一本書籍,該書每一章都包含幾個「條目」,以簡潔的形式呈現,自成獨立的短文,它們提出了具體的建議,對於Java平臺精妙之處的獨到見解
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    寫這篇文章的目的是想總結一下自己這麼多年來使用java的一些心得體會,主要是和一些java基礎知識點相關的,所以也希望能分享給剛剛入門的Java程式設計師和打算入Java開發這個行當的準新手們,希望可以給大家一些經驗,能讓大家更好學習和使用Java。這次介紹的主要內容是和J2SE相關的部分,另外,會在以後再介紹些J2EE相關的、和Java中各個框架相關的內容。
  • Java中Lambda表達式的5種不同語法
    1.標準語法考慮以下示例:String[] arr = {"program", "creek", "is", "a", "java", "site"};Arrays.sort(arr, (String m, String n) -> Integer.compare(m.length(), n.length()));System.out.println(Arrays.toString(arr));lambda表達式的標準語法包括以下內容:
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    軟體開發可以使用的語法是非常多,但是為什麼Java被廣泛的使用呢?其他程式語言與Java相比,Java語法相對簡單,並且是很多計算機語言的基礎。提到C++語言,很多人發現在使用過程中最容易出現的錯誤就是內存管理,而java有自動垃圾回收器,不用擔心內存。
  • Java 語法清單-快速回顧
    Java 語法清單翻譯自 egek92 的 JavaCheatSheet,從屬於筆者的 Java 入門與實踐系列。時間倉促,筆者只是簡單翻譯了些標題與內容整理,支持原作者請前往原文點讚。需要注意的是,此文在 Reddit 上也引起了廣泛的討論,此文講解的語法要點還是以 Java 7 為主,未涉及 Java 8 中內容,略顯陳舊,讀者可以帶著批判的視角去看。
  • 2020年最新Java學習路線圖,剛入門編程行業的小白必備知識清單!
    圖中涉及到的主要知識如下:java基礎語法-【重點知識】-剛開始學的時候可能會不適應,多敲敲代碼就好了面向對象編程-【重點知識】-在java的世界裡萬物皆對象。思想轉換比較困難,尤其學過C語言的同學集合-【重點知識】-在以後的開發過程中用的會非常頻繁IO流-【最好掌握】-學習起來有點凌亂,各種各樣的類會讓你頭暈眼花線程與並發-【最好掌握】-學習難度較大,追求高性能的項目用的較多異常-【重點知識】-寫代碼無法避免的存在,務必掌握網絡編程-【最好掌握】-一般公司用的比較少,涉及通信用的會較多除了以上的知識點,在java基礎中還有可視化界面編程,可以開發桌面應用程式