JAVA 泛型機制 List排序 Set集合

2021-08-26 12:30:42 字數 2795 閱讀 1693

泛型機制:

(1)jdk1.5版本開始使用的新特性,本質是進行」引數化型別」,在類,介面,方法的定義上都可以使用,用來指定資料型別名的。

(2)集合在定義時,可以用泛型機制來指定元素的型別,這樣編譯器在編譯期間就可以進行檢查元素型別是否匹配,避免了程式在執行時出現過多的錯誤。

(3)集合框架中的所有型別(介面,抽象類,實現類)都使用了泛型機制。

(4)泛型機制的引數只能傳引用型別。

list排序

comparable介面:

如何定義集合中元素之間的大小之分?我們需要在定義元素型別時實現comparable介面,實現介面內的compareto(e e)。實現此介面的型別的物件之間可以進行比較。

方法: int compareto(e e)

比較規則:

(1)this與e比較,this-e,按照公升序排序

如果大於0,返回大於0的乙個數

如果等於0,返回0

如果小於0,返回小於0的乙個數

(2)e-this,降序排序

工具類:collections

提供了乙個sort(collection c)方法,對集合裡的元素進行排序。

comparator比較器介面:

如果元素型別已經實現了comparable介面,定義了預設的比較規則。之後,再想換其他比較規則時,不修改原始碼。可以利用比較器介面來重新定義比較規則。

方法: int compare(e o1,e o2)

比較規則:

公升序: o1-o2

降序: o2-o1

set介面:

儲存時採用了hash演算法機制,計算儲存位置。

特點1: 無序,儲存的元素與新增順序無關

特點2: 不可重複(使用元素的equals方法來判定是否重複)

特點3: 能儲存null元素,只能儲存一次。

hash演算法機制:

set集合設計的初衷時無序不可重複,因此當向集合新增(或檢索元素)時我們需要呼叫equals方法來一一校驗。但是當集合的元素過多時,校驗的次數明顯很多,因此校驗效率很低。

那麼如何提高效率呢?

我們為元素提供了乙個hash演算法(雜湊),用於返回此元素的乙個雜湊值(int值)。兵器在集合所佔的記憶體中開闢很多小的區域,每個區域用於儲存一定範圍的雜湊值的元素。在我們新增元素或者是檢索元素時,先獲取此元素的雜湊值,然後去對應的區域內查詢遍歷(大大降低了比較次數)。

–如果在這個區域沒有找到物件,說明集合中可以新增這個物件。

–如果有,然後檢視兩個物件的equals的返回值:

–如果為true, 不能新增

–如果為false, 可以新增,新增至對應的鍊錶結構中(盡可能的避免發生)

重寫hashcode方法:

重寫規則:盡可能的讓所有的成員變數都參與運算,盡可能的避免出現hash值碰撞。

注意:

重寫的必要性:

(1)如果重寫了equals(), 有必要重寫hashcode方法

(2)如果equals()返回true, hashcode返回值有必要相同

(3)如果equals()返回false,hashcode返回值不一定相同;如果返回值不同,可以提高檢索的效率。

反過來就是:

(1)hashcode值相同,equals方法可能不同。

(2)hashcode值不同,equals方法一定不同。

hashcode方法:

object是引用型別的父類,提供了hashcode()方法以及equals()方法,因此我們在定義型別時,一般都重寫hashcode和equals方法。

重寫的重要性:

equals方法我們用來判斷集合中的元素是否重複。

hashcode方法我們在使用set集合時,必須要重寫,因為我們採用的hash演算法計算set集合元素的儲存位置。

int hashcode():

object提供的方法是通過位址計算hash值,不可控,我們需要在自定義類中重寫此方法。

重寫原則:盡可能的讓所有成員變數都參與運算;盡可能的減少hash值的碰撞。

set集合的遍歷:

因為set集合是無序的,無下標可言,因此不能使用經典for迴圈。

可以使用迭代器原理:

(1) 呼叫集合的iterator()獲取迭代器

(2) 使用foreach迴圈

set集合的元素:

不能輕易修改參與hash值演算法的成員變數,否則容易引起記憶體溢位。

原因:成員變數修改後,會出現新的hash值,但是儲存位置還在原hash值的位置上。因此操作時,找不到具體的儲存位置。

set集合的子類:

hashset:無序,不重複,底層使用hash演算法計算儲存位置,增加刪除時效率高。

linkedhashset:是hashset的子類底層使用hash演算法計算儲存位置,同時使用鍊錶來維護順序,順序與新增順序一致。在檢視檢索時,效率比較高 。

treeset:是sortedset子介面的實現類,使用二叉樹的資料結構維護元素的順序。

list泛型排序的方法

如果這樣定義 listlist newlist 那麼只需要用list.sort 即可。就會按照英文單詞進行排序。但是如果這個string是如下類呢?public class dto public int id public string name 這樣定義 listlist newlist 想按照n...

List泛型集合物件排序

本文的重點主要是解決 list物件集合的排序功能。一 list.sort 方法 msdn對這個無參sort 方法的介紹 使用預設比較器對整個list中的元素進行排序。1.1.對於數字型別的呼叫 呼叫結果 為公升序,無法滿足降序。示例 1.2.對於字串型別的呼叫 呼叫結果 把值解析成拼音字母,按照首個...

使用List 泛型,怎麼排序

在工作中經常會遇到物件陣列根據某個屬性進行排序的問題。這裡介紹乙個方法。以汽車為例 public class car set private string type public string type set car cars 現在需要排序,首先我們想根據weight進行排序,大家自然會想到冒泡演...