java中的集合類詳情解析以及集合和數組的區別


數組和鏈表

  1. 數組:所謂數組就是相同數據類型的元素按照一定順序排列的集合。
    它的存儲區間是連續的,占用內存嚴重,所以空間復雜度很大,為o(n),但是數組的二分查找時間復雜度很小為o(1)。
    特點是大小固定,不可變,在同一個數組中只能存放同一個類型的數據,尋址容易,插入和刪除困難。
  2. 鏈表:所謂鏈表就是一種物理存儲單元上非連續的,非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針實現的。鏈表是由一系列節點(鏈表中每個元素稱為節點)組成的,節點是可以動態生成的。每個節點包括兩部分:一個是存儲數據元素的數據域,另一個是存儲下一個節點地址的指針域。
    鏈表的特點:鏈表存儲區間離散,占用內存較少,所以空間復雜度小,但是時間復雜度大o(n),尋址困難,但是插入和刪除元素很容易。
  3. 集合:可以操作數量可變和類型不同的一組數據。所有的java集合都在java.util包中,java集合只能存放引用類型的數據,不能存放基本類型數據。

ArrayList的底層實現方式

  1. ArrayList底層是通過數組實現的,實例化ArrayList無參構造函數默認數組初始化長度為10。
  2. add方法底層實現如果增加的元素個數超過了10個,那么ArrayList底層會新生成一個數組,長度變為原數組的1.5倍+1,然后將原始數組的元素復制到新數組中,並且后續增加的元素都會放到新數組中。當新數組也無法滿足元素大小時,繼續重復這個擴容的過程。只要元素長度超過了容量就開始擴容。擴容數組調用的方法為ArrayList.copyOf(objArr,objArr.length+1)。

ArrayList和Vector的區別

ArrayList和vector都實現了list接口(list接口繼承了collection接口),他們都是有序集合,並且允許有重復的元素存在。他們相當於是一種動態的數組,所以可以通過下標的方式取出某一個元素。
他們的區別主要體現在以下兩個方面:

  1. 同步性
    vector是線程安全的,也就是說它的方法之間是線程同步的,而ArrayList是線程不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那么可以使用ArrayList,因為它不考慮線程安全問題,效率比較高。如果多個線程要訪問到集合,那么最好是用vector,因為它是線程安全的,不用我們去考慮線程問題。
  2. 數據增長策略
    ArrayList和vector都有一個初始容量大小,當數據長度超過了這個容量大小就需要擴容。vector默認增長為原來數據長度的2倍,而ArrayList是增長為原來的1.5倍。
    ArrayList和vector都可以設置初始空間的大小,此外vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。

LinkedList的底層實現方式

linkedlist底層的數據結構是基於雙向循環鏈表實現的,並且頭結點中不存放數據。
如下圖(圖太丑了,將就着看,不講究了):

hashmap的底層實現原理

hashmap是map集合的實現類之一,
它的特點有:

  1. 以鍵值對的形式存儲值
  2. 鍵不能重復而值可以重復
  3. 允許有null的鍵和值
  4. 並且線程不安全所以效率很快,方法也不是同步的。
    hashmap是基於hashing原理,用put(key,value)存儲對象到hashmap中,使用get(key)從hashmap中獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashcode()方法來計算hashcode,然后找到bucket位置來存儲值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然后返回值對象。hashmap是在bucket中存儲鍵對象和值對象的。
    如果hashmap的大小超過了負載因子(load factor)定義的容量(默認為0.75),它將會像其他集合類一樣采取擴容,將會創建原來hashmap大小2倍的bucket數組,來重新調整map的大小,並且將原來的對象放入新的bucket數組中。這個過程叫做rehashing。因為它會調用hash方法找到新的bucket數組位置。hashmap使用鏈表來解決碰撞問題,當發生了碰撞,對象將會存儲在鏈表的下一個節點中。hashmap在每個鏈表節點中存儲鍵值對對象。
    詳情參見:https://www.cnblogs.com/java-jun-world2099/p/9258605.html

hashmap和hashtable的區別

  1. hashmap是線程不安全的,允許有null的鍵和值,效率較高,方法不是Synchronize的需要提供外同步,它有containsvalue和containskey方法。
  2. hashtable是線程安全的,不允許有null的鍵和值,效率低下,方法是同步的,它有containsvalue和containskey方法。

List,Set,Map的區別

java中的集合包括三大類,分別為list,set,map,他們都處於java.util包中,list,set,map都是接口,他們都有各自的實現類。set的實現類主要hashSet和treeSet,list的實現類主要有ArrayList和linkedlist,map的主要實現類有hashMap和treeMap。如下圖所示

  1. Set中的對象不按特定的方式排序,並且沒有重復的元素。但是它的有些實現類能對集合中的對象按特定的方式排序,例如treeSet實現類,它可以按照默認排序,也可以通過java.util.Comparator 接口來自定義排序方式。set有兩個實現類,hashSet和treeSet,他們有一定的區別,hashSet中元素不能重復並且沒有順序,treeSet中元素不能重復但是有順序,如果需要排序使用treeSet,不需要排序使用hashSet,它的速度比treeSet快。

  2. List中對象按照索引位置排序,可以有重復的對象。允許按照對象在集合中的索引位置來檢索對象。例如通過list.get(i)的方式來獲得集合中的某一個對象。

  3. Map中的每一個元素都包括一個key和value值,它是以鍵值對的形式存在,鍵值不允許重復,值可以重復。

Set集合中的元素是不能重復的,那么用什么方法區分重復與否?是用==還是equals方法,他們有什么區別呢?

可以參見這篇博文:https://www.cnblogs.com/qf123/p/8574582.html
equals方法是String類從他的超類object中繼承過來的,用於檢測兩個對象是否相等,即兩個對象的內容是否相等。
==用於比較引用和比較基本類型時有不同的功能:

  1. 比較基本數據類型時,如果兩個值相同則為true
  2. 比較引用時,如果兩個引用指向內存中的同一個對象則為true。

HashMap,LinkedHashMap和TreeMap的區別

  1. 共同點
    他們都是map的實現類。
  2. 不同點
    HashMap里面存入的鍵值對在取出的時候是隨機的。
    TreeMap取出來的是排序后的鍵值對,如果需要按自然順序或者自定義順序鍵,那么TreeMap更好。
    LinkedHaspMap是HashMap的一個子類,如果需要輸出的順序和輸入的順序相同,那么可以使用LinkedHashMap實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM