java深入集合,java集合的使用

本文目錄一覽:

java集合的學習方法

集合是多個對象的容器,容器里聚集了一組對象。

java中各種集合類通過集合框架進行組織。

對所有集合類最經常的操作就是訪問集合中的元素。

列表(List)

集合(Set)

映射(Map)

java 集合類 需研究哪些技術點

數組是集合的一種,是集合的一個子集,你理解了數組就理解了集合.

理解集合類

集合類存放於java.util包中。

集合類存放的都是對象的引用,而非對象本身,出於表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。

集合類型主要有3種:set(集)、list(列表)和map(映射)。

(1)集

集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裡放東西。

對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重複對象。

集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變為按照某種比較規則將其插入到有序的對象序列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。

(2)列表

列表的主要特徵是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。

列表在數據結構中分別表現為:數組和向量、鏈表、堆棧、隊列。

關於實現列表的集合類,是我們日常工作中經常用到的,將在後邊的筆記詳細介紹。

(3)映射

映射與集或列表有明顯區別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。

關鍵字本身並不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,散列碼通常用作一個偏置量,該偏置量是相對於分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況下,散列處理應該產生給定範圍內均勻分布的值,而且每個關鍵字應得到不同的散列碼。

集合類簡介

java.util中共有13個類可用於管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹

集:

HashSet: 使用HashMap的一個集的實現。雖然集定義成無序,但必須存在某種方法能相當高效地找到一個對象。使用一個HashMap對象實現集的存儲和檢索操作是在固定時間內實現的.

TreeSet: 在集中以升序對對象排序的集的實現。這意味着從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用了一個TreeMap.

列表:

Vector: 實現一個類似數組一樣的表,自動增加容量來容納你所需的元素。使用下標存儲和檢索對象就象在一個標準的數組中一樣。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類??當兩個或多個線程同時訪問時也是性能良好的。

Stack: 這個類從Vector派生而來,並且增加了方法實現棧??一種後進先出的存儲結構。

LinkedList: 實現一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。

ArrayList: 實現一個數組,它的規模可變並且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。

映射:

HashTable: 實現一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是前面java實現的一個繼承,並且通常能在實現映象的其他類中更好的使用。

HashMap: 實現一個映象,允許存儲空對象,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個)。

WeakHashMap: 實現這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被捨棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,儘管使用映象的程序不再有對鍵的引用,並且因此不能檢索對象。

TreeMap: 實現這樣一個映象,對象是按鍵升序排列的。

Set和List都是由公共接口Collection擴展而來,所以它們都可以使用一個類型為Collection的變量來引用。這就意味着任何列表或集構成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得一個列表。)所以說,把一個列表或集傳遞給方法的標準途徑是使用Collection類型的參數

java的集合

一、Set集合,其主要實現類有HashSet、TreeSet。存放對象的引用,不允許有重複對象。

通過java的equals()方法判別。如果有特殊需求須重載equals()方法。

1、HashSet(),調用對象的hashCode()方法,獲得哈希碼,然後再集合中計算存放對象的位置。通過比較哈希碼與equals()方法來判別是否重複。所以,重載了equals()方法同時也要重載hashCode()方法。

2、TreeSet(),繼承ShortedSet接口,能夠對集合中對象排序。默認排序方式是自然排序,但該方式只能對實現了Comparable接口的對象排序,java中對Integer、Byte、Double、Character、String等數值型和字符型對象都實現了該接口。

如果有特殊排序,須重載該接口下的compareTo()方法或通過Comparator接口的實現類構造集合。

二、List集合,其主要實現類有LinkedList、ArrayList,前者實現了鏈表結構,後者可代表大小可變的數組。List的特點是能夠以線性方式儲蓄對象,並允許存放重複對象。List能夠利用Collections類的靜態方法sort排序。sort(List list)自然排序;sort(List listm,Comparator comparator)客戶化排序。

三、Map集合,其主要實現類有HashMap、TreeMap。Map對值沒有唯一性要求,對健要求唯一,如果加入已有的健,原有的值對象將被覆蓋。HashMap類按照哈希算法來存取鍵對象,可以重載equals()、hashCode()方法來比較鍵,但是兩者必須一致。TreeMap,可自然排序,也可通過傳遞Comparator的實現類構造TreeMap。

JAVA裡面set,map,list的區別是什麼?(盡量詳細)

一、List接口

List是一個繼承於Collection的接口,即List是集合中的一種。List是有序的隊列,List中的每一個元素都有一個索引;第一個元素的索引值是0,往後的元素的索引值依次+1。和Set不同,List中允許有重複的元素。實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

ArrayList

ArrayList是一個動態數組,也是我們最常用的集合。它允許任何符合規則的元素插入甚至包括null。每一個ArrayList都有一個初始容量:

private static final int DEFAULT_CAPACITY = 10;

隨着容器中的元素不斷增加,容器的大小也會隨着增加。在每次向容器中增加元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操作。所以如果我們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。

size、isEmpty、get、set、iterator 和 listIterator 操作都以固定時間運行。add 操作以分攤的固定時間運行,也就是說,添加 n 個元素需要 O(n) 時間(由於要考慮到擴容,所以這不只是添加元素會帶來分攤固定時間開銷那樣簡單)。

ArrayList擅長於隨機訪問。同時ArrayList是非同步的。

LinkedList

同樣實現List接口的LinkedList與ArrayList不同,ArrayList是一個動態數組,而LinkedList是一個雙向鏈表。所以它除了有ArrayList的基本操作方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部。

由於實現的方式不同,LinkedList不能隨機訪問,它所有的操作都是要按照雙重鏈表的需要執行。在列表中索引的操作將從開頭或結尾遍歷列表(從靠近指定索引的一端,節約一半時間)。這樣做的好處就是可以通過較低的代價在List中進行插入和刪除操作。

與ArrayList一樣,LinkedList也是非同步的。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:

List list = Collections.synchronizedList(new LinkedList(…));

Vector

與ArrayList相似,但是Vector是同步的。所以說Vector是線程安全的動態數組。它的操作與ArrayList幾乎一樣。

Stack

Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創建後是空棧。

二、Set接口

Set是一個繼承於Collection的接口,Set是一種不包括重複元素的Collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。與List一樣,它同樣運行null的存在但是僅有一個。由於Set接口的特殊性,所有傳入Set集合中的元素都必須不同,關於API方面。Set的API和Collection完全一樣。實現了Set接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。

HashSet

HashSet堪稱查詢速度最快的集合,因為其內部是以HashCode來實現的。集合元素可以是null,但只能放入一個null。它內部元素的順序是由哈希碼來決定的,所以它不保證set的迭代順序;特別是它不保證該順序恆久不變。

TreeSet

TreeSet是二叉樹實現的,基於TreeMap,生成一個總是處於排序狀態的set,內部以TreeMap來實現,不允許放入null值。它是使用元素的自然順序對元素進行排序,或者根據創建Set時提供的 Comparator 進行排序,具體取決於使用的構造方法。

LinkedHashSet

LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起 來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色於HashSet。

三、Map接口

Map與List、Set接口不同,它是由一系列鍵值對組成的集合,提供了key到Value的映射。在Map中它保證了key與value之間的一一對應關係。也就是說一個key對應一個value,所以它不能存在相同的key值,當然value值可以相同。實現map的集合有:HashMap、HashTable、TreeMap、WeakHashMap。

HashMap

以哈希表數據結構實現,查找對象時通過哈希函數計算其位置,它是為快速查詢而設計的,其內部定義了一個hash表數組(Entry[] table),元素會通過哈希轉換函數將元素的哈希地址轉換成數組中存放的索引,如果有衝突,則使用散列鏈表的形式將所有相同哈希地址的元素串起來,可能通過查看HashMap.Entry的源碼它是一個單鏈表結構。

HashTable

也是以哈希表數據結構實現的,解決衝突時與HashMap也一樣也是採用了散列鏈表的形式。HashTable繼承Dictionary類,實現Map接口。其中Dictionary類是任何可將鍵映射到相應值的類(如 Hashtable)的抽象父類。每個鍵和每個值都是一個對象。在任何一個 Dictionary 對象中,每個鍵至多與一個值相關聯。Map是”key-value鍵值對”接口。 HashTable採用”拉鏈法”實現哈希表不過性能比HashMap要低。

TreeMap

有序散列表,實現SortedMap接口,底層通過紅黑樹實現。

WeakHashMap

談WeakHashMap前先看一下Java中的引用(強度依次遞減)

強引用:普遍對象聲明的引用,存在便不會GC

軟引用:有用但並非必須,發生內存溢出前,二次回收

弱引用:只能生存到下次GC之前,無論是否內存足夠

虛引用:唯一目的是在這個對象被GC時能收到一個系統通知

以弱鍵實現的基於哈希表的Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。更精確地說,對於一個給定的鍵,其映射的存在並不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然後被回收。丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現有所不同。null值和null鍵都被支持。該類具有與HashMap類相似的性能特徵,並具有相同的效能參數初始容量和加載因子。像大多數集合類一樣,該類是不同步的。

四、總結

1、List、Set都是繼承自Collection接口,Map則不是。

2、List特點:元素有放入順序,元素可重複 ,Set特點:元素無放入順序,元素不可重複,重複元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set 的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標來取得想要的值。)

3、Set和List對比:

Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。

List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。

4、Map適合儲存鍵值對的數據

5、線程安全集合類與非線程安全集合類 :

LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;

HashMap是非線程安全的,HashTable是線程安全的;

StringBuilder是非線程安全的,StringBuffer是線程安全的。

java集合是什麼?

Java集合是什麼:

Java 中的集合類庫可以幫助我們在程序設計中實現傳統的數據結構。

Java的集合類是一個用來存放對象的容器,有以下特點:

1、Java集合只能存放對象。加入添加了一個基本數據類型,會被自動裝箱後存入集合。

2、集合存放的是多個對象的引用,對象本身是在堆內存中的。

3、集合可以存放不同類型,不限數量的數據類型。

集合分三種:1、Set 2 、List 3、Map,下面進行具體介紹。

擴展鏈接:

主要內容:

1)手寫ArrayList

2)手寫單鏈表

3)手寫LinkedList

4)手寫HashMap

5)手寫HashSet

6)最新並發集合類

學習目標:

1. 掌握手寫ArrayList

2. 掌握手寫單鏈表

3. 掌握手寫LinkedList

4. 掌握手寫HashMap

5. 掌握手寫HashSet

6. 理解最新並發集合類底層原理

視頻課程小結:

01_集合提升訓練_手寫ArrayList_get_size_isEmpty_自定義異常

02_集合提升訓練_手寫ArrayList_構造方法_add

03_集合提升訓練_手寫ArrayList_toString_iterator

04_集合提升循環_手寫單鏈表_get

05_集合提升訓練_手寫單鏈表_add_remove_toString

06_集合提升訓練_手寫LinkedList

07_集合提升訓練_手寫LinkedList_添加內存分配圖

08_集合提升訓練_HashMap的原理和代碼準備

09_集合提升訓練_手寫HashMap的put

10_集合提升訓練_手寫HashMap的get_toString

11_集合提升訓練_手寫HashSet

12_集合提升訓練_新一代並發集合類

java中的集合分類

Java常用的集合有:List、

Set、

Map

Map屬於集合,Map的entrySet()的方法返回一個實現Map.Entry接口的對象集合。集合中每個對象都是一個特定的鍵/值對。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/195448.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 20:34
下一篇 2024-12-02 20:34

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論