java基礎總結(面試高頻問題)十二:Java的集合類,陣列去除重複資料的方法

溫酒YXY發表於2020-11-09

1:直觀框架圖:
舊版:
在這裡插入圖片描述

新版:
在這裡插入圖片描述

java的集合類主要包括兩種型別的容器,一種是集合(Collection),另一種是對映(Map);
Collection介面又有3種子型別,List、Set和Queue,再下面是一些抽象類,最後是具體實現類,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet等等;
Map常用的有HashMap,LinkedHashMap等。

2:List總結:
List是有序的,可重複的,通過索引取出和加入資料;順序和插入順序一致,可以含有null元素;
List介面有兩個重要的具體實現類,也是我們可能最常用的類,ArrayList和LinkedList;另外還有一個Vector類;
(1)ArrayList:底層資料結構使用陣列結構array,查詢速度快,增刪改慢,因為是一種類似陣列的形式進行儲存,因此它的隨機訪問速度極快;
(2)LinkedList:底層使用連結串列結構,增刪速度快,查詢稍慢;
(3)Vector:底層是陣列結構array,與ArrayList相同,查詢速度快,增刪改慢;
(4)ArrayList和Vector的區別:
<1>如果集合中的元素數量大於當前集合陣列的長度時,Vector的增長率是目前陣列長度的100%,而ArryaList增長率為目前陣列長度的50%。所以,如果集合中使用資料量比較大的資料,用Vector有一定優勢;
<2>ArrayList是執行緒不安全的,Vector是執行緒安全的,但是因為Vector的每個方法都加上了synchronized關鍵字,所以在效率上小於ArrayList;

3:Set總結(所有實現類均不是執行緒安全的類):
set的例項不包含重複的元素,在一個規定集合內,一定不存在兩個相同的元素;Set介面有三個具體實現類,分別是雜湊集HashSet、鏈式雜湊集LinkedHashSet和樹形集TreeSet;
(1)HashSet:是Set介面(Set介面是繼承了Collection介面的)最常用的實現類,底層是用了雜湊表(雜湊/hash)演算法。其底層其實也是一個陣列,存在的意義是提升查詢速度,插入的速度也比較快,但是適用於少量資料的插入操作;
判斷兩個物件是否相等的規則:1、equals比較為true;2、hashCode值相同。要求:要求存在在雜湊表中的物件元素都得覆蓋equals和hashCode方法。
(2)LinkedHashSet:繼承了HashSet類,所以它的底層用的也是雜湊表的資料結構,因為需要保持資料的先後新增順序,所以又加了連結串列結構,但因為多加了一種資料結構,所以效率較低,不建議使用,如果要求一個集合保證元素不重複,也需要記錄元素的先後新增順序,才選擇使用LinkedHashSet;
(3)TreeSet:Set介面的實現類,也擁有set介面的一般特性,但是不同的是他也實現了SortSet介面,它底層採用的是紅黑樹演算法(紅黑樹就是滿足一下紅黑性質的二叉搜尋樹:①每個節點是黑色或者紅色②根節點是黑色的③每個葉子結點是黑色的④如果一個節點是紅色的,那麼他的兩個子節點是黑色的⑤對每個節點,從該節點到其所有的後代葉子結點的簡單路徑上,僅包含相同數目的黑色結點,紅黑樹是許多“平衡”搜尋樹的一種,可以保證在最壞情況下的基本操作集合的時間複雜度為O(lgn)。
普及:二叉搜尋樹的性質:它或者是一棵空樹;或者是具有下列性質的二叉樹:若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;左、右子樹也分別為二叉排序樹。若子樹為空,查詢不成功。),要注意的是在TreeSet集合中只能儲存相同型別物件的引用。
Tree最重要的就是它的兩種排序方式:自然排序和客戶端排序
<1>自然排序;實現了Comparable介面,所以TreeSet可以呼叫物件的ComparableTo()方法來比較集合的大小,然後進行升序排序,這種排序方式叫做自然排序。其中實現了Comparable介面的還有BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short(按照數字大小排序)、Character(按照Unicode值的數字大小進行排序)String(按照字串中字元的Unicode值進行排序)類等;
<2>客戶化排序:其實就是實現java.util.Comparator介面提供的具體的排序方式, 是具體要比較物件的型別,他有個compare的方法,如compare(x,y)返回值大於0表示x大於y,以此類推,當我們希望按照自己的想法排序的時候可以重寫compare方法;

4:Map總結:
java的Map(對映)是一種把鍵物件和值物件進行對映的集合,其中每一個元素都包含了鍵物件和值物件,其中值物件也可以是Map型別的資料,因此,Map支援多級對映,Map中的鍵是唯一的,但值可以不唯一,Map集合有兩種實現,一種是利用雜湊表來完成的叫做HashMap,它和HashSet都是利用雜湊表來完成的,區別其實就是在雜湊表的每個桶中,HashSet只有key,而HashMap在每個key上掛了一個value;另一種就是TreeMap,它實現了SortMap介面,也就是使用了紅黑樹的資料結構,和TreeSet一樣也能實現自然排序和客戶化排序兩種排序方式,而雜湊表不提供排序;

(1)HashMap:詳見0-4節;

(2)TreeMap:TreeMap 是一個有序的key-value集合,它是通過紅黑樹實現的。TreeMap 繼承於AbstractMap,所以它是一個Map,即一個key-value集合;
TreeMap 實現了NavigableMap介面,意味著它支援一系列的導航方法。比如返回有序的key集合;
TreeMap 實現了Cloneable介面,意味著它能被克隆;
TreeMap 實現了java.io.Serializable介面,意味著它支援序列化;
TreeMap基於紅黑樹(Red-Black tree)實現。該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的 Comparator 進行排序,具體取決於使用的構造方法;
TreeMap的基本操作 containsKey、get、put 和 remove 的時間複雜度是 log(n) ;
另外,TreeMap是非同步的,不安全。 它的iterator 方法返回的迭代器是fail-fastl的;

(3)HashTable:Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value,執行緒安全;

5:陣列去除重複資料的方法

(1)用List集合實現:list.contains(str[i])方法為判斷前面資料中是否包含str[i],若包含,返回true,不包含,返回false
在這裡插入圖片描述

輸出:
在這裡插入圖片描述

(2)用hashSet或者TreeSet實現
在這裡插入圖片描述

輸出:
在這裡插入圖片描述

其中Arrays.asList()是將一個陣列轉化為一個List物件,這個方法會返回一個ArrayList型別的物件, 這個ArrayList類並非java.util.ArrayList類,而是Arrays類的靜態內部類!
TreeSet不僅可以使元素不重複,而且可以實現排序等功能的集合,它在物件元素新增到集合中時會自動按照某種比較規則將其插入到有序的物件序列中。

(3)用List和set(集合)實現
在這裡插入圖片描述

輸出:
在這裡插入圖片描述

不僅刪除了重複元素,還進行了排序;

相關文章