Java集合類的區(qū)別

1. ArrayList、LinkedList、Vector、set、List的區(qū)別

  1. ArrayList, Vector采用 數組存儲數據,都繼承List,查找快,刪除插入效率低,原因:要改變插入或刪除元素后面的所有序號;
    Vector線程安全,有synchronized鎖,因此效率較低;擴容因子2;
    ArrayList線程不安全。擴容因子1.5;
  2. LinkedList采用雙向鏈表實現(xiàn),繼承List和Queue,查找慢,插入刪除快;還可以 當隊列使用;
  3. set和 List都 繼承Conllection;
    List有序,用鏈表或數組實現(xiàn);
    set無序且唯一,用 hash表實現(xiàn);
  4. ArrayList和Vector采用數組,存在擴容問題,將原來數組拷貝到新數據中,比較耗費時間;
    LinkedList采用 鏈表形式,沒有 擴容問題;對于增長較快的,應該采用 LinkedList;

2. String、StringBuffer、StringBuilder的區(qū)別

  1. String類型不可變;
    該類實際上采用char[]實現(xiàn),char[]不可變,所以說該類是不可變的;
    String類不可變,每次操作都會 返回一個新數組對象(return new String(buf));
    StringBuffer、StringBuilder是可變的;
    二者都繼承自AbstractStringBuilder、在該類中char[]沒有 用final修飾;
    每次操作返回該字符串本身(return this);
  2. StringBuffer線程安全、StringBuilder線程不安全;
  3. 封裝類Integer、Character也是不可變的,因為 他們除了用final修飾本身,也用final修飾內部的int和char基本類型的變量;
  4. 在進行大量連接操作是,要使用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ū)別

  1. HashMap線程不安全;
    HashTable線程安全;
  2. 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;
  3. 采用Collection.sychronbizedMap(HashMap),可實現(xiàn) HashMap同步,達到HashTable的效果。

5. HashMap和ConcurrentHashMap的區(qū)別

  1. HashMap采用鏈式hash實現(xiàn):通過key的hashcode計算存在哪一個位置,不同的hashcode計算出相同的位置時,在該位置以鏈表存儲;
  2. HashMap擴容問題:每次為原來的兩倍,新建entry數組將原來的復制過來,復制的過程中根基key的hashcode重新計算存儲位置;
    在數據量大時比較耗費資源,所以在初始化時盡量選擇適當的值;
  3. 解決地址沖突:
    保證每次擴容都為2的n次方;
    負載因子取一個平衡值;越大利用率越高,越容易沖突;
  4. 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ū)別

  1. TreeMap用紅黑樹實現(xiàn),查詢時間復雜度是 o(logn);
    LinkedHashMap用哈希表加雙向循環(huán)列表實現(xiàn) ,通過key查詢value時間復雜度是o(1),解決TreeMap的不足。
  2. LinkedHashMap可以通過設置accessOrder來確定是否使用LRU算法;
  3. LinkedHashMap實現(xiàn)原理:
    第一個entry的時候,賦值給head;以后每一個entry就和已經建立好的循環(huán)鏈表加入自己,然后按照hashmap的規(guī)則存到數組中。這樣查找和遍歷就相互分開了。

7. collection包結構,與Collections的區(qū)別

  1. 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;
  2. collections是集合類的一個幫助類,提供了一系列靜態(tài)方法對集合進行排序,搜索線程安全等操作;
    (Collections.sort(),Collections.Copy(),Colections.sysnchronizedList(),Collections.sysnchronizedMap()等)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容