1. ArrayList、LinkedList、Vector、set、List的區(qū)別
- ArrayList, Vector采用 數組存儲數據,都繼承List,查找快,刪除插入效率低,原因:要改變插入或刪除元素后面的所有序號;
Vector線程安全,有synchronized鎖,因此效率較低;擴容因子2;
ArrayList線程不安全。擴容因子1.5; - LinkedList采用雙向鏈表實現(xiàn),繼承List和Queue,查找慢,插入刪除快;還可以 當隊列使用;
- set和 List都 繼承Conllection;
List有序,用鏈表或數組實現(xiàn);
set無序且唯一,用 hash表實現(xiàn); - ArrayList和Vector采用數組,存在擴容問題,將原來數組拷貝到新數據中,比較耗費時間;
LinkedList采用 鏈表形式,沒有 擴容問題;對于增長較快的,應該采用 LinkedList;
2. String、StringBuffer、StringBuilder的區(qū)別
- String類型不可變;
該類實際上采用char[]實現(xiàn),char[]不可變,所以說該類是不可變的;
String類不可變,每次操作都會 返回一個新數組對象(return new String(buf));
StringBuffer、StringBuilder是可變的;
二者都繼承自AbstractStringBuilder、在該類中char[]沒有 用final修飾;
每次操作返回該字符串本身(return this); - StringBuffer線程安全、StringBuilder線程不安全;
- 封裝類Integer、Character也是不可變的,因為 他們除了用final修飾本身,也用final修飾內部的int和char基本類型的變量;
- 在進行大量連接操作是,要使用StringBuffer、StringBuilder;
因為String在 進行連接時也要創(chuàng)建StringBuilder對象調用append方法;
3. Map、Set、List、Queue、Stack的特點與用法
Map:鍵值對形式存儲,key可以為null,不可重復,會覆蓋;
Set:無序,value可為 null,不可重復;
List:有序,可為null,可重復;
Stack:可以但是沒有用LinkdeList實現(xiàn),繼承了Vector,因此是用數組實現(xiàn)的,線程安全。
Queue:LinkedList繼承了這個借口,可以用LinkedList創(chuàng)建Queue;
4. HashMap和HashTable的區(qū)別
- HashMap線程不安全;
HashTable線程安全; - HashMap允許key或者value為null,而 HashTable不允許key或者value為null;
二者都實現(xiàn)Map接口;
HashMap的put()方法中:if(key==null){return putForNullKey(value)}
HashTable的put()方法中:if(value==null){throw new NullpointerException()}
且下面還要調用key.hashCode();
因此key、value均不能為null; - 采用
Collection.sychronbizedMap(HashMap),可實現(xiàn) HashMap同步,達到HashTable的效果。
5. HashMap和ConcurrentHashMap的區(qū)別
- HashMap采用鏈式hash實現(xiàn):通過key的hashcode計算存在哪一個位置,不同的hashcode計算出相同的位置時,在該位置以鏈表存儲;
- HashMap擴容問題:每次為原來的兩倍,新建entry數組將原來的復制過來,復制的過程中根基key的hashcode重新計算存儲位置;
在數據量大時比較耗費資源,所以在初始化時盡量選擇適當的值; - 解決地址沖突:
保證每次擴容都為2的n次方;
負載因子取一個平衡值;越大利用率越高,越容易沖突; - ConcurrentHashMap:
在多線程環(huán)境下,使用HashMap進行put操作時存在丟失數據的情況,為了避免這種bug的隱患,強烈建議使用ConcurrentHashMap代替HashMap;
- 1.7實現(xiàn):分段鎖,提高并發(fā)編程效率;
將一個segment數組分成一個個小的HashTable,每個segment對象就相當于一個HashMap。一個線程鎖定一個段,而不是對整個map加鎖; - 1.8實現(xiàn):放棄了Segment臃腫的設計,取而代之的是采用Node + CAS + Synchronized來保證并發(fā)安全進行實現(xiàn);
6. TreeMap、HashMap、LinkedHashMap的區(qū)別
- TreeMap用紅黑樹實現(xiàn),查詢時間復雜度是 o(logn);
LinkedHashMap用哈希表加雙向循環(huán)列表實現(xiàn) ,通過key查詢value時間復雜度是o(1),解決TreeMap的不足。 - LinkedHashMap可以通過設置accessOrder來確定是否使用LRU算法;
- LinkedHashMap實現(xiàn)原理:
第一個entry的時候,賦值給head;以后每一個entry就和已經建立好的循環(huán)鏈表加入自己,然后按照hashmap的規(guī)則存到數組中。這樣查找和遍歷就相互分開了。
7. collection包結構,與Collections的區(qū)別
- Collection叫類集,包含了:List、Set、Queue、BeanCOntext 4個結構的接口;
對List接口的標準實現(xiàn)有: abstractList、Vector、LinkedList、ArrayList、copyOnnwriteArrayList;
對Set的接口被AbstractSet實現(xiàn),其他標準實現(xiàn)繼承AbstractSet;有:hashSet、copyonwriteArraySet、TreeSet、ConcurrentSkipArraySet; - collections是集合類的一個幫助類,提供了一系列靜態(tài)方法對集合進行排序,搜索線程安全等操作;
(Collections.sort(),Collections.Copy(),Colections.sysnchronizedList(),Collections.sysnchronizedMap()等)