1. 程式人生 > >java基礎09-單列集合、資料結構、比較器

java基礎09-單列集合、資料結構、比較器

主要內容: List 集合 、Set 集合 、資料結構 一、List介面 List介面是Collection介面下面的一個子介面。 1).這個介面滿足以下特點: 1. 有序。(有序不是順序,有序怎麼存就怎麼取) 2. 有索引 (可以根據索引獲取元素) 3. 可以存放重複元素。 2).List常見的實現類: ArrayList(最常用), LinkedList, Vector(淘汰) 1. .List介面中常見的方法: public void add(int index, E element) : 將指定的元素,新增到該集合中的指定位置上。 public E get(int index) :返回集合中指定位置的元素。 public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。 public E set(int index, E element) :用指定元素替換集合中指定位置的元素,返回值的更新前的元素。 2. ArrayList類

ArrayLis是List介面中最常用的一個子類(沒有之一),ArrayList 內部是使用一個數組去儲存資料的。因為內部是陣列,所以ArrayList查詢快,增刪慢。 1. .LinkedList類

LinkedList是 List介面下面的另一個實現類。LinkedList內部是一個雙向連結串列。 LinkedList的特點: 查詢慢,增刪快。 LinkedList裡面有一些特有的方法,支援對集合的首尾進行操作。 特有方法(8個): void addFirst(E e): 向集合首個位置新增元素 void addLast(E e): 向集合尾部新增元素 E getFirst():獲取集合中首個位置的元素 E getLast():獲取集合中最後一個元素 E removeFirst():刪除集合中的第一個元素,並返回該元素 E removeLast():刪除集合中的最後一個元素,並返回該元素 void push(E e): 壓入,向集合的開頭新增元素 E pop():彈出。刪除集合中的第一個元素並返回。 二、Set介面 Set介面是Collection介面下面的另一個子介面。 1).Set介面有以下特點: 1. 無序(怎麼存不一定怎麼取) 2. 無索引 3. 不可以重複,不能存放重複元素 2).Set介面常見的實現類: HashSet, LinkedHashSet 1. HashSet類

HashSet類是Set介面的實現類。底層的實現其實是一個 java.util.HashMap 支援,HashSet 是根據物件的雜湊值來確定元素在集合中的儲存位置,因此具有良好的存取和查詢效能。保證元素唯一性的方式依賴於: hashCode 與 equals 方法。這個類滿足Set介面的所有的特點。 這個集合是沒有索引的,所以不能通過索引的方式遍歷這個集合。遍歷方式可以採用迭代器,也可以採用增強for。推薦增強for。 HashSet 集合儲存資料的結構(雜湊表) 4).什麼是雜湊表呢? 在JDK1.8之前,雜湊表底層採用陣列+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。但是當位於一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而JDK1.8中,雜湊表儲存採用陣列+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間。簡單的來說,雜湊表是由陣列+連結串列+紅黑樹(JDK1.8增加了紅黑樹部分)實現。

1. 

.物件的雜湊值: 物件的雜湊值就是一個int數字, 可以把雜湊值看成是物件的一個標識。 在Object中有一個方法,可以獲取到一個物件的雜湊值,這個方法叫做hashCode。 在Object中的hashCode方法,物件的雜湊值計算方式是根據地址值計算的。 如果不想使用Object中hashCode的計算方式,那麼可以在子類中重寫hashCode方法。 物件的雜湊值一般都是根據物件的屬性值計算,如果物件的屬性值相同那麼這兩個物件的雜湊值也應該相同。 注意: 雜湊值是物件的一個標識。 並不是一個唯一的標識。 雜湊值允許重複。 雜湊值是一個int數字,int取值範圍是-21億到21億,一共是42億個。現在有50億個物件,雜湊值肯定重複。 總結: 1. 雜湊值是物件的一個標識,一個特徵碼。 2. 可以呼叫物件的hashCode獲取到物件的雜湊值。 3. 如果希望自己定義雜湊值的生成規則,可以在子類中重寫hashCode方法。

1. 

HashSet存放自定義元素。

使用HashSet存放Student,如果兩個Student的屬性完全相同,就當成是同一個Student物件,如果要使用hashSet存放自定義物件,並且如果要保證唯一性(兩個物件的屬性完全相同,就當成是同一個物件),需要重寫hashCode和equals。因為HashSet判斷唯一性的原理是先比較雜湊值,如果雜湊值不同肯定是不同的物件,如果雜湊值相同,不一定是同一個物件。如果雜湊值相同,還要呼叫equals。 2. LinkedHashSet類

在Set介面中,還有一個實現類,這個實現類叫做LinkedHashSet LinkedHashSet 裡面除了雜湊表之外還有一個雙向連結串列。連結串列的作用是保證有序。 所以說LinkedHashSet這個集合可以保證有序。 注意: Set介面是無序的,但是他不能保證下面的所有實現類都是無序的。 1. 可變引數

可變引數指的是引數的個數可以發生變化。 格式: 修飾符 返回值型別 方法名(引數型別… 變數名) { //… } 1. 可變引數方法在呼叫的時候,引數可以傳遞任意個。(0個1個或者多個) 2. 傳遞的引數必須要是同一個資料型別。 3. 可變引數本質是陣列,使用方式和陣列一模一樣 4. 可變引數本質是陣列,所以呼叫帶有可變引數的方法時也可以傳遞陣列。 注意事項: 1. 可變引數本質是陣列, 不能和陣列構成過載。 2. 可變引數在一個方法中,最多隻能有一個. 3. 如果有可變引數,那麼可變引數只能出現在最後一個引數位置

五、Collection工具類

Collections是操作集合的工具類 Collection是單列集合的頂層介面。 1).常用方法: public static boolean addAll(Collection c, T… elements) :往集合中新增一些元素。 public static void shuffle(List<?> list) 打亂順序 :打亂集合順序。 public static void sort(List list) :將集合中元素按照預設規則排序。 public static void sort(List list ,Comparator<? super T> ) :將集合中元素按照指定規則排序。

2).Collections中的sort方法 static void sort(List list): 對集合中的內容進行排序。這種方式叫做自然排序。 自然排序指的是要排序的這個東西本身就具備排序的功能,在java中,只有實現Comparable介面,才具備自然排序的功能,才可以使用sort(List list)進行排序只有實現Comparable介面,才意味著這個物件具有比較的功能。

當我們呼叫Collections的sort方法的時候,系統會自動呼叫Comparable介面的compareTo方法進行比較。如果我們自定義了一個物件,如物件屬性要進行排序,需實現Comparable介面,在該類裡重寫compareTo方法。 如果返回值是一個負數,表示當前物件小於引數物件 如果返回值是0,表示這兩個物件相同。 如果返回值是正數,表示當前物件大於引數物件。

口訣: 升序就是我減他

*/ @Override public int compareTo(Person o) { return this.age - o.age; 1. .比較器排序 static void sort(List list, Comparator c):對集合中的內容進行排序; 我們可以找一個法官,對集合中的內容進行排序,這個法官就是比較器。 兩種排序: 自然排序:物件本身就具備排序的功能。當使用一個類實現Comparable介面時,那麼這個類的物件就具備了排序的功能。 比較器排序:物件本身並不具備排序功能. 我們可以找一個裁判,找一個法官來幫物件進行排序,這個法官就是比較器。

當呼叫Collections的sort方法進行比較器排序時,系統會自動呼叫這個compare對兩個物件進行比較。 如果這個方法返回值是負數,表示第一個物件小於第二個物件 如果這個方法返回值是0,表示這兩個物件相同 如果這個方法返回值是正數,表示第一個獨享大於第二個物件

升序就是一減二

*/ @Override public int compare(Student o1, Student o2) { int result = o1.getAge() - o2.getAge(); if(result == 0) { return o1.getCup() - o2.getCup(); } return result; } 其中:comparable和comparator均為介面