摘要:和的區(qū)別是非線程安全的,效率高是基于線程安全的,效率低底層基于鏈表實(shí)現(xiàn),鏈表內(nèi)存是散亂的,每一個(gè)元素存儲(chǔ)本身內(nèi)存地址的同時(shí)還存儲(chǔ)下一個(gè)元素的地址?;旧隙际且詾榛A(chǔ)。
什么是集合
Java是一門面向?qū)ο蟮恼Z(yǔ)言.
為了方便操作多個(gè)對(duì)象,那么我們就得把這多個(gè)對(duì)象存儲(chǔ)起來(lái)
想要存儲(chǔ)多個(gè)對(duì)象(變量),我們就需要一個(gè)容器
集合就是一個(gè)放數(shù)據(jù)的容器(集合類存放的都是對(duì)象的引用,而非對(duì)象本身)
Collection的由來(lái):
集合可以存儲(chǔ)多個(gè)元素,但我們對(duì)多個(gè)元素也有不同的需求
多個(gè)元素,元素之間不能重復(fù)的
多個(gè)元素,元素按某種規(guī)則排序的
針對(duì)不同的需求:java就提供了很多集合類,多個(gè)集合類的數(shù)據(jù)結(jié)構(gòu)不同。但是,結(jié)構(gòu)不重要,重要的是能夠存儲(chǔ)東西,能夠判斷,獲取
把集合共性的內(nèi)容不斷往上提取,最終形成集合的繼承體系---->Collection
Collection的繼承結(jié)構(gòu)常見(jiàn)問(wèn)題:
數(shù)組和集合的區(qū)別1:長(zhǎng)度的區(qū)別
數(shù)組的長(zhǎng)度固定
集合的長(zhǎng)度可變
2:內(nèi)容不容
數(shù)組存儲(chǔ)的是同一種類型的元素
集合可以存儲(chǔ)不同類型的元素(但是一般我們不這樣干..)
3:元素的數(shù)據(jù)類型
數(shù)組可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用類型
集合只能存儲(chǔ)引用類型(你存儲(chǔ)的是簡(jiǎn)單的int,它會(huì)自動(dòng)裝箱成Integer)
什么時(shí)候使用集合,什么時(shí)候使用數(shù)組?使用數(shù)組的缺陷:
數(shù)組長(zhǎng)度設(shè)置過(guò)小就造成溢出
如果數(shù)組的長(zhǎng)度設(shè)置過(guò)大,就造成內(nèi)存空間浪費(fèi)(因?yàn)閿?shù)組的長(zhǎng)度是固定的)
為什么還要使用數(shù)組呢 ?集合的底層都是通過(guò)數(shù)組來(lái)實(shí)現(xiàn)的
2.數(shù)組的效率更高.例如:IO流 byte[] arr=new byte[1024];就是使用的數(shù)組
怎么選擇集合?需要唯一嗎?
需要:Set 需要制定順序嗎? 需要:TreeSet 不需要:HashSet 但是想要一個(gè)和存儲(chǔ)一致的順序(有序):LinkedHashSet 不需要:List 需要頻繁增加或者刪除元素嗎? 需要:LinkedList 不需要:ArrayList
前綴名就是該集合的數(shù)據(jù)結(jié)構(gòu).后綴名就是該集合所屬的體系
看到array:就要想到數(shù)組,就要想到查詢快,有角標(biāo) 看到link:就要想到鏈表,就要想到增刪快,就要想到 add get remove+first last 方法 看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆蓋hashcode方法和equals方法 看到tree:就要想到二叉樹(shù),就要想到排序,就要想到兩個(gè)接口Comparable和ComparatorCollection的常見(jiàn)方法 數(shù)組轉(zhuǎn)換成集合 集合轉(zhuǎn)換成數(shù)組 Collection的主要子類List和Set
List常見(jiàn)方法:
List:有順序的collection,并且可以包含重復(fù)元素。
├ArrayList - 數(shù)組結(jié)構(gòu),查詢?cè)乜?添加慢(一般情況下),線程不安全,效率高 └Vector - 數(shù)組結(jié)構(gòu),查詢?cè)乜?線程安全.效率比ArrayList低 - 現(xiàn)在幾乎不適用 ├LinkedList - 鏈表結(jié)構(gòu),添加元素快,查詢慢,線程不安全,效率高
細(xì)節(jié)說(shuō)明:
LinkedList不同于前面兩種List,它不是基于數(shù)組的,所以不受數(shù)組性能的限制。
他的每一個(gè)節(jié)點(diǎn)(Node)都包含了三方面的內(nèi)容:
1.節(jié)點(diǎn)本身的數(shù)據(jù): E item;
2.上一個(gè)節(jié)點(diǎn)的信息:Node
3.下一個(gè)節(jié)點(diǎn)的信息:Node
所以當(dāng)對(duì)LinkedList做添加,刪除動(dòng)作的時(shí)候就不用像基于數(shù)組的ArrayList一樣,必須進(jìn)行大量的數(shù)據(jù)移動(dòng)。只要更改nextNode的相關(guān)信息就可以實(shí)現(xiàn)了,這是LinkedList的優(yōu)勢(shì)。 所以LinkedList集合添加數(shù)組效率高
LinkedList的常用方法:
注意事項(xiàng):LinkedList在內(nèi)存中不是連續(xù)的,ArrayList在內(nèi)存中是連續(xù)的.
List集合的遍歷方式:
方式一:迭代器模式,假設(shè)集合名為(al)
Iteratoriterator = al.iterator(); while (iterator.hasNext()) { String s = iterator.next(); System.out.println(s); }
擴(kuò)展:使用ListIterator方式進(jìn)行遍歷,可以在遍歷的過(guò)程中對(duì)集合進(jìn)行增刪改查,只有l(wèi)ist有這種方式,使用ListIterator方式還能進(jìn)行反向遍歷
方式二:增強(qiáng)for
for (String s : al) { System.out.println(s); }
方式三:普通for (List特有)
for (int i = 0; iList總結(jié): 基于Array的List(Vector,ArrayList)適合查詢,而LinkedList 適合添加,刪除操作
所有的List中可以有null元素,例如[ tom,null,1 ]
所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]
所有的List中只能容納單個(gè)不同類型的對(duì)象組成的表(單列集合),而不是Key-Value鍵值對(duì)。例如:[ tom,1,c ]
List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下 >標(biāo))來(lái)訪問(wèn)List中的元素,這類似于Java的數(shù)組。
ArrayList和Vector的區(qū)別:ArrayList是非線程安全的,效率高;Vector是基于線程安全的,效率低
LinkedList:底層基于鏈表實(shí)現(xiàn),鏈表內(nèi)存是散亂的,每一個(gè)元素存儲(chǔ)本身內(nèi)存地址的同時(shí)還存儲(chǔ)下一個(gè)元素的地址。鏈表增刪快,查找慢
List接口有三個(gè)常用實(shí)現(xiàn)類:LinkedList,ArrayList,Vector
Set :不包含重復(fù)元素的Collection。├HashSet (數(shù)據(jù)結(jié)構(gòu)是哈希表) HashSet 怎么確認(rèn)唯一? 首先判斷的是兩個(gè)元素的哈希值確認(rèn)元素是否相同,如果相同,再判斷兩個(gè)對(duì)象的內(nèi)容是否相同 判斷哈希值是否相同,即是判斷hashCode方法,判斷內(nèi)容是否相同,即是判斷equals方法 注意:如果哈希值不同,是不需要判斷equals方法的 如果兩個(gè)哈希值相同會(huì)造成哈希沖突,一般情況下,哈希值都是不會(huì)沖突的(這里不做詳細(xì)介紹) 記住:如果元素要存儲(chǔ)到HashSet集合中,必須覆蓋hashCode和equals方法. 一般情況下,如果定義的類會(huì)產(chǎn)生很多對(duì)象,比如人,學(xué)生,書,通常都是覆蓋hashCode和equals方法.建立對(duì)象是否相同的依據(jù). └LinkedhashSet (HashSet的一個(gè)子類,一個(gè)鏈表) LinkedhashSet可以保證元素的有序! └TreesSet (排序,不重復(fù),無(wú)索引)Set的遍歷方式:方式一:迭代器
Setset = new HashSet (); Iterator it = set.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); } 方式二:增強(qiáng)for
for (String str : set) { System.out.println(str); }Set知識(shí)點(diǎn)講解雖然Set同List都實(shí)現(xiàn)了Collection接口,但是他們的實(shí)現(xiàn)方式卻大不一樣。List基本上都是以Array為基礎(chǔ)。但是Set則是在 HashMap的基礎(chǔ)上來(lái)實(shí)現(xiàn)的,這個(gè)就是Set和List的根本區(qū)別。HashSet的存儲(chǔ)方式是把HashMap中的Key作為Set的對(duì)應(yīng)存儲(chǔ)項(xiàng)。
這個(gè)也是為什么在Set中不能像在List中一樣有重復(fù)的項(xiàng)的根本原因,因?yàn)镠ashMap的key是不能有重復(fù)的。
HashSet中的元素是不能重復(fù)的,如果使用add(Object obj)方法添加已經(jīng)存在的對(duì)象,則會(huì)覆蓋前面的對(duì)象
HashSet實(shí)現(xiàn)的基礎(chǔ)是Map(HashMap)
HashSet是一種不包含重復(fù)的元素的無(wú)序Collection。
元素?zé)o放入順序,元素不可重復(fù)(注意:元素雖然無(wú)放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實(shí)是固定的)
集合排序方式一(讓Bean類實(shí)現(xiàn)Comparable接口重寫compareTo方法) 自然排序
返回值 0 , 不存
正數(shù) , 右邊 負(fù)數(shù) , 左邊方式二(自定義一個(gè)類實(shí)現(xiàn)Comparator接口重寫compare方法,通過(guò)構(gòu)造方法傳入自定義類的對(duì)象)比較器排序
比如:String ,Integer 對(duì)象 ,實(shí)現(xiàn)特殊的排序需求, 需要傳遞比較器的子類對(duì)象 .
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69211.html
摘要:而在集合中,值僅僅是一個(gè)對(duì)象罷了該對(duì)象對(duì)本身而言是無(wú)用的。將這篇文章作為集合的總結(jié)篇,但覺(jué)得沒(méi)什么好寫就回答一些面試題去了,找了一會(huì)面試題又覺(jué)得不夠系統(tǒng)。 前言 聲明,本文用的是jdk1.8 花了一個(gè)星期,把Java容器核心的知識(shí)過(guò)了一遍,感覺(jué)集合已經(jīng)無(wú)所畏懼了?。?哈哈哈....),現(xiàn)在來(lái)總結(jié)一下吧~~ 回顧目錄: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 Ma...
摘要:集合的種類常見(jiàn)的集合類分如下幾個(gè)種類詳解接口是和接口的父接口,也是集合類除外根接口。接口集合中元素的存放特點(diǎn)是元素有序,同一元素可重復(fù)??偨Y(jié)中集合是一個(gè)非常重要的知識(shí)點(diǎn),在實(shí)際運(yùn)用中也是常常會(huì)使用到。 集合的種類 常見(jiàn)的集合類分如下幾個(gè)種類: Collection - List - ArrayList - LinkedList - Set - HashSet...
摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器是一個(gè)專為枚舉設(shè)計(jì)的集合類,中所有值都必須是指定枚舉類型的枚舉值,該枚舉類型在創(chuàng)建時(shí)顯式或隱性的指定。集合不容許加入元素。 Java知識(shí)點(diǎn)總結(jié)(Java容器-EnumSet) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection, JavaSet] EnumSet EnumSet是一個(gè)專為枚舉設(shè)計(jì)的集合類 ,EnumSet中...
摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器函數(shù)庫(kù)是包下的一些接口和類,類是用來(lái)產(chǎn)生對(duì)象存放數(shù)據(jù)用的,而接口是訪問(wèn)數(shù)據(jù)的方式。底層也是數(shù)組實(shí)現(xiàn),線程安全,效率低效率高,線程不安全。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Collection) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection] [toc] Collection Collection函數(shù)庫(kù)是java.uti...
閱讀 3619·2021-11-15 11:38
閱讀 2813·2021-11-11 16:55
閱讀 2567·2021-11-08 13:22
閱讀 2641·2021-11-02 14:45
閱讀 1325·2021-09-28 09:35
閱讀 2609·2021-09-10 10:50
閱讀 476·2019-08-30 15:44
閱讀 2788·2019-08-29 17:06