真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java集合有哪些內(nèi)容?-創(chuàng)新互聯(lián)

今天我們就來簡單的了解下java中的集合,有了解過得朋友都知道,也都用過,比如說做常用的List,還有Set、Map,而且像List和Set都是用于存儲單列數(shù)據(jù)的集合,他們的父接口都是Conllection,List的特點(diǎn)是存儲的值是有序且允許重復(fù)的,Set的特點(diǎn)是存儲的元素是唯一、不可重復(fù)且無序的,而Map的特點(diǎn)則是用于存儲雙列數(shù)據(jù)的集合,存儲的數(shù)據(jù)時(shí)無序的,鍵不可以重復(fù),值可以重復(fù)。

10年積累的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有詔安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

接下來我們就把它們拆出來詳細(xì)的來聊一聊。

List接口(通常有些面試官會問這樣一個(gè)比較基礎(chǔ)的問題:List是接口還是類?大家覺得呢,有經(jīng)驗(yàn)的小伙伴肯定一下子就能回答出來,但是有一些剛開始學(xué)習(xí)的小白同學(xué)可能會有一些猶豫哦,那這次我都會給大家說說滴,小白同學(xué)看完以后有人再問你這樣的問題就不會再猶豫啦)

首先我們要明確:我們java中的集合分為單列集合和雙列集合,單列集合的頂級接口是:Conllection,雙列集合的頂級接口是:Map

而List就是屬于單列集合Conllection的子接口,List接口的實(shí)現(xiàn)類如下:(所以List是接口不是類哦,通過下面可以多了解了解List接口的實(shí)現(xiàn)類都有哪些):

1.ArrayList(List接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢,因?yàn)楸娝苤狝rrayList的底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,向ArrayList中加入元素add的時(shí)候,有可能會導(dǎo)致List的擴(kuò)容, 因?yàn)锳rrayList底層是數(shù)組結(jié)構(gòu),但數(shù)組不支持動態(tài)擴(kuò)容,所以ArrayList的擴(kuò)容機(jī)制就是再創(chuàng)建一個(gè)新數(shù)組,把就數(shù)組數(shù)據(jù)遷移到新數(shù)組,然后再加入新元素,這樣一個(gè)過程下來也就是造成ArrayList增加元素慢的核心原因了。

而ArrayList在刪除元素時(shí)底層是將刪除索引位置起到最后索引位置結(jié)束中所有的元素,一一向前復(fù)制一個(gè)索引位置,再將最后索引位置元素設(shè)置為null,簡單來說就是,假設(shè)我現(xiàn)在要刪除這個(gè)集合中0索引位置上的元素,我將0索引位置上面的元素刪除之后,并不是將這個(gè)位置的元素直接設(shè)置為null,而是后面1索引位置到最后索引位置上的所有元素都要走一個(gè)一一向前復(fù)制一個(gè)索引位置過程,直到最后一個(gè)索引元素向前復(fù)制結(jié)束之后,將末尾位置上空缺的元素復(fù)制為null,所以也就是說在刪除元素的時(shí)候會影響其他索引位置上的元素的位置,所以也會降低刪除元素的效率。

(ArrayList集合刪除元素之后其他索引位置上的元素移動位置的變化過程)

理解完增刪慢的原因,其實(shí)查詢快的原因大家就已經(jīng)很好理解了,ArrayList在查詢元素時(shí)底層是通過訪問數(shù)組元素方式進(jìn)行查詢。數(shù)組(Array)是一種線性表(線性表就是數(shù)據(jù)排成像一條線一樣的結(jié)構(gòu)。每個(gè)線性表上的數(shù)據(jù)最多只有前和后兩個(gè)方向)數(shù)據(jù)結(jié)構(gòu)。它用一組連續(xù)的內(nèi)存空間,來存儲一組具有相同類型的數(shù)據(jù)。并且聲明一個(gè)數(shù)組時(shí),會在內(nèi)存中申請一塊連續(xù)相鄰的內(nèi)存空間。當(dāng)要通過索引訪問數(shù)組元素時(shí),可通過數(shù)組地址值和偏移量,直接計(jì)算出要查找元素的內(nèi)存地址,所以數(shù)組支持通過索引直接訪問元素,效率非常高。數(shù)組中的元素都是有下標(biāo)的,所以根據(jù)下標(biāo)就可以很快的找到你要查詢的元素了(使用get()方法, 就可以直接取的是數(shù)組對應(yīng)下標(biāo)中的值)。

2.LinkedList(List接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢,增刪快

LinkedList之所以查詢慢是因?yàn)?,LinkedList底層是一個(gè)鏈表, 鏈表肯定沒有下標(biāo)的概念,所以他不能像ArrayList一樣,使用get()方法, 就可以直接取的是數(shù)組對應(yīng)下標(biāo)中的值,它只能是對總數(shù)遍歷,然后取循環(huán)下標(biāo)的值,所以如果LinkedList鏈表size越大,那么會使for循環(huán)的次數(shù)增多導(dǎo)致遍歷的時(shí)間也會越長,查詢也就慢了(但是如果大家在編碼過程中還是需要考慮使用LinkedList的話在查詢的時(shí)候可以使用getFirst()、getLast() 方法減少for循環(huán)的次數(shù)來相對增加查詢的速度)。

而LinkedList之所以增加元素時(shí)快主要是因?yàn)椋琇inkedList 使用add(E e)直接添加元素或者add(int index, E e)指定位置添加元素,這兩種方法插入元素,相對與ArrayList效率是較高的,因?yàn)锳rrayList增加元素的時(shí)候可能需要擴(kuò)容和元素的拷貝,增加了開銷,而LinkedList 是斷開指定位置的鏈接把新節(jié)點(diǎn)添加進(jìn)來即可,所以整個(gè)添加過程中,系統(tǒng)也只做了兩件事情,添加一個(gè)新的節(jié)點(diǎn),然后保存該節(jié)點(diǎn)和前節(jié)點(diǎn)的引用關(guān)系,簡單來說就是新增加了一個(gè)鏈接而已,所以效率高。

刪除元素的時(shí)候也是根據(jù)remove(Object o) 刪除元素或者remove(int index)刪除指定位置元素這兩種方法進(jìn)行元素的刪除,所以簡單來說刪除效率高主要是因?yàn)橹恍枰獎h除某個(gè)鏈接,再鏈接新的元素即可,不需要修改列表中剩余的元素。

3.Vector(List接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,正因?yàn)樗牡讓邮菙?shù)組所以他的特點(diǎn)跟ArrayList一樣是查詢快,增刪慢的特點(diǎn),這一點(diǎn)可以參考上面ArrayList的解釋。

Set接口也是單列集合Conllection的子接口,接下來我們就繼續(xù)看看他的實(shí)現(xiàn)類有哪些吧!

1.HashSet(Set接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是哈希表,它是基于 HashMap 實(shí)現(xiàn)的,底層采用 HashMap 來保存元素,HashSet就是為了提高查詢效率的,意思就是在查詢某個(gè)值是否存在的時(shí)候,ArrayList需要遍歷才能獲取到某個(gè)值的位置,而HashSet可以通過HashCode快速進(jìn)行定位,而且HashSet是根據(jù)哈希算法來進(jìn)行對象的存取的,存取速度很快,當(dāng)HashSet中元素的個(gè)數(shù)超出數(shù)組原本的大小,就會進(jìn)行擴(kuò)容,而哈希表其實(shí)主要依賴hashcode()和equals()這兩個(gè)方法。

簡單來講就是首先通過hashcode()來判斷hashcode值是否相同,如果相同的話就會執(zhí)行equals()來查看他們的返回值是否相同,如果返回true的話,就說明這兩個(gè)元素重復(fù),則不進(jìn)行添加,如果返回是false的話,就直接添加到集合當(dāng)中。如果hashcode值不相同就可以直接添加到集合當(dāng)中,以上就是針對于HashSet的特點(diǎn)的簡單介紹。

2.LinkedHashSet(Set接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是鏈表+哈希表,由鏈表保證元素的有序,由哈希表保證元素的唯一,LinkedHashSet是一個(gè)基于LinkedHashMap實(shí)現(xiàn)的有序去重集合列表,LinkedHashSet中的元素沒有重復(fù);LinkedHashSet中的元素有順序,維護(hù)了添加順序;LInkedHashSet可以存儲null值;這個(gè)容器不知道大家在平時(shí)的工作用的多嗎,反正我基本上沒有用過,所以就是就是我個(gè)人針對于他的特點(diǎn)做的簡單介紹。

3.TreeSet(Set接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹,特點(diǎn)是元素唯一,且有序,由自然排序和比較器排序來保證有序的特點(diǎn),根據(jù)返回值是否是0來判斷元素是否唯一。TreeSet是有序的Set集合,因此支持add、remove、get等方法,TreeSet不支持快速隨機(jī)遍歷,只能通過迭代器進(jìn)行遍歷,如果想把自定義類的對象存入TreeSet進(jìn)行排序, 那么必須實(shí)現(xiàn)Comparable接口,或者實(shí)現(xiàn)一個(gè)比較器,在類上implements Comparable,重寫compareTo()方法,在方法內(nèi)定義比較算法, 根據(jù)大小關(guān)系, 返回正數(shù)負(fù)數(shù)或零,在使用TreeSet存儲對象的時(shí)候, add()方法內(nèi)部就會自動調(diào)用compareTo()方法進(jìn)行比較, 根據(jù)比較結(jié)果使用二叉樹形式進(jìn)行存儲。

簡單寫了一個(gè)排序大家可以粗魯看看

這是排序的一個(gè)運(yùn)行結(jié)果圖,遍歷兩次是因?yàn)槭褂昧藘煞N不同的遍歷方式

接下來就該說說雙列集合Map了,大家可以看看他的實(shí)現(xiàn)類有哪些。

1.HashMap(Map接口的實(shí)現(xiàn)類):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表,基于哈希表的 Map 接口的實(shí)現(xiàn)。并允許使用 null 值和 null 鍵,是以 key-value 存儲形式存在,每一個(gè)鍵值對也叫做一個(gè)Entry,根據(jù)鍵的hashCode值存儲數(shù)據(jù),大多數(shù)情況下可以直接定位到它的值,鍵key為null的記錄至多只允許出現(xiàn)一條,值value為null的記錄可以有多條,HashMap 的實(shí)現(xiàn)不是同步的,這意味著它不是線程安全的,HashMap是由數(shù)組+鏈表+紅黑樹(JDK1.8后增加了紅黑樹部分,鏈表長度超過閾值(8)時(shí)會將鏈表轉(zhuǎn)換為紅黑樹)實(shí)現(xiàn)的。

對于HashMap經(jīng)常會有面試官問HashSet和HashMap的區(qū)別?其實(shí)針對于這個(gè)問題,大家通過上述HashSet的解釋也能總結(jié)出來了,相同點(diǎn):1.都是采用的Hash散列算法分配的數(shù)據(jù),2.都是線程不安全的,3.數(shù)據(jù)查詢是無序的;不同點(diǎn):1.繼承的父類不同 2.set的單鍵,而hashmap是可以存鍵值對 3.hashmap是可以存不同的value但是hashset不支持相同value數(shù)據(jù)。以上就是針對于HashMap特點(diǎn)的簡單介紹,如果大家想了解關(guān)于源碼的解釋可以自行學(xué)習(xí)了解,以上只是做一個(gè)簡單的入門了解。

2.LinkedHashMap(Map接口的實(shí)現(xiàn)類):LinkedHashMap繼承了HashMap類,默認(rèn)情況下會使用entryset來獲取的集合順序與節(jié)點(diǎn)的插入順序一致的。除去hashmap的邏輯之外,我們都知道,LinkedHashMap中還維護(hù)了一個(gè)雙向鏈表,當(dāng)新建待插入的Entry時(shí),我們要知道LinkedHashMap中的Entry類繼承了HashMap中的Node類,而entry中新加了兩個(gè)指針屬性分別是before、after,它們分別指向之前和之后插入的節(jié)點(diǎn)。

同時(shí)LinkedHashMap中多了3個(gè)參數(shù),head、tail,accessOrder,雙向鏈表默認(rèn)是按照插入的順序來進(jìn)行排列的,最先插入的節(jié)點(diǎn)(也就是指最老的節(jié)點(diǎn))為head,最新插入的節(jié)點(diǎn)為tail。accessOrder參數(shù)表示雙向列表的排列順序是按照節(jié)點(diǎn)的插入順序還是訪問順序,默認(rèn)是false即插入順序,true代表的是訪問順序。當(dāng)排列模式是按訪問順序時(shí),如果調(diào)用了get或put方法且key存在時(shí),會調(diào)用afterNodeAccess方法,將最近被訪問的節(jié)點(diǎn)移至雙向隊(duì)列的隊(duì)尾。其實(shí)最重要的一點(diǎn)我們要清楚LinkedHashMap通過特有底層雙向鏈表的支持,使得LinkedHashMap可以保存元素之間的順序,例如插入順序或者訪問順序,而HashMap因?yàn)闆]有雙向鏈表的支持,所以就不能保持這種順序,所以它的訪問就是隨機(jī)的了,和HashMap一樣,還是通過數(shù)組存儲元素的。

3.TreeMap(Map接口的實(shí)現(xiàn)類):它是一個(gè)有序的key-value集合,主要通過紅黑樹來實(shí)現(xiàn),它大的特點(diǎn)是遍歷時(shí)是有順序的,根據(jù)key的排序規(guī)則來。TreeMap繼承AbstractMap(由于TreeMap繼承于AbstractMap,所以它是一個(gè)Map,即一個(gè)key-value集合),實(shí)現(xiàn)NavigableMap、Cloneable、Serializable三個(gè)接口。

其中AbstractMap表明TreeMap為一個(gè)Map即支持key-value的集合, NavigableMap則意味著它支持一系列的導(dǎo)航方法(比如返回有序的key集合),具備針對給定搜索目標(biāo)返回最接近匹配項(xiàng)的導(dǎo)航方法 。而且由于它是基于紅黑樹,所以它包含幾個(gè)重要的成員變量:root(root 是紅黑數(shù)的根節(jié)點(diǎn))、size(是紅黑數(shù)中節(jié)點(diǎn)的個(gè)數(shù))、comparator (比較器,紅黑數(shù)排序時(shí),根據(jù)Entry中的key進(jìn)行排序)。當(dāng)然在面試過程中可能會有面試官問你這樣的問題,例如:TreeMap和HashMap的區(qū)別是什么?根據(jù)這個(gè)問題,可以給大家簡單總結(jié)一下。

相同點(diǎn):兩者均是線程不安全的;增刪改查操作的;兩者插入節(jié)點(diǎn)時(shí),key重復(fù)后都會覆蓋舊值。

不同點(diǎn):底層數(shù)據(jù)結(jié)構(gòu)不同。HashMap是基于數(shù)組+鏈表+紅黑樹的數(shù)據(jù)結(jié)構(gòu),TreeMap是基于紅黑樹的數(shù)據(jù)結(jié)構(gòu);HashMap是無序的,TreeMap是有序的;HashMap允許存儲null,TreeMap的鍵不允許存儲null,但是值可以為null;TreeMap要求key必須實(shí)現(xiàn)Comparable接口,或者初始化時(shí)傳入Comparator比較器。

好啦以上就是給大家簡單總結(jié)的java集合,希望對大家有點(diǎn)幫助哦!主要的幾張圖中都給大家反應(yīng)出來了具體java集合都有哪些,大家可以作為參考繼續(xù)學(xué)習(xí)哦!

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


當(dāng)前名稱:Java集合有哪些內(nèi)容?-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://weahome.cn/article/dgcoph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部