1. ArrayList信不、LinkedList、Vector辞州、set捞高、List的區(qū)別
- ArrayList蹦锋, Vector采用 數(shù)組存儲(chǔ)數(shù)據(jù)炕置,都繼承List荣挨,查找快,刪除插入效率低讹俊,原因:要改變插入或刪除元素后面的所有序號(hào);
Vector線程安全煌抒,有synchronized鎖仍劈,因此效率較低;擴(kuò)容因子2寡壮;
ArrayList線程不安全贩疙。擴(kuò)容因子1.5; - LinkedList采用雙向鏈表實(shí)現(xiàn)况既,繼承List和Queue这溅,查找慢,插入刪除快棒仍;還可以 當(dāng)隊(duì)列使用悲靴;
- set和 List都 繼承Conllection;
List有序莫其,用鏈表或數(shù)組實(shí)現(xiàn)癞尚;
set無序且唯一,用 hash表實(shí)現(xiàn)乱陡; - ArrayList和Vector采用數(shù)組浇揩,存在擴(kuò)容問題,將原來數(shù)組拷貝到新數(shù)據(jù)中憨颠,比較耗費(fèi)時(shí)間胳徽;
LinkedList采用 鏈表形式,沒有 擴(kuò)容問題爽彤;對(duì)于增長較快的养盗,應(yīng)該采用 LinkedList;
2. String适篙、StringBuffer爪瓜、StringBuilder的區(qū)別
- String類型不可變;
該類實(shí)際上采用char[]實(shí)現(xiàn)匙瘪,char[]不可變铆铆,所以說該類是不可變的蝶缀;
String類不可變,每次操作都會(huì) 返回一個(gè)新數(shù)組對(duì)象(return new String(buf))薄货;
StringBuffer翁都、StringBuilder是可變的;
二者都繼承自AbstractStringBuilder谅猾、在該類中char[]沒有 用final修飾柄慰;
每次操作返回該字符串本身(return this); - StringBuffer線程安全税娜、StringBuilder線程不安全坐搔;
- 封裝類Integer、Character也是不可變的敬矩,因?yàn)?他們除了用final修飾本身概行,也用final修飾內(nèi)部的int和char基本類型的變量;
- 在進(jìn)行大量連接操作是弧岳,要使用StringBuffer凳忙、StringBuilder;
因?yàn)镾tring在 進(jìn)行連接時(shí)也要?jiǎng)?chuàng)建StringBuilder對(duì)象調(diào)用append方法禽炬;
3. Map涧卵、Set、List腹尖、Queue柳恐、Stack的特點(diǎn)與用法
Map:鍵值對(duì)形式存儲(chǔ),key可以為null热幔,不可重復(fù)胎撤,會(huì)覆蓋;
Set:無序断凶,value可為 null伤提,不可重復(fù);
List:有序认烁,可為null肿男,可重復(fù);
Stack:可以但是沒有用LinkdeList實(shí)現(xiàn)却嗡,繼承了Vector舶沛,因此是用數(shù)組實(shí)現(xiàn)的,線程安全窗价。
Queue:LinkedList繼承了這個(gè)借口如庭,可以用LinkedList創(chuàng)建Queue;
4. HashMap和HashTable的區(qū)別
- HashMap線程不安全;
HashTable線程安全撼港; - HashMap允許key或者value為null坪它,而 HashTable不允許key或者value為null骤竹;
二者都實(shí)現(xiàn)Map接口;
HashMap的put()方法中:if(key==null){return putForNullKey(value)}
HashTable的put()方法中:if(value==null){throw new NullpointerException()}
且下面還要調(diào)用key.hashCode()往毡;
因此key蒙揣、value均不能為null; - 采用
Collection.sychronbizedMap(HashMap)
开瞭,可實(shí)現(xiàn) HashMap同步懒震,達(dá)到HashTable的效果。
5. HashMap和ConcurrentHashMap的區(qū)別
- HashMap采用鏈?zhǔn)絟ash實(shí)現(xiàn):通過key的hashcode計(jì)算存在哪一個(gè)位置嗤详,不同的hashcode計(jì)算出相同的位置時(shí)个扰,在該位置以鏈表存儲(chǔ);
- HashMap擴(kuò)容問題:每次為原來的兩倍葱色,新建entry數(shù)組將原來的復(fù)制過來递宅,復(fù)制的過程中根基key的hashcode重新計(jì)算存儲(chǔ)位置;
在數(shù)據(jù)量大時(shí)比較耗費(fèi)資源冬筒,所以在初始化時(shí)盡量選擇適當(dāng)?shù)闹担?/li> - 解決地址沖突:
保證每次擴(kuò)容都為2的n次方恐锣;
負(fù)載因子取一個(gè)平衡值茅主;越大利用率越高舞痰,越容易沖突; - ConcurrentHashMap:
在多線程環(huán)境下诀姚,使用HashMap進(jìn)行put操作時(shí)存在丟失數(shù)據(jù)的情況响牛,為了避免這種bug的隱患,強(qiáng)烈建議使用ConcurrentHashMap代替HashMap赫段;
- 1.7實(shí)現(xiàn):分段鎖呀打,提高并發(fā)編程效率;
將一個(gè)segment數(shù)組分成一個(gè)個(gè)小的HashTable糯笙,每個(gè)segment對(duì)象就相當(dāng)于一個(gè)HashMap贬丛。一個(gè)線程鎖定一個(gè)段,而不是對(duì)整個(gè)map加鎖给涕; - 1.8實(shí)現(xiàn):放棄了Segment臃腫的設(shè)計(jì)豺憔,取而代之的是采用Node + CAS + Synchronized來保證并發(fā)安全進(jìn)行實(shí)現(xiàn);
6. TreeMap够庙、HashMap恭应、LinkedHashMap的區(qū)別
- TreeMap用紅黑樹實(shí)現(xiàn),查詢時(shí)間復(fù)雜度是 o(logn)耘眨;
LinkedHashMap用哈希表加雙向循環(huán)列表實(shí)現(xiàn) 昼榛,通過key查詢value時(shí)間復(fù)雜度是o(1),解決TreeMap的不足剔难。 - LinkedHashMap可以通過設(shè)置accessOrder來確定是否使用LRU算法胆屿;
- LinkedHashMap實(shí)現(xiàn)原理:
第一個(gè)entry的時(shí)候奥喻,賦值給head;以后每一個(gè)entry就和已經(jīng)建立好的循環(huán)鏈表加入自己莺掠,然后按照hashmap的規(guī)則存到數(shù)組中衫嵌。這樣查找和遍歷就相互分開了。
7. collection包結(jié)構(gòu)彻秆,與Collections的區(qū)別
- Collection叫類集楔绞,包含了:List、Set唇兑、Queue酒朵、BeanCOntext 4個(gè)結(jié)構(gòu)的接口;
對(duì)List接口的標(biāo)準(zhǔn)實(shí)現(xiàn)有: abstractList扎附、Vector蔫耽、LinkedList、ArrayList留夜、copyOnnwriteArrayList匙铡;
對(duì)Set的接口被AbstractSet實(shí)現(xiàn),其他標(biāo)準(zhǔn)實(shí)現(xiàn)繼承AbstractSet碍粥;有:hashSet鳖眼、copyonwriteArraySet、TreeSet嚼摩、ConcurrentSkipArraySet钦讳; - collections是集合類的一個(gè)幫助類,提供了一系列靜態(tài)方法對(duì)集合進(jìn)行排序枕面,搜索線程安全等操作愿卒;
(Collections.sort(),Collections.Copy()潮秘,Colections.sysnchronizedList()琼开,Collections.sysnchronizedMap()等)