泛型入門 一

2021-07-09 14:45:12 字數 3369 閱讀 7275

比如現在把乙個字串型別的值放入到集合裡面,這個時候,這個值放入到集合之後,失去本事的型別,只能是object型別,

這個時候,比如想要對這個值進行型別轉換,很容易出現型別轉換錯誤,怎麼解決這個問題,可以使用泛型來解決。

又有,假如定義乙個方法或者類但是其中的資料型別暫時不可以確定,就可以使用泛型,讓呼叫它的物件來確定資料型別。可以增強**的通用性。例如有兩個函式名字為swap他們的返回值是string 和 int (函式過載),而且函式裡面的**邏輯是一樣的,只有資料型別不一樣,那麼就可以用泛型來讓使用者來確定是使用string 或者 integer。

list(列表): list的特徵是其元素以線性方式儲存,集合中可以存放重複物件。 

arraylist

是乙個可改變大小的陣列.當更多的元素加入到arraylist中時,其大小將會動態地增長.內部的元素可以直接通過get與set方法進行訪問,因為arraylist本質上就是乙個陣列.

linkedlist 

是乙個雙鏈表,在新增和刪除元素時具有比arraylist更好的效能.但在get與set方面弱於arraylist.

當然,這些對比都是指資料量很大或者操作很頻繁的情況下的對比,如果資料和運算量很小,那麼對比將失去意義.

vector

和arraylist類似,但屬於強同步類。如果你的程式本身是執行緒安全的(thread-safe,沒有在多個執行緒之間共享同乙個集合/物件),那麼使用arraylist是更好的選擇。

vector和arraylist在更多元素新增進來時會請求更大的空間。vector每次請求其大小的雙倍空間,而arraylist每次對size增長50%.

而linkedlist 

還實現了 

queue

介面,該介面比list提供了更多的方法,包括 offer(),peek(),poll()等.

注意: 預設情況下arraylist的初始容量非常小,所以如果可以預估資料量的話,分配乙個較大的初始值屬於最佳實踐,這樣可以減少調整大小的開銷。

以linked為例子演示效果

public class listgeneric 

@test

public void intigeneric()

system.out.println("***************=");

//2.增強for

for (string s : list)

//3.使用迭代器

iteratorit = list.iterator();

while(it.hasnext())

}}

hashset:雜湊表是通過使用稱為雜湊法的機制來儲存資訊的,元素並沒有以某種特定順序來存放;

linkedhashsettreeset:提供乙個使用樹結構儲存set介面的實現,物件以公升序順序儲存,訪問和遍歷的時間很快

使用例子:

public class setgeneric 

@test

public void intigeneric()

collections.sort(list);

system.out.println(list);

//第二種

final treeset ts = new treeset(set);

ts.comparator();

system.out.println(ts);

system.out.println("**********==s");

// 兩種遍歷set 的方法

// 1.迭代器 2.增強for

// 1.使用迭代器

iteratorit = set.iterator();

while (it.hasnext())

system.out.println("*****====");

// 2.增強for

for (string s : set)

}}

map主要用於儲存健值對,根據鍵得到值,因此不允許鍵重複(重複了覆蓋了),但允許值重複。

hashmap 是乙個最常用的map,它根據鍵的hashcode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得資料的順序是完全隨機的。hashmap最多隻允許一條記錄的鍵為null;允許多條記錄的值為 null;hashmap不支援執行緒的同步,即任一時刻可以有多個執行緒同時寫hashmap;可能會導致資料的不一致。如果需要同步,可以用 collections的synchronizedmap方法使hashmap具有同步的能力,或者使用concurrenthashmap。

hashtable與 hashmap類似,它繼承自dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支援執行緒的同步,即任一時刻只有乙個執行緒能寫hashtable,因此也導致了 hashtable在寫入時會比較慢。

linkedhashmap儲存了記錄的插入順序,在用iterator遍歷linkedhashmap時,先得到的記錄肯定是先插入的.也可以在構造時用帶引數,按照應用次數排序。在遍歷的時候會比hashmap慢,不過有種情況例外,當hashmap容量很大,實際資料較少時,遍歷起來可能會比linkedhashmap慢,因為linkedhashmap的遍歷速度只和實際資料有關,和容量無關,而hashmap的遍歷速度和他的容量有關。

treemap實現sortmap介面,能夠把它儲存的記錄根據鍵排序,預設是按鍵值的公升序排序,也可以指定排序的比較器,當用iterator 遍歷treemap時,得到的記錄是排過序的。

一般情況下,我們用的最多的是hashmap,hashmap裡面存入的鍵值對在取出的時候是隨機的,它根據鍵的hashcode值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。

在map 中插入、刪除和定位元素,hashmap 是最好的選擇。

treemap取出來的是排序後的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那麼treemap會更好。

linkedhashmap 是hashmap的乙個子類,如果需要輸出的順序和輸入的相同,那麼用linkedhashmap可以實現,它還可以按讀取順序來排列,像連線池中可以應用。

例子演示

public class mapgeneric 

@test

public void intigeneric()

system.out.println("*****==");

// 2.得到key和value的關係

set> entryset = map.entryset();

// 遍歷集合

for (entryentry : entryset)

}}

泛型 泛型入門 萬用字元 泛型的其它應用

泛型可以解決資料型別的安全性問題,它主要的原理是 是在類宣告的時候通過乙個標識表示類中某個屬性的型別或者是某個方法的返回值及引數型別。這樣在宣告類或例項化的時候只要指定好需要的型別即可。泛型的定義格式 訪問許可權 class 類名稱 泛型型別1,泛型型別2,泛型型別3 訪問許可權 返回值型別宣告 方...

Java泛型入門

一 為什麼要用泛型?什麼是泛型?泛型好處都有啥,誰說對了就 隨便引一篇文章 二 主要談用法 1 泛型類 修飾符 class 類名 泛型名1,泛型名2,2 泛型介面 修飾符 inte ce 類名 泛型名1,泛型名2,3 泛型方法 修飾符 泛型名1,泛型名2,返回型別 方法名 引數列表 4 泛型默繼承o...

C 泛型程式設計入門

所謂泛型程式設計,就是不依賴於某一具體型別而使 具有很強適應性的程式設計正規化。我們看下面的求和函式是如何一步步進化成最純粹的泛型程式設計的。最開始,sum函式是這樣子的 double sum const std vector vec return result 顯然這個函式只適用於std vect...