java集合類(lèi)主要負(fù)責(zé)保存、盛裝其他數(shù)據(jù),,因此集合類(lèi)也稱(chēng)容器類(lèi),。java集合類(lèi)分為:set、list,、map,、queue四大體系。其中set代表無(wú)序,、不可重復(fù)的集合,;list代表有序,、可重復(fù)的集合。map代表具有映射關(guān)系的集合,;queue代表隊(duì)列集合,。 java集合類(lèi)主要由兩個(gè)接口派生:Collection和Map,是集合框架的根接口,。下面是其接口,、子接口和實(shí)現(xiàn)類(lèi)的繼承樹(shù)。 下面就一一介紹四大接口及其實(shí)現(xiàn)類(lèi),。 Set接口,。set集合不允許包含相同的元素。set判斷兩個(gè)對(duì)象是否相同是根據(jù)equals方法,。如果兩個(gè)對(duì)象用equals方法返回的是true,,set不會(huì)接受這兩個(gè)對(duì)象。 HashSet是set接口的典型實(shí)現(xiàn),,HashSet按hash算法來(lái)存儲(chǔ)集合中的元素,。因此具有很好的存儲(chǔ)和查找性能。HashSet判斷兩個(gè)元素的標(biāo)準(zhǔn)是兩個(gè)元素的equals方法比較相等,,同時(shí)兩個(gè)對(duì)象的hasCode()方法返回值也相等,。HashSet可以保存null元素。 List集合代表一個(gè)有序集合,。集合中的每個(gè)元素都有其對(duì)應(yīng)的順序索引,。Arraylist和vector是list接口的兩個(gè)典型實(shí)現(xiàn)。他們之間的顯著區(qū)別就是:vector是線性安全的,,而arraylist不是,。它們兩個(gè)都是基于數(shù)組實(shí)現(xiàn)的list類(lèi)。List還有一個(gè)基于鏈表實(shí)現(xiàn)的LinkedList類(lèi),。當(dāng)插入,、刪除元素的速度非常快,。這個(gè)類(lèi)比較特殊,,功能也特別多,即實(shí)現(xiàn)了List接口,,也實(shí)現(xiàn)了Dueue接口(雙向隊(duì)列),。可以當(dāng)成雙向隊(duì)列使用,,也可以當(dāng)成棧使用,。 Queue用于模擬隊(duì)列的數(shù)據(jù)結(jié)構(gòu)?!緅ava集合總結(jié)3篇】java集合總結(jié)3篇,。LinkedList和ArrayDueue是其兩個(gè)比較常用的實(shí)現(xiàn)類(lèi),。 Map用于保存具有映射關(guān)系的數(shù)據(jù)。Map接口有如下幾個(gè)常用的實(shí)現(xiàn)類(lèi):HashMap,、HashTable,、TreeMap。TreeMap是基于紅黑樹(shù)對(duì)TreeMap中所有key進(jìn)行排序,。HashMap和HashTable主要區(qū)別有兩點(diǎn):1,、Hashtable是線性安全的,因此性能差些,。2,、HashMap可以使用null作為key或者value。 集合類(lèi)還提供了一個(gè)工具類(lèi)Collections,。主要用于查找,、替換、同步控制,、設(shè)置不可變集合,。 上面是對(duì)java集合類(lèi)的一般概述,下面就set,、list,、map三者之間的關(guān)系進(jìn)行剖析。 Set與Map的關(guān)系,。Map集合中所有key集中起來(lái),,就組成了一個(gè)set集合。所以Map集合提供Set Map與List的關(guān)系,。把Map的key-value分開(kāi)來(lái)看,從另一個(gè)角度看,,就可以把Map與List統(tǒng)一起來(lái),。 Map集合是一個(gè)關(guān)聯(lián)數(shù)組,key可以組成Set集合,,Map中的value可以重復(fù),,所以這些value可以組成一個(gè)List集合。但是需要注意的是,,實(shí)質(zhì)Map的values方法并未返回一個(gè)List集合,。而是返回一個(gè)不存儲(chǔ)元素的Collection集合,換一種角度來(lái)看對(duì)List集合,,它也包含了兩組值,,其中一組就是虛擬的int類(lèi)型的索引,另一組就是list集合元素,,從這個(gè)意思上看,,List就相當(dāng)于所有key都是int型的Map。 下面講解幾個(gè)相似類(lèi)之間的差異,?!緅ava集合總結(jié)3篇】文章java集合總結(jié)3篇出自http://www./article/1427450554237.html,轉(zhuǎn)載請(qǐng)保留此鏈接,!,。 ArrayList和LinkedList。ArrayList是一種順序存儲(chǔ)的線性表,,其底層是采用數(shù)組實(shí)現(xiàn)的,,而LinkedList是鏈?zhǔn)酱鎯?chǔ)的線性表。其本質(zhì)就是一個(gè)雙向鏈表,。對(duì)于隨機(jī)存儲(chǔ)比較頻繁的元素操作應(yīng)選用ArrayList,,對(duì)于經(jīng)常需要增加、刪除元素應(yīng)該選用LinkedList,。但總的來(lái)說(shuō)ArrayList的總體性能還是優(yōu)于LinkedList,。 HashSet與HashMap的性能選項(xiàng)。主要有兩個(gè)方面:容量和負(fù)載因子(尺寸/容量),。較低負(fù)載因子會(huì)增加查詢(xún)數(shù)據(jù)的性能,,但是會(huì)降低hash表所占的內(nèi)存開(kāi)銷(xiāo)。較高負(fù)載因子則反之,,一般對(duì)數(shù)據(jù)的查詢(xún)比較頻繁,,所以一般情況下初始容量應(yīng)該大一點(diǎn),但也不能太大,否則浪費(fèi)內(nèi)存空間,。 總結(jié)二: Set:不區(qū)分元素的順序,,不允許出現(xiàn)重復(fù)的值 list:區(qū)分元素的順序,且允許出現(xiàn)重復(fù)的值 map:采用key——values的,,不允許有重復(fù)的鍵,,每個(gè)鍵最多對(duì)應(yīng)一個(gè)值 java集合只能保存引用類(lèi)型的數(shù)據(jù),是對(duì)象的引用 Collection接口描述set和list集合類(lèi)型的根接口 相關(guān)方法: add()如果增加重復(fù)元素,,則增加失敗,,返回false contains()判斷是否包含有某個(gè)元素 iterator()返回成一個(gè)迭代器 List可以對(duì)元素的插入位置進(jìn)行精確控制,根據(jù)元素索引訪問(wèn)元素等功能 set(index,,elemetn)修改指定索引下的元素 Map關(guān)系集的形式查看某個(gè)映射的內(nèi)容 put(objectkey,,objectvalues)增加一個(gè)新的值 get(objectkey)查找key上面的值 SetkeySet()將所有的key返回到一個(gè)set中 Collectionvalues()將所有的值返回到一個(gè)collection集合中 Collection——set——hashset/treeset Collection--list——Arraylist/vector——Stack(棧) Map——hashmap/Treemap/hashtable——properties StringTokenizer——Enumeration(不是很常用) ArrayList類(lèi)實(shí)現(xiàn)了list接口,用于表述長(zhǎng)度可度的數(shù)組列表 他允許取值為null,,除實(shí)現(xiàn)了list接口的所有功能外,,還有以下方法 ArrayList()創(chuàng)建一個(gè)容量為10的null的列表 ArrayList()創(chuàng)建一個(gè)指定長(zhǎng)度的null的列表 ensureCapacity(intminCapacity)增加此ArrayList實(shí)例的容量,以確保它至少能夠容納最小容量參數(shù)所指定的元素?cái)?shù),。 trimToSize()將此ArrayList實(shí)例的容量調(diào)整為列表的當(dāng)前大?。ㄒ簿褪钦f(shuō),出除后面為null的值) 相關(guān)實(shí)例請(qǐng)查看:http://hi./space-447825-do-blog-id-16964.html Vector也實(shí)現(xiàn)了list接口,,其描述的也是可變長(zhǎng)度的對(duì)象數(shù)組 是同步(線程安全的),,運(yùn)行效率要低一些,主要用于多線程環(huán)境中,,而arryalist是不同步的,,適合在單純種環(huán)境中使用 vector()創(chuàng)建一個(gè)長(zhǎng)度為10的vector容器 elementAt(intindex)得到指定的值 addElement(Objectojb)增加值 removeElementAt(intindex)移除指定的值 insertElecentAt(Eobj,index)在指定位置查入相關(guān)的值 removeElement(objectobj)刪除值,如果有重復(fù)的只刪除第一次出現(xiàn)的 Object[]toArray()將當(dāng)前集合中的元素全部返回到一個(gè)數(shù)組中 相關(guān)實(shí)例請(qǐng)查看:http://hi./space-447825-do-blog-id-16965.html Stack繼承了vector,,對(duì)應(yīng)了數(shù)據(jù)結(jié)構(gòu)中的“后進(jìn)先出”存儲(chǔ)和操作數(shù)據(jù)結(jié)象棧 Stack()創(chuàng)建一個(gè)空的棧 push()在當(dāng)前棧中壓入一個(gè)數(shù)據(jù),,把項(xiàng)壓入堆棧頂部。 pop()移除堆棧頂部的對(duì)象,,并作為此函數(shù)的值返回該對(duì)象,。 peek()查看堆棧頂部的對(duì)象,但不從堆棧中移除它,。 clear()清空棧 search(objecto)查看棧中的位置,,返回最進(jìn)的一個(gè)。以1為基數(shù) 相關(guān)實(shí)例請(qǐng)查看:http://hi./space-447825-do-blog-id-16966.html Iterator接口描述的是以統(tǒng)一方式對(duì)各種集合元素遍歷/迭代工具,,也稱(chēng)"迭代器" 允許在遍歷過(guò)程中移除集合中的元素 hasNext()如果仍有元素可以迭代,則返回true next()返回迭代的下一個(gè)元素 remove()從迭代器指向的collection中移除迭代器返回的最后一個(gè)元素 相關(guān)實(shí)例請(qǐng)查看:http://hi./space-447825-do-blog-id-16967.html HashSet類(lèi)實(shí)現(xiàn)了set接口,,描述典型的set集合結(jié)構(gòu) 不允許出現(xiàn)重復(fù)元素,,不保證集合中元素的序 允許包含值為null的元素,但最多只能有一個(gè),, 相關(guān)實(shí)例請(qǐng)查看http://hi./space-447825-do-blog-id-16968.html TreeSet類(lèi)也實(shí)現(xiàn)了Set,,它描述的是set的一種變體——可以實(shí)現(xiàn)排序功能的集合 將對(duì)象元素添加到TreeSet集中時(shí)會(huì)自動(dòng)按照某種比較規(guī)則將其插入到有序的對(duì)象序列中 以保證TreeSet集合元素組成的對(duì)象序列時(shí)刻按照“升序”排列 相關(guān)實(shí)例請(qǐng)看:http://hi./space-447825-do-blog-id-16969.html Comparable接口中定義的compareTo()方法,,實(shí)現(xiàn)對(duì)整體排序所需的比較邏輯 排序稱(chēng)為自然排序,和自然比較 如果重寫(xiě)了,,compareTo()那么要保證equals()保持一致 相關(guān)實(shí)例請(qǐng)查看:http://hi./space-447825-do-blog-id-16971.html HashMap實(shí)現(xiàn)了Map接口,,基于哈希表的實(shí)現(xiàn)了前述的映射集合結(jié)構(gòu) 不保證其中元素的先后順序,并且允許null值和null鍵 當(dāng)集合中不存在當(dāng)前檢索的,,get()返回的是空,,而不會(huì)報(bào)錯(cuò) 影響hashMap性能的兩個(gè)參數(shù):初始容量和加載因子 相關(guān)實(shí)例請(qǐng)看:http://hi./space-447825-do-blog-id-16972.html Hashtable也是采用鍵和值,鍵和值不允許為null,,是同步的,,即線程安全的,效率相對(duì)要低一些,,用于多線程,,用法與hashmap完全一樣 Enumeration接口:作用與iterator接口類(lèi)似,但只提供遍歷vector和hashtable(及子類(lèi)properties)且不支持集合元素的移除操作些接口不是很常用,,這里就不給實(shí)例了 Collections定義了多種集合操作的方法,,實(shí)現(xiàn)對(duì)集合元素排序,取極值,,批是拷貝,,集合結(jié)構(gòu)轉(zhuǎn)換,循環(huán)移位以及匹配檢查等功能 相關(guān)方法: sort(List reverse(Listlist)反轉(zhuǎn)指定列表中元素的順序,。 shuffle(Listlist)使用默認(rèn)隨機(jī)源對(duì)指定列表進(jìn)行置換。 copy(Listdest,Listsrc)將所有元素從一個(gè)列表復(fù)制到另一個(gè)列表,。 list(Enumeration frequency(Collectionc,Objecto)返回指定collection中等于指定對(duì)象的元素?cái)?shù) max(Collectioncoll)根據(jù)指定比較器產(chǎn)生的順序,返回給定collection的最大元素 rotate(Listlist,intdistance)根據(jù)指定的距離輪換指定列表中的元素,。 相關(guān)實(shí)例請(qǐng)查看:http://hi./space-447825-do-blog-id-16973.html Arrays類(lèi)定義了多種數(shù)組操作方法,,實(shí)現(xiàn)了對(duì)數(shù)組元素排序,填充,,轉(zhuǎn)換為列表或字符串形式,、增強(qiáng)的檢索和深度比較等功能 asList()返回一個(gè)受指定數(shù)組支持的固定大小的列表 sort()對(duì)指定的byte型數(shù)組按數(shù)字升序進(jìn)行排序 binarySearch(int[]a,intkey)使用二分搜索法來(lái)搜索指定的int型數(shù)組,以獲得指定的值,。 toString(Object[]a)返回指定數(shù)組內(nèi)容的字符串表示形式,。 總結(jié)三: 一、數(shù)組,、集合 數(shù)組,、集合:都是一種容器,用一個(gè)對(duì)象管理多個(gè)對(duì)象; 數(shù)組:不能自動(dòng)增長(zhǎng),;只能存放同類(lèi)型的元素 集合:能自動(dòng)擴(kuò)容,;部分集合允許存放不同類(lèi)型的元素; 二,、學(xué)習(xí)這些集合類(lèi)要掌握哪些東西: 1)怎樣得到(選擇)集合對(duì)象,; 2)怎樣添加元素 3)怎樣刪除元素 4)怎樣循環(huán)遍歷沒(méi)一個(gè)元素 三、list,、set,、map collection:父接口; Set:接口---一個(gè)實(shí)現(xiàn)類(lèi):HashSet List:接口---三個(gè)實(shí)現(xiàn)類(lèi):LinkedList,Vector,ArrayList SortedSet:接口---實(shí)現(xiàn)類(lèi):TreeSet 1,、List: List:有序列表,,允許存放重復(fù)的元素; 實(shí)現(xiàn)類(lèi): ArrayList:數(shù)組實(shí)現(xiàn),,查詢(xún)快,,增刪慢,線程不安全,,輕量級(jí),;下標(biāo)也是從0開(kāi)始; LinkedList:鏈表實(shí)現(xiàn),,增刪快,,查詢(xún)慢 Vector:數(shù)組實(shí)現(xiàn),線程安全,,重量級(jí) 2.Set: 無(wú)序集合,,不允許存放重復(fù)的元素; 實(shí)現(xiàn)類(lèi)HashSet:equals返回true,,hashCode返回相同的整數(shù),;哈希表; 子接口SortedSet:對(duì)Set排序?qū)崿F(xiàn)類(lèi):TreeSet:二叉樹(shù)實(shí)現(xiàn)的,; 看API: Iterator:接口,迭代器,; java.util,; hasNext(); next(); remove(); Iterable:可迭代的,訪問(wèn)的,; ng;實(shí)現(xiàn)了可迭代的接口就可以用迭代的方式訪問(wèn),; 只需實(shí)現(xiàn)iterator();方法即可;Iteratoriterator(); 三種循環(huán)的訪問(wèn)方式: 只有實(shí)現(xiàn)了Iterable接口的才能用第三種,;能用第二種的也一定能用第三種,; ArrayList:自動(dòng)擴(kuò)容,,是數(shù)組照搬過(guò)來(lái)的,; 3.Map HashMap:鍵值對(duì),,key不能重復(fù),但是value可以重復(fù),;key的實(shí)現(xiàn)就是HashSet,;value對(duì)應(yīng)著放; HashSet的后臺(tái)有一個(gè)HashMap;初始化后臺(tái)容量,;只不過(guò)生成一個(gè)HashSet的話,,系統(tǒng)只提供key的訪問(wèn); 如果有兩個(gè)Key重復(fù),,那么會(huì)覆蓋之前的,; Hashtable:線程安全的 Properties:java.util.Properties;key和value都是String類(lèi)型,用來(lái)讀配置文件,; HashMap與Hashtable區(qū)別: HashMap線程不安全的,,允許null作為key或value; Hashtable線程安全的,不允許null作為key或value; TreeMap:對(duì)key排好序的Map;key就是TreeSet,value對(duì)應(yīng)每個(gè)key; key要實(shí)現(xiàn)Comparable接口或TreeMap有自己的構(gòu)造器,; HashSet:remove(Objecto)的原則看這個(gè)對(duì)象O的Hashcode和equals是否相等,,并不是看是不是一個(gè)對(duì)象; 定義一個(gè)Map;key是課程名稱(chēng),,value是Integer表示選課人數(shù),; map.put(cou,map.get(cou)+newInteger(1)); 四、Hashtable,、Properties 1,,Hashtable:實(shí)現(xiàn)了Map接口,此類(lèi)實(shí)現(xiàn)一個(gè)哈希表,,作用和HashMap相同,。任何非null對(duì)象都可以用作鍵或值。為了成功地在哈希表中存儲(chǔ)和獲取對(duì)象,,用作鍵的對(duì)象必須實(shí)現(xiàn)hashCode方法和equals法,。 2,Properties:繼承自Hashtable,,比Hashtable更嚴(yán)格屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串,。 常用方法StringgetProperty(String?key)和setProperty(Stringkey,Stringvalue); 用法:我在C盤(pán)下建了一個(gè)名為yy.dat的文件,文件的內(nèi)容為: name=hehe password=12345 執(zhí)行以下程序,,輸出hehe,,可見(jiàn)用Properties可以很方便的解析配置文件 Propertiesp=newProperties(); p.load(newFileInputStream("C:\\yy.dat")); System.out.println(p.getProperty("name")) 五、兩個(gè)工具類(lèi)Arrays和Collections 1.Arrays,、此類(lèi)包含用來(lái)操作數(shù)組(比如排序和搜索)的各種方法,。此類(lèi)還包含一個(gè)允許將數(shù)組作為列表來(lái)查看的靜態(tài)工廠 2.Collections,、主要提供了在collection上進(jìn)行操作的靜態(tài)方法 六、遺留的幾個(gè)類(lèi) 1.Hashtable,作用和HashMap相同,,不過(guò)它是線程安全的,,如果不需要線程安全,應(yīng)該使用HashMap 2.Enumeration,遺留集合使用枚舉接口來(lái)遍歷元素,,它有兩個(gè)方法,hasMoreElements和nextElement,,用法類(lèi)似Iterator。 3.Stack,繼承自Vector,,實(shí)現(xiàn)了棧的功能,,提供了push()方法押棧和pop()方法出棧。 4.BitSet,位集,。如果需要高效率的存儲(chǔ)一個(gè)位序列,,例如一個(gè)標(biāo)志序列,請(qǐng)使用位集,。它可以對(duì)各個(gè)位進(jìn)行 讀取get(i) 設(shè)置set(i) 清楚clear(i) 七,、常見(jiàn)筆試題目匯總 1.Collection和Collections的區(qū)別。 Collection是集合類(lèi)的上級(jí)接口,,繼承與他的接口主要有Set和List. Collections是針對(duì)集合類(lèi)的一個(gè)幫助類(lèi),,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序,、線程安全化等操作,。 2.List,Set,Map是否繼承自Collection接口? List,Set是,,Map不是 3.兩個(gè)對(duì)象值相同(x.equals(y)==true),,但卻可有不同的hashcode,這句話對(duì)不對(duì)? 不對(duì),,有相同的hashcode,。【java集合總結(jié)3篇】工作總結(jié)網(wǎng)http://www./article/zongjie.html,。 4.你所知道的集合類(lèi)都有哪些,?主要方法? 最常用的集合類(lèi)是List和Map,。List的具體實(shí)現(xiàn)包括ArrayList和Vector,,它們是可變大小的列表,比較適合構(gòu)建,、存儲(chǔ)和操作任何類(lèi)型對(duì)象的元素列表,。List適用于按數(shù)值索引訪問(wèn)元素的情形。 Map提供了一個(gè)更通用的元素存儲(chǔ)方法,。Map集合類(lèi)用于存儲(chǔ)元素對(duì)(稱(chēng)作"鍵"和"值"),,其中每個(gè)鍵映射到一個(gè)值,。 5.排序都有哪幾種方法?請(qǐng)列舉,。用JAVA實(shí)現(xiàn)一個(gè)快速排序,。 排序的方法有:插入排序(直接插入排序、希爾排序),,交換排序(冒泡排序,、快速排序),選擇排序(直接選擇排序,、堆排序),歸并排序,,分配排序(箱排序,、基數(shù)排序) 快速排序的偽代碼。 //使用快速排序方法對(duì)a[0:n-1]排序 從a[0:n-1]中選擇一個(gè)元素作為middle,,該元素為支點(diǎn) 把余下的元素分割為兩段left和right,,使得left中的元素都小于等于支點(diǎn),而right中的元素都大于等于支點(diǎn) 遞歸地使用快速排序方法對(duì)left進(jìn)行排序 遞歸地使用快速排序方法對(duì)right進(jìn)行排序 所得結(jié)果為left+middle+right 6.HashMap和Hashtable的區(qū)別 都屬于Map接口的類(lèi),,實(shí)現(xiàn)了將惟一鍵映射到特定的值上,。 HashMap類(lèi)沒(méi)有分類(lèi)或者排序。它允許一個(gè)null鍵和多個(gè)null值,。 Hashtable類(lèi)似于HashMap,,但是不允許null鍵和null值。它也比HashMap慢,,因?yàn)樗峭降摹?br> 7.Set里的元素是不能重復(fù)的,,那么用什么方法來(lái)區(qū)分重復(fù)與否呢?是用==還是equals()?它們有何區(qū)別? Set里的元素是不能重復(fù)的,那么用iterator()方法來(lái)區(qū)分重復(fù)與否,。 equals()是判讀兩個(gè)Set是否相等,。 equals()和==方法決定引用值是否指向同一對(duì)象equals()在類(lèi)中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類(lèi)型相配的話,,返回真值,。 |
|