1.java集合接口
集合類在java.util包下遭顶,主要有Set张峰、List和Map
Collection:Collection 是集合 List、Set棒旗、Queue 的最基本的接口喘批。
Iterator:迭代器,可以通過迭代器遍歷集合中的數(shù)據(jù)
Map:是映射表的基礎(chǔ)接口
2.List
List是非常常用的集合,它里面的元素是可重復(fù)且有序的饶深,主要有三個實現(xiàn)類分別是:ArrayList餐曹、Vector、LinkedList敌厘。
3.ArrayList
數(shù)據(jù)結(jié)構(gòu):底層是用數(shù)組實現(xiàn)的台猴,利用數(shù)組連續(xù)下標(biāo)的特性可以快速讀取對應(yīng)的元素
擴(kuò)容機(jī)制:當(dāng)容量不足需要擴(kuò)容時,通過復(fù)制元素到新的數(shù)組额湘。
線程安全:否
特點:查詢快卿吐,利用數(shù)據(jù)的連續(xù)下標(biāo)特點,增刪慢锋华,因為增刪后需要對數(shù)組進(jìn)行復(fù)制嗡官,移動。所以適合查多寫少的場景毯焕。
4.Vector
Vector和ArrayList一樣底層都是數(shù)組實現(xiàn)的衍腥,不同的是Vector是線程安全的。也就是說同一時刻只能由一個線程對Vector進(jìn)行寫纳猫,避免了多線程操作的數(shù)據(jù)安全問題婆咸,同時由于加鎖的操作也使得性能低于ArrayList。
5.LinkedList
數(shù)據(jù)結(jié)構(gòu):雙向鏈表結(jié)構(gòu)芜辕,增刪比較快只要修改前后指針的指向尚骄,讀取由于沒有下標(biāo)需要遍歷讀
擴(kuò)容機(jī)制:自動擴(kuò)容
線程安全:否
特點:適合動態(tài)的增刪,隨機(jī)讀取速度比較慢侵续,另外還提供了操作頭尾元素的方法倔丈,很適合做堆棧,隊列或雙向隊列状蜗。
6.Set
Set主要是側(cè)重元素的唯一性需五,且無序的,存入和讀取不一定一樣轧坎。保證唯一性主要是通過hashCode來保證宏邮,java對象的hashCode是通過內(nèi)存地址來計算的哈希值。如果想讓兩個不同的對象視為相等就要重寫Object的hashCode方法和equals方法缸血。
7.HashSet
HashSet數(shù)據(jù)的存儲和讀取是根據(jù)哈希值來計算的蜜氨,是無序的。HashSet會先判斷hashCode方法是否一樣属百,如果不一樣就是不同對象记劝,如果一樣還要繼續(xù)判斷equals方法的返回結(jié)果,true就認(rèn)為是同一個對象族扰,false就是不同對象。但是他們的存儲是有所不同的。
hashCode不同:
hashCode一樣渔呵,equals返回false:
也就是說一個哈希值的位置上可以存放多個元素怒竿,只不過他們形成一個鏈表或者說放到一個哈希桶中。
8.TreeSet
TreeSet是以二叉樹結(jié)構(gòu)來存放扩氢,每新增一個對象都會按升序或降序存放到二叉樹指定位置耕驰。
但是升序降序要實現(xiàn)Comparable接口重新compareTo()方法,Integer和String可以進(jìn)行默認(rèn)排序。
9.LinkedHashSet
LinkedHashSet實際上就是集成了HashSet录豺,結(jié)構(gòu)又是用LinkedHashMap來存儲朦肘,說白了就是只用到Map的key部分。所以LinkedHashSet的方法和HashSet幾乎一樣双饥,只是提供了幾個構(gòu)造函數(shù)媒抠,構(gòu)造函數(shù)調(diào)用父構(gòu)造函數(shù)初始化LinkedHashMap來做數(shù)據(jù)存儲。
10.HashMap
Map是存放鍵值對數(shù)據(jù)咏花,HashMap的key不允許重復(fù)趴生,允許為null,但是只有一個null昏翰,value可以重復(fù)也可以為null苍匆。正常情況下通過哈希值都能快速讀取到元素,但是遍歷的順序是不一定的棚菊。HashMap是非線程安全的浸踩。hashMap有幾個比較重要的屬性1. capacity:當(dāng)前數(shù)組容量,始終保持 2^n统求,可以擴(kuò)容检碗,擴(kuò)容后數(shù)組大小為當(dāng)前的 2 倍。2. loadFactor:負(fù)載因子球订,默認(rèn)為 0.75后裸。3. threshold:擴(kuò)容的閾值,等于 capacity * loadFactor冒滩。
不同版本的jdk微驶,hashMap的結(jié)構(gòu)有所區(qū)別
jdk1.7版本主要是哈希+鏈表的結(jié)構(gòu)
大體上看是一個數(shù)組結(jié)構(gòu)當(dāng)哈希值沖突的時候在對應(yīng)位置演變成一個鏈表結(jié)構(gòu),鏈表結(jié)構(gòu)存的是Entry對象包括key开睡,value因苹,哈希值和next信息。
jdk1.8版本主要是哈希+鏈表+紅黑樹的結(jié)構(gòu)
jdk1.8對hashMap的結(jié)構(gòu)進(jìn)行了優(yōu)化篇恒,1.7中哈希沖突的的時候在對應(yīng)位置上演變鏈表位置扶檐,那查找的時候鏈表上的元素的時候時間復(fù)雜度就是O(n)头镊,取決于鏈表的長度空另。1.8中在鏈表的長度超過8的時候?qū)㈡湵硌葑兂杉t黑樹,自然查找的效率就高很多咕娄。
11.ConcurrentHashMap
ConcurrentHashMap和HashMap的結(jié)構(gòu)差不多,但是呢它是線程安全的奈梳,所以為了解決這個線程安全又想效率維持在較高的水平杈湾,就多了分段的概念。整個ConcurrentHashMap是有一個個分段Segment組成攘须,Segment通過繼承ReentrantLock來進(jìn)行對該分段進(jìn)行加鎖漆撞,該分段里的數(shù)據(jù)結(jié)構(gòu)跟HashMap幾乎一樣。
在jdk1.8中鏈表超過8也是演變成紅黑樹于宙。
ConcurrentHashMap 有 16 個 Segments浮驳,所以理論上,這個時候捞魁,最多可以同時支
持 16 個線程并發(fā)寫至会,只要它們的操作分別分布在不同的 Segment 上。這個值可以在初始化的時
候設(shè)置為其他值署驻,但是一旦初始化以后奋献,它是不可以擴(kuò)容的。
12.HashTable
HashTable現(xiàn)在幾乎不使用了旺上,他的功能和HashMap一樣瓶蚂,是線程安全的,但是加鎖的粒度比較大性能不是很高宣吱,如果想要線程安全就用ConcurrentHashMap窃这,不在乎線程安全的場景就用HashMap。
13.TreeMap
TreeMap實現(xiàn)了SortedMap接口征候,支持根據(jù)key進(jìn)行排序杭攻,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器疤坝,在使用 TreeMap 時兆解,key 必須實現(xiàn) Comparable 接口或者在構(gòu)造 TreeMap 傳入自定義的
Comparator,否則會在運行時拋出 java.lang.ClassCastException 類型的異常跑揉。