A. java集合有哪些
集合類型主要有3種:set(集)、list(列表)和map(映射)。
1、List(有序、可重復)
List里存放的對象是有序的,同時也是可以重復的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。因為往list集合里插入或刪除數據時,會伴隨著後面數據的移動,所有插入刪除數據速度慢。
2、Set(無序、不能重復)
Set里存放的對象是無序,不能重復的,集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中。
3、Map(鍵值對、鍵唯一、值不唯一)
Map集合中存儲的是鍵值對,鍵不能重復,值可以重復。根據鍵得到值,對map集合遍歷時先得到鍵的set集合,對set集合進行遍歷,得到相應的值。
(1)集合類有哪些數據結構擴展閱讀:
JAVA集合類型四種常見輸出方式:
1、Iterator:迭代輸出,是使用最多的輸出方式。
2、ListIterator:是Iterator的子介面,專門用於輸出List中的內盯扒亂容。
3、foreach輸出:JDK1.5之後提供的新功凱檔能,可以輸出數組或集合。
4、for循環。
代碼示例如下此困:
for的形式:for(inti=0;i<arr.size();i++){...}
foreach的形式:for(inti:arr){...}
iterator的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}
參考資料來源:網路:java集合類
B. 數據結構都有哪些結構
常用數據結構
數組
(Array)
在程序設計中,為了處理方便,
把具有相同類型的若干變數按有序的形式組織起來。這些按序排列的同類數據元素的集合稱為數組。在C語言中,
數組屬於構造數據類型。一個數組可以分解為多個數組元素,這些數組元素可以是基本數據類型或是構造類型。因此按數組元素的類型不同,數組又可分為數值數組、字元數組、指針數組、結構數組等各種類別。
棧
(Stack)
是只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。
隊列
(Queue)
一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空隊列。
鏈表
(Linked
List)
是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。
樹
(Tree)
是包含n(n>0)個結點的有窮集合K,且在K中定義了一個關系N,N滿足
以下條件:
(1)有且僅有一個結點
k0,他對於關系N來說沒有前驅,稱K0為樹的根結點。簡稱為根(root)。
(2)除K0外,k中的每個結點,對於關系N來說有且僅有一個前驅。
(3)K中各結點,對關系N來說可以有m個後繼(m>=0)。
圖
(Graph)
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
堆
(Heap)
在計算機科學中,堆是一種特殊的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
散列表
(Hash)
若結構中存在關鍵字和K相等的記錄,則必定在f(K)的存儲位置上。由此,不需比較便可直接取得所查記錄。稱這個對應關系f為散列函數(Hash
function),按這個思想建立的表為散列表。
C. 常用的數據結構有哪些
數據元素相互之間的關系稱為結構。有四類基本結構:集合、線性結構、樹形結構、圖狀結構;
集合結構:除了同屬於一種類型外,別無其它關系
線性結構:元素之間存在一對一關系常見類型有: 數組,鏈表,隊列,棧,它們之間在操作上有所區別.例如:鏈表可在任意位置插入或刪除元素,而隊列在隊尾插入元素,隊頭刪除元素,棧只能在棧頂進行插入,刪除操作.
樹形結構:元素之間存在一對多關系,常見類型有:樹(有許多特例:二叉樹、平衡二叉樹、查找樹等)
圖形結構:元素之間存在多對多關系,圖形結構中每個結點的前驅結點數和後續結點多個數可以任意
D. 怎麼才能了解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類型的參數
E. 常用數據結構有哪些
集合。2.線性結構。3.樹形結構。4.圖狀結構;
1.集合
樹形結構是一層次的嵌套結構。 一個樹形結構的外層和內層有相似的結構余喚, 所以這種結構多可以遞歸的表示。經典數據結構中的各種樹狀圖是一種典型的樹形結構:一顆樹可以簡單的表示為根, 左子樹, 右子樹。 左子樹和右子樹又有自己的子樹。
4.圖狀結構
圖狀結構,簡稱「圖」,是一種復雜的數據結構。圖狀結構中,每個結點的前驅結點數和後續結點數可以任意多個。數據元素間的關系是任意的。其他數據結構(如樹、線性表等)都有明確的條件限制,而圖形結構中任意兩個數據元素間均可相關聯。
F. 常用數據結構有哪些
數據結構分為8類有:數組、棧、隊列、鏈表、樹、散列表、堆、圖。數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成 。
1、數組
數組是可以再內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素通過數組下標進行訪問,數組下標從0開始。例如下面這段代碼就是將數組的第一個元素賦值為 1。
2、棧
棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點是:先進後出,或者說是後進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。
3、隊列
隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端取出元素,也就是:先進先出。從一端放入元素的操作稱為入隊,取出元素為出隊。
4、鏈表
鏈表是物理存儲單元上非連續的、非順序的存儲結構,數據元素的邏輯順序是通過鏈表的指針地址實現,每個元素包含兩個結點,一個是存儲元素的數據域 (內存空間),另一個是指向下一個結點地址的指針域。根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等。
5、樹
樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合。把它叫做 「樹」 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。
6、散列表
散列表,也叫哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。
7、堆
堆是一種比較特殊的數據結構,可以被看做一棵樹的數組對象,具有以下的性質:堆中某個節點的值總是不大於或不小於其父節點的值;堆總是一棵完全二叉樹。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
8、圖
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
G. 數據結構都有哪些分類呢
集合。2.線性結構。3.樹形結構。4.圖狀結構;
1.集合
樹形結構是一層次的嵌套結構。 一個樹形結構的外層和內層有相似的結構, 所以這種結構多可以遞歸的表示。經典數據結構中的各種樹狀圖是一種典型的樹形結構:一顆樹可以簡單的表示為根, 左子樹, 右子樹。 左子樹和右子樹又有自己的子樹。
4.圖狀結構
圖狀結構,簡稱「圖」,是一種復雜的數據結構。圖狀結構中,每個結點的前驅結點數和後續結點數可以任意多個。數據元素間的關系是任意的。其他數據結構(如樹、線性表等)都有明確的條件限制,而圖形結構中任意兩個數據元素間均可相關聯。
H. 簡介redis之集合類型數據
在之前的文章中我們有提及string類型是通過底層的橋春SDS(簡單動態字元串)實現的,那麼其他呢?
除禪消碧了String類型外,list,set,sorted set,hash這四種都有兩種底層實現結構,通常情況我們稱這四種類型為集合類型, 特點是一個鍵對應了一個集合的數據 :
list由雙向鏈表和壓縮列表實現
hash由壓縮列表和哈希表實現
sorted set由跳錶和壓縮列表實現
set 由整數數組和哈希表實現
·1.壓縮列表在查找和更新的時間復雜度方面沒有很大的優勢,為什麼redis要把他作為底層數據結構?
2.集合數據的操作效率
list由雙向鏈表和壓縮列表實現
閱讀src/ziplist.h和src/ziplist.c我們驚奇的發現一件事情:
redis竟沒有提供一個結構體保存壓縮列表的信息,而是提供賀舉了一組宏來定義每個成員的地址
壓縮列表是一系列 特殊編碼的連續內存塊 組成的順序序列數據結構,可以包含任意多個節點(entry),每一個節點可以保存一個位元組數組或者一個整數值。
這個數據結構是不是乍一看很像數組,每一個元素entry保存了一個數據,和數組不同的是表頭有三個欄位:
1.zlbytes標識整個壓縮列表長度
2.zltail標識列表的偏移量,表尾點entryN距離壓縮列表起始地址的位元組數
3.zllen標識列表中entry個數
列表表尾還有一個zlend標識結束
那麼我們就可以快速定位第一個元素(zlbytes-10)和最後一個元素(zlbytes-1)了
ziplist的每個節點由3個部分組成:
1.prevlen表示前一個節點的長度
2.encoding表示節點的編碼格式
3.entry-data:壓縮後的數據
zpilist格式
<zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend>
zlbytes:ziplist占總位元組數
zltail:最後一個元素的偏移量,相當於ziplist的尾指針。
zllen:entry元素個數
zlend :ziplist結束標志位
entry:ziplist的各個節點
ziplist的entry 的格式:
<prevlen> <encoding><len> <entry-data>
prevlen :前一個元素的長度,相當於節點保存前一個元素的指針。
encoding: 記錄了當前節點保存的數據的類型以及當前節點長度,相當於節點保存後一個元素的指針。
len:自身長度
entry-data :經過壓縮後的數據
quciklist結構實現
其中節點實現
我們閱讀結構體發現雖然是quicklist但卻出現了很多關於ziplist的身影
首先ziplist的插入和刪除操作時間復雜度非常高(參考數組需要重新生成一個ziplist來作為更新後的list),當一個list非常大的且更新平凡就會帶來非常大的開銷。
所謂的quicklist就是把ziplist和普通的雙向鏈表解和,每個雙向節點保存一個ziplist,每個ziplist中存一批list數據,這樣可以避免大量鏈表指針操作帶來的內存開銷(即化整為零思想)
Redis對外暴露的list數據結構,其底層實現所依賴的內部數據結構就是quicklist。quicklist就是一個塊狀的雙向壓縮鏈表。
考慮到雙向鏈表在保存大量數據時需要更多額外內存保存指針並容易產生大量內存碎片,以及ziplist的插入刪除的高時間復雜度,兩個數據結構的缺陷會導致在數據量很大或插入刪除操作頻繁的極端情況時,性能極其低下。
Redis為了避免數據結構在極端情況下的低性能,將雙向鏈表和ziplist綜合起來,成為了較雙向鏈表及ziplist性能更加穩定的quicklist
1.壓縮列表在查找和更新的時間復雜度方面沒有很大的優勢,為什麼redis要把他作為底層數據結構?
list底層使用壓縮列表本質上是將所有元素緊挨著存儲,能節省空間避免內存碎片(內存空間不是硬碟空間是很昂貴的)
有序列表查找元素,只能遍歷查找,於是就出現了跳錶
skiplist節點結構體
也就是說跳錶在鏈表的基礎上增加了多級索引,通過索引位置的幾個跳轉,實現數據的快速定位
其中索引可以持續累加
整數數組是集合的底層實現之一,當一個集合只包含整數元素且數量不多,就會用該方式實現
2.集合數據的操作效率
I. Java中最常用的集合類框架
一、HashMap的概述
HashMap可以說是Java中最常用的集合類框架之一,是Java語言中非常典型的數據結構。
HashMap是基於哈希表的Map介面實現的,此實現提供所有可選的映射操作。南邵電腦培訓發現存儲的是對的映射,允許多個null值和一個null鍵。但此類不保證映射的順序,特別是它不保證該順序恆久不變。
除了HashMap是非同步以及允許使用null外,HashMap類與Hashtable大致相同。
此實現假定哈希函數將元素適當地分布在各桶之間,可為基本操作(get和put)提供穩定的性能。迭代collection視圖所需的時間與HashMap實例的「容量」(桶的數量)及其大小(鍵-值映射關系數)成比例。所以,如果迭代性能很重要,則不要將初始容量設置得太高(或將載入因子設置得太低)。
HashMap的實例有兩個參數影響其性能:初始容量和載入因子。容量是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。載入因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了載入因子與當前容量的乘積時,則要對該哈希表進行rehash操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。
通常,默認載入因子(0.75)在時間和空間成本沖行培上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數HashMap類的操作中,包括get和put操作,都反映了這一點)。在設置初始容量時應該考慮到映射中所需的條目數及其載入因子,以便最大限度地減少rehash操作次數。如果初始容量大於最大條目數除以載入因子,則不會發生rehash操作。
注意,此實現不是同步的。如果多個線程同時訪問一個HashMap實例,而其中至少一個線程從結構上修改了列表,那麼它必須保持外部同步。這通常是通過同步那些用來封裝列表的對象來實現的。但如果沒有這樣的對象存在,則應該使用{@linkCollections#synchronizedMapCollections.synchronizedMap}來進行「包裝」,該方法最好是在創建時完成,為了避免對映射進行意外的非同步操作。
Mapm=Collections.synchronizedMap(newHashMap(...));
二、構造函數
HashMap提供了三個構造函數:
HashMap():構造一個具有默認初始容量(16)和默認載入因子(0.75)的空HashMap。
HashMap(intinitialCapacity):構造一個帶指定初始容量和默認載入因子(0.75)的空HashMap。
HashMap(intinitialCapacity,floatloadFactor):構造一個帶指定初始容量和載入因子的空HashMap。
這里提到了兩個參數:初始容量,載入因散唯子。這兩個參數是影響HashMap性能的重要參數,其中容量表示哈希表中桶的數量,初始容量是創建哈希表時的容量,載入因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度,它帶念衡量的是一個散列表的空間的使用程度,負載因子越大表示散列表的裝填程度越高,反之愈小。對於使用鏈表法的散列表來說,查找一個元素的平均時間是O(1+a),因此如果負載因子越大,對空間的利用更充分,然而後果是查找效率的降低;如果負載因子太小,那麼散列表的數據將過於稀疏,對空間造成嚴重浪費。系統默認負載因子為0.75,一般情況下我們是無需修改的。
HashMap是一種支持快速存取的數據結構,要了解它的性能必須要了解它的數據結構。