日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JAVA集合框架專題

瀏覽:196日期:2022-08-31 08:19:42

一、Java集合框架概述

JAVA集合框架專題

集合可以看作是一種容器,用來存儲對象信息。所有集合類都位于java.util包下,但支持多線程的集合類位于java.util.concurrent包下。

數組與集合的區別如下:

(1)數組長度不可變化而且無法保存具有映射關系的數據;集合類用于保存數量不確定的數據,以及保存具有映射關系的數據。

(2)數組元素既可以是基本類型的值,也可以是對象;集合只能保存對象。

Java集合類主要由兩個根接口Collection和Map派生出來的,Collection派生出了三個子接口:List、Set、Queue(Java5新增的隊列),因此Java集合大致也可分成List、Set、Queue、Map四種接口體系,(注意:Map不是Collection的子接口)。

其中List代表了有序可重復集合,可直接根據元素的索引來訪問;Set代表無序不可重復集合,只能根據元素本身來訪問;Queue是隊列集合;Map代表的是存儲key-value對的集合,可根據元素的key來訪問value。

上圖中淡綠色背景覆蓋的是集合體系中常用的實現類,分別是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等實現類。

二、Java集合常見接口及實現類

1. Collection接口常見方法(來源于Java API)

2. Set集合

Set集合與Collection的方法相同,由于Set集合不允許存儲相同的元素,所以如果把兩個相同元素添加到同一個Set集合,則添加操作失敗,新元素不會被加入,add()方法返回false。為了幫助理解,請看下面代碼示例:

public class Test { public static void main(String[] args) { Set<String> set = new HashSet<String>(); set.add('hello world'); set.add('hello 冰湖一角'); set.add('hello 冰湖一角');//添加不進去 System.out.println('集合中元素個數:'+set.size()); System.out.println('集合中元素為:'+set.toString()); }}

運行結果如下:

集合中元素個數:2集合中元素為:[hello world, hello 冰湖一角]

分析:由于String類中重寫了hashCode()和equals()方法,用來比較指向的字符串對象所存儲的字符串是否相等。所以這里的第二個'hello 冰湖一角'是加不進去的。

下面著重介紹Set集合幾個常用實現類:

(1)HashSet類

HashSet是Set集合最常用實現類,是其經典實現。HashSet是按照hash算法來存儲元素的,因此具有很好的存取和查找性能。

HashSet具有如下特點:

不能保證元素的順序。 HashSet不是線程同步的,如果多線程操作HashSet集合,則應通過代碼來保證其同步。 集合元素值可以是null。

HashSet存儲原理如下:

當向HashSet集合存儲一個元素時,HashSet會調用該對象的hashCode()方法得到其hashCode值,然后根據hashCode值決定該對象的存儲位置。HashSet集合判斷兩個元素相等的標準是(1)兩個對象通過equals()方法比較返回true;(2)兩個對象的hashCode()方法返回值相等。因此,如果(1)和(2)有一個不滿足條件,則認為這兩個對象不相等,可以添加成功。如果兩個對象的hashCode()方法返回值相等,但是兩個對象通過equals()方法比較返回false,HashSet會以鏈式結構將兩個對象保存在同一位置,這將導致性能下降,因此在編碼時應避免出現這種情況。

HashSet查找原理如下:

基于HashSet以上的存儲原理,在查找元素時,HashSet先計算元素的HashCode值(也就是調用對象的hashCode方法的返回值),然后直接到hashCode值對應的位置去取出元素即可,這就是HashSet速度很快的原因。

重寫hashCode()方法的基本原則如下:

在程序運行過程中,同一個對象的hashCode()方法返回值應相同。 當兩個對象通過equals()方法比較返回true時,這兩個對象的hashCode()方法返回值應該相等。 對象中用作equals()方法比較標準的實例變量,都應該用于計算hashCode值。

(2)LinkedHashSet類

LinkedHashSet是HashSet的一個子類,具有HashSet的特性,也是根據元素的hashCode值來決定元素的存儲位置。但它使用鏈表維護元素的次序,元素的順序與添加順序一致。由于LinkedHashSet需要維護元素的插入順序,因此性能略低于HashSet,但在迭代訪問Set里的全部元素時由很好的性能。

(3)TreeSet類

TreeSet時SortedSet接口的實現類,TreeSet可以保證元素處于排序狀態,它采用紅黑樹的數據結構來存儲集合元素。TreeSet支持兩種排序方法:自然排序和定制排序,默認采用自然排序。

自然排序

TreeSet會調用集合元素的compareTo(Object obj)方法來比較元素的大小關系,然后將元素按照升序排列,這就是自然排序。如果試圖將一個對象添加到TreeSet集合中,則該對象必須實現Comparable接口,否則會拋出異常。當一個對象調用方法與另一個對象比較時,例如obj1.compareTo(obj2),如果該方法返回0,則兩個對象相等;如果返回一個正數,則obj1大于obj2;如果返回一個負數,則obj1小于obj2。

Java常用類中已經實現了Comparable接口的類有以下幾個:

BigDecimal、BigDecimal以及所有數值型對應的包裝類:按照它們對應的數值大小進行比較。 Charchter:按照字符的unicode值進行比較。 Boolean:true對應的包裝類實例大于false對應的包裝類實例。 String:按照字符串中的字符的unicode值進行比較。 Date、Time:后面的時間、日期比前面的時間、日期大。

對于TreeSet集合而言,它判斷兩個對象是否相等的標準是:兩個對象通過compareTo(Object obj)方法比較是否返回0,如果返回0則相等。

定制排序

想要實現定制排序,需要在創建TreeSet集合對象時,提供一個Comparator對象與該TreeSet集合關聯,由Comparator對象負責集合元素的排序邏輯。

綜上:自然排序實現的是Comparable接口,定制排序實現的是Comparator接口。(具體代碼實現會在后續章節中講解)

(4)EnumSet類

EnumSet是一個專為枚舉類設計的集合類,不允許添加null值。EnumSet的集合元素也是有序的,它以枚舉值在Enum類內的定義順序來決定集合元素的順序。

(5)各Set實現類的性能分析

HashSet的性能比TreeSet的性能好(特別是添加,查詢元素時),因為TreeSet需要額外的紅黑樹算法維護元素的次序,如果需要一個保持排序的Set時才用TreeSet,否則應該使用HashSet。

LinkedHashSet是HashSet的子類,由于需要鏈表維護元素的順序,所以插入和刪除操作比HashSet要慢,但遍歷比HashSet快。

EnumSet是所有Set實現類中性能最好的,但它只能 保存同一個枚舉類的枚舉值作為集合元素。

以上幾個Set實現類都是線程不安全的,如果多線程訪問,必須手動保證集合的同步性,這在后面的章節中會講到。

3. List集合

List集合代表一個有序、可重復集合,集合中每個元素都有其對應的順序索引。List集合默認按照元素的添加順序設置元素的索引,可以通過索引(類似數組的下標)來訪問指定位置的集合元素。

實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

(1)ArrayList

ArrayList是一個動態數組,也是我們最常用的集合,是List類的典型實現。它允許任何符合規則的元素插入甚至包括null。每一個ArrayList都有一個初始容量(10),該容量代表了數組的大小。隨著容器中的元素不斷增加,容器的大小也會隨著增加。在每次向容器中增加元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操作。所以如果我們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。

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

(2)LinkedList

LinkedList是List接口的另一個實現,除了可以根據索引訪問集合元素外,LinkedList還實現了Deque接口,可以當作雙端隊列來使用,也就是說,既可以當作“棧”使用,又可以當作隊列使用。

LinkedList的實現機制與ArrayList的實現機制完全不同,ArrayLiat內部以數組的形式保存集合的元素,所以隨機訪問集合元素有較好的性能;LinkedList內部以鏈表的形式保存集合中的元素,所以隨機訪問集合中的元素性能較差,但在插入刪除元素時有較好的性能。

(3)Vector

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

(4)Stack

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

(5)Iterator接口和ListIterator接口

Iterator是一個接口,它是集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API接口如下:

boolean hasNext():判斷集合里是否存在下一個元素。如果有,hasNext()方法返回 true。 Object next():返回集合里下一個元素。 void remove():刪除集合里上一次next方法返回的元素。

ListIterator接口繼承Iterator接口,提供了專門操作List的方法。ListIterator接口在Iterator接口的基礎上增加了以下幾個方法:

boolean hasPrevious():判斷集合里是否存在上一個元素。如果有,該方法返回 true。 Object previous():返回集合里上一個元素。 void add(Object o):在指定位置插入一個元素。

以上兩個接口相比較,不難發現,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator還可以通過add()方法向List集合中添加元素(Iterator只能刪除元素)。

4. Map集合

Map接口采用鍵值對Map<K,V>的存儲方式,保存具有映射關系的數據,因此,Map集合里保存兩組值,一組值用于保存Map里的key,另外一組值用于保存Map里的value,key和value可以是任意引用類型的數據。key值不允許重復,可以為null。如果添加key-value對時Map中已經有重復的key,則新添加的value會覆蓋該key原來對應的value。常用實現類有HashMap、LinkedHashMap、TreeMap等。

Map常見方法(來源于API)如下:

(1)HashMap與Hashtable

HashMap與Hashtable是Map接口的兩個典型實現,它們之間的關系完全類似于ArrayList與Vertor。HashTable是一個古老的Map實現類,它提供的方法比較繁瑣,目前基本不用了,HashMap與Hashtable主要存在以下兩個典型區別:

HashMap是線程不安全,HashTable是線程安全的。 HashMap可以使用null值最為key或value;Hashtable不允許使用null值作為key和value,如果把null放進HashTable中,將會發生空指針異常。

為了成功的在HashMap和Hashtable中存儲和獲取對象,用作key的對象必須實現hashCode()方法和equals()方法。

HashMap工作原理如下:

HashMap基于hashing原理,通過put()和get()方法存儲和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用建對象的hashCode()方法來計算hashCode值,然后找到bucket位置來儲存值對象。當獲取對象時,通過建對象的equals()方法找到正確的鍵值對,然后返回對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會存儲在鏈表的下一個節點中。

(2)LinkedHashMap實現類

LinkedHashMap使用雙向鏈表來維護key-value對的次序(其實只需要考慮key的次序即可),該鏈表負責維護Map的迭代順序,與插入順序一致,因此性能比HashMap低,但在迭代訪問Map里的全部元素時有較好的性能。

(3)Properties

Properties類時Hashtable類的子類,它相當于一個key、value都是String類型的Map,主要用于讀取配置文件。

(4)TreeMap實現類

TreeMap是SortedMap的實現類,是一個紅黑樹的數據結構,每個key-value對作為紅黑樹的一個節點。TreeMap存儲key-value對時,需要根據key對節點進行排序。TreeMap也有兩種排序方式:

自然排序:TreeMap的所有key必須實現Comparable接口,而且所有的key應該是同一個類的對象,否則會拋出ClassCastException。 定制排序:創建TreeMap時,傳入一個Comparator對象,該對象負責對TreeMap中的所有key進行排序。

(5)各Map實現類的性能分析

HashMap通常比Hashtable(古老的線程安全的集合)要快 TreeMap通常比HashMap、Hashtable要慢,因為TreeMap底層采用紅黑樹來管理key-value。 LinkedHashMap比HashMap慢一點,因為它需要維護鏈表來爆出key-value的插入順序。

以上就是JAVA集合框架專題的詳細內容,更多關于JAVA集合框架的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本国产一区| 国产69精品久久| 国产三级一区| 日韩av网站免费在线| 欧美永久精品| 国产精品亚洲欧美一级在线| 国产精品成人**免费视频 | av一区在线| 亚洲国产一区二区三区在线播放| 久久视频一区| 美女久久网站| 久久成人av| 久久精选视频| 亚洲视频国产| 精品一区二区三区中文字幕| 三级精品视频| 日韩一级欧洲| 国产日韩免费| 99精品美女| 亚洲视频二区| 麻豆国产精品视频| 激情自拍一区| 日韩高清电影一区| 特黄毛片在线观看| 亚洲免费中文| 蜜桃精品视频| 亚洲激情av| 欧美激情麻豆| 欧美特黄一区| 免费一级欧美片在线观看网站 | 一区二区三区四区日韩| 免费日韩一区二区三区| 久久高清免费| 日韩国产精品久久久久久亚洲| 91欧美在线| 免费日韩av| 久久精品三级| 日韩一区网站| 999精品色在线播放| 日本特黄久久久高潮| 国产不卡精品在线| 中文字幕一区二区av| 日韩在线观看| 日韩高清欧美激情| 亚洲欧美伊人| 精品国产欧美| 日韩区一区二| 亚洲精品97| 精品久久不卡| 综合日韩在线| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美三区不卡| 蜜臀av免费一区二区三区| 国产精品最新自拍| 亚洲一区二区成人| 激情黄产视频在线免费观看| 亚洲三区欧美一区国产二区| 青青青免费在线视频| 亚洲18在线| 在线精品视频在线观看高清| 麻豆视频一区| 婷婷综合福利| 免费在线观看日韩欧美| 性欧美videohd高精| 国产探花在线精品一区二区| 亚洲综合二区| 亚洲四虎影院| 国产传媒在线观看| 国产精品久久久久久模特| 亚洲精品美女| 99在线精品免费视频九九视| 日韩精品不卡一区二区| 久久爱www.| 日本不卡视频一二三区| 影音先锋久久| 欧美色图一区| 欧美精品日日操| 国产不卡一区| 国产专区精品| 国产精品theporn| 日韩综合一区二区三区| 中文字幕一区日韩精品| 噜噜噜久久亚洲精品国产品小说| 国产中文一区| 亚洲五月婷婷| 国产精品av久久久久久麻豆网| 在线天堂资源www在线污| 精品国产网站| 国产一区国产二区国产三区| 国产精品v一区二区三区| 国产精品v亚洲精品v日韩精品| 欧美久久一区二区三区| 久久精品xxxxx| 国产精品久久久久久久久久白浆| 日韩激情一区二区| 日本精品另类| 国产精品一区2区3区| 国产精品久久久亚洲一区| 国产精品最新自拍| 麻豆精品蜜桃视频网站| 精品美女视频 | 欧美视频久久| 国产情侣一区在线| 91精品一区| 国产美女视频一区二区| 久久精品国产精品亚洲毛片| 精品视频高潮| 久久av影视| 日本免费一区二区三区四区| 欧美日韩精品免费观看视完整| 91一区二区三区四区| 久久久蜜桃一区二区人| 中国女人久久久| 日韩中文字幕在线一区| 久久精品国产99国产| 成人羞羞视频播放网站| 午夜日韩在线| 日韩二区在线观看| 精品99久久| 亚洲精品电影| 欧美亚洲二区| 欧美少妇精品| 99国产精品久久久久久久| 玖玖精品视频| 国产极品嫩模在线观看91精品| 国产精品原创| 日韩午夜免费| 国产欧美69| 亚洲福利久久| 青青国产精品| 日韩在线中文| 亚洲免费一区三区| 黄色网一区二区| 亚洲一区二区三区高清| 国产私拍福利精品视频二区| 97精品国产一区二区三区| 丝袜美腿一区二区三区| 欧美亚洲一级| 欧美a级一区| 国产九九精品| 欧美91视频| 国产精品亚洲产品| 亚洲性视频h| 国产精品一站二站| 欧美在线资源| 国产精品高潮呻吟久久久久| 亚洲高清激情| 国产精选久久| 亚洲中字黄色| 92国产精品| 国产日韩免费| 国产农村妇女精品一区二区| 国产精品一区二区三区美女 | 成人va天堂| 久久精品免费看| 久久aⅴ国产紧身牛仔裤| 精品视频久久| 综合激情网站| 日韩黄色大片| 国产精品v日韩精品v欧美精品网站 | 日韩精品亚洲专区在线观看| 日韩大片免费观看| 欧美日韩网址| 午夜在线一区二区| 天堂8中文在线最新版在线| 欧美一级二级三级视频| 亚洲欧美日本国产专区一区| 天堂а√在线最新版中文在线| 日韩精品导航| 免播放器亚洲| 久久婷婷激情| 麻豆精品在线播放| 蜜臀久久久99精品久久久久久| 日韩电影在线视频| 麻豆国产欧美一区二区三区 | 欧美精品中文字幕亚洲专区| 午夜国产一区二区| 欧美xxxx中国| 国产日韩中文在线中文字幕| 欧美综合国产| 激情综合在线| 久久婷婷av| 黄色欧美在线| 国产精品videossex| 欧美一级一区| 日韩高清欧美激情| 日韩高清在线观看一区二区| 另类亚洲自拍| 亚洲精品一区二区妖精| 亚洲va中文在线播放免费| 激情视频网站在线播放色 | 成人午夜毛片| 精品国产91| 精品淫伦v久久水蜜桃| 欧美成人一二区| 国产精品第一| 国产亚洲高清在线观看| 欧美精品中文字幕亚洲专区| 亚洲另类视频| 蜜臀av性久久久久蜜臀aⅴ流畅 |