集合(Collections)
文章目錄
- 1. 概念
- 2. Collection接口
- 2.1. List
- 2.1.1 源碼分析
- 2.2. Set
- 3. Map接口
- 3.1. 源碼分析
- 4. Collections工具類(lèi)
1. 概念
因?yàn)閿?shù)組存在弊端,為了方便多個(gè)對(duì)象的內(nèi)存存儲(chǔ),可以動(dòng)態(tài)的把多個(gè)對(duì)象的引用放入容器中
- 初始化以后,其長(zhǎng)度就不可修改。
- 數(shù)組中提供的方法非常有限,對(duì)添加、刪除、插入數(shù)據(jù)等操作,非常不便,同時(shí)效率不高。
- 獲取數(shù)組實(shí)際元素的個(gè)數(shù)的需求,數(shù)組沒(méi)有現(xiàn)成的屬或方法可用
- 數(shù)組存儲(chǔ)數(shù)據(jù)的特點(diǎn):有序、可重復(fù),對(duì)于無(wú)序、不可重復(fù)的需求,不能滿足
Java中,集合類(lèi)的基本接口是Collection接口和Map接口
2. Collection接口
單列數(shù)據(jù)
2.1. List
有序、可重復(fù) (Vector、ArrayList、LinkedList)
Vector:List 接口的古老的實(shí)現(xiàn)類(lèi),線程安全,效率低,底層使用Object[ ]數(shù)組存儲(chǔ)
ArrayList:List 接口的主要實(shí)現(xiàn)類(lèi),線程不安全,效率低,底層使用Object[ ]數(shù)組存儲(chǔ)
LinkedList:底層使用雙向鏈表存儲(chǔ),對(duì)于頻繁的插入刪除操作使用此類(lèi)效率比較高
2.1.1 源碼分析
// 底層創(chuàng)建長(zhǎng)度為10的Object[] elementData ArrayList arrayList = new ArrayList(); arrayList.add(123);//相當(dāng)于elementData[0] = new Integer(123); arrayList.add(123456);//若此時(shí)elementData數(shù)組長(zhǎng)度不夠,則按照原容量的1.5倍進(jìn)行擴(kuò)容,并將原數(shù)組的數(shù)據(jù)復(fù)制到擴(kuò)容后的數(shù)組/** 建議開(kāi)發(fā)中確定長(zhǎng)度后使用帶參構(gòu)造器,盡量避免擴(kuò)容來(lái)提高效率**/ ArrayList list = new ArrayList();list.add(123); list.add(456); //按照索引添加 list.add(1,"AA");System.out.println(list+"長(zhǎng)度是:"+list.size());//[123, 456, AA]長(zhǎng)度是:3List list1 = Arrays.asList(1, 2, 3); list.addAll(list1);//添加集合中的元素 System.out.println(list.size());//按照索引獲取 System.out.println(list.get(1)); //返回此元素首次+末次出現(xiàn)的索引,不存在返回-1, System.out.println(list.indexOf(123)+" "+list.lastIndexOf(123)); //指定索引位置元素值 list.set(1,"tylt"); //截取一定索引區(qū)間的元素[左閉右開(kāi)) System.out.println(list.subList(1, 3));2.2. Set
無(wú)序、不可重復(fù) (HashSet、LinkedHashSet、TreeSet)
HashSet:Set接口的主要實(shí)現(xiàn)類(lèi),線程不安全,可以存儲(chǔ)null,底層是數(shù)組+鏈表結(jié)構(gòu),其實(shí)是個(gè)HashMap
LinkedHashSet:HashSet的子類(lèi),可按照添加的順序進(jìn)行遍歷(非有序)因?yàn)槎嗔穗p向鏈表進(jìn)行指向,效率高于HashSet
TreeSet:底層使用紅黑樹(shù)結(jié)構(gòu),可以按照添加的對(duì)象按執(zhí)行屬性排序,要求數(shù)據(jù)必須是同一類(lèi)型的,例如String Integer
無(wú)序性不等同于隨機(jī)性,無(wú)序性在添加時(shí)不是按照數(shù)組索引的方式添加(線性探測(cè)進(jìn)入),而是按照數(shù)據(jù)的Hash值進(jìn)行位置確定,遍歷時(shí)依舊按照原加入順序輸出
不可重復(fù)性就是添加的元素按照equals方法比較,即相同元素唯一
3. Map接口
雙列數(shù)據(jù),具有映射關(guān)系key-value(鍵值對(duì))
- Map中的key是無(wú)序的、不可重復(fù)的,使用Set存儲(chǔ)所有key;value也是無(wú)序的、不可重復(fù)的,使用Collection存儲(chǔ)所有的value
- 一個(gè)鍵值對(duì)構(gòu)成了一個(gè)Entry對(duì)象,是無(wú)序的不可重復(fù)的,使用Set存儲(chǔ),所以自定義的類(lèi)要重寫(xiě)equals和hashcode方法
HashMap:作為Map接口的主要實(shí)現(xiàn)類(lèi),線程不安全的,效率高,可存儲(chǔ)null的key和value,底層是數(shù)組+鏈表+紅黑樹(shù)
LinkedHashMap:HashMap的子類(lèi),雙向鏈表結(jié)構(gòu),可以按照順序?qū)崿F(xiàn)頻繁遍歷操作,效率高
TreeMap:存儲(chǔ)有序鍵值對(duì)數(shù)據(jù),可實(shí)現(xiàn)按照key排序,所以要求key必須由同一類(lèi)創(chuàng)建,底層使用紅黑樹(shù)
Hashtable:古老的實(shí)現(xiàn)類(lèi),線程安全
Properties:Hashtable子類(lèi),常用來(lái)處理配置文件,key,value都是String類(lèi)型
3.1. 源碼分析
- HashMap 底層實(shí)現(xiàn)原理
- Properties 配置文件的理解
4. Collections工具類(lèi)
操作Set、List、Map的靜態(tài)工具類(lèi)
總結(jié)
以上是生活随笔為你收集整理的集合(Collections)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux 笔记本调整屏幕亮度的方法
- 下一篇: 非自锁物理按键实现自锁功能控制的方法总结