1. 程式人生 > 實用技巧 >2020/7/14 java 增強for 泛型 list介面 list介面 set介面

2020/7/14 java 增強for 泛型 list介面 list介面 set介面

1增強for迴圈

增強for迴圈是JDK1.5以後出來的一個高階for迴圈,專門用來遍歷陣列和集合的。它的內部原理其實是個Iterator迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。

格式:

for(元素的資料型別變數: Collection集合or陣列){
}

注意:新for迴圈必須有被遍歷的目標。目標只能是Collection或者是陣列。

建議:遍歷陣列時,如果僅為遍歷,可以使用增強for如果要對陣列的元素進行 操作,使用老式for迴圈可以通過角標操作。

2泛型

2.1泛型的引入

使用集合時,必須明確集合中元素的型別。這種方式稱為:泛型。

2.2泛型的定義與使用

我們在集合中會大量使用到泛型,這裡來完整地學習泛型知識。

泛型,用來靈活地將資料型別應用到不同的類、方法、介面當中。將資料型別作為引數進行傳遞。

2.21含有泛型的類

定義格式:修飾符 class 類名<代表泛型的變數> { }

class ArrayList<E>{
public booleanadd(Ee){ }
publicEget(intindex){ }
}

使用格式:建立物件時,確定泛型的型別

例如,ArrayList<String> list = new ArrayList<String>();

此時,變數E的值就是

String型別

class ArrayList<String>{
public booleanadd(Stringe){ }
publicStringget(intindex){ }
}

2.22含有泛型的介面

定義格式:修飾符 interface介面名<代表泛型的變數> { }

例如,API中的Iterator迭代器介面

例如,API中的Iterator迭代器介面
public interface Iterator<E> {
public abstract E next();
}

1、定義類時確定泛型的型別

例如

例如
public
final classScannerimplements Iterator<String>{ publicStringnext(){ } }

2、始終不確定泛型的型別,直到建立物件時,確定泛型的型別

2.3使用泛型的好處

將執行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗。

避免了型別強轉的麻煩。

2.4泛型萬用字元

泛型是在限定資料型別,當在集合或者其他地方使用到泛型後,那麼這時一旦明確泛型的資料型別,那麼在使用的時候只能給其傳遞和資料型別匹配的型別,否則就會報錯。

上述定義的printCollection方法中,由於定義的是列印集合的功能,應該是可以列印任意集合中元素的。但定義方法時,根本無法確定具體集合中的元素型別是什麼。為了解決這個"無法確定具體集合中的元素型別"問題,java中,為我們提供了泛型的萬用字元<?>

當使用泛型類或者介面時,傳遞的資料中,泛型型別不確定,可以通過萬用字元<?>表示。但是一旦使用泛型的萬用字元後,只能使用Object類中的共性方法,集合中元素自身方法無法使用

2.5泛型限定

限定泛型的上限

格式:? extends E

? 代表接收E型別或者E的子型別的元素

限定泛型的下限

格式:? super E

? 代表接收E型別或者E的父型別的元素

3List介面

3.1List介面介紹

它是一個元素存取有序的集合

它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素

有下標

3.2List介面中常用的方法

add(Object e):向集合末尾處,新增指定的元素

add(int index, Object e):向集合指定索引處,新增指定的元素,原有元素依次後移

remove(Object e):將指定元素物件,從集合中刪除,返回值為被刪除的元素

remove(int index):將指定索引處的元素,從集合中刪除,返回值為被刪除的元素

set(int index, Object e):將指定索引處的元素,替換成指定的元素,返回值為替

get(int index):獲取指定索引處的元素,並返回該元素

由於List集合擁有索引,因此List集合迭代方式除了使用迭代器之外,還可以使用索引進行迭代。

3.21Iterator的併發修改異常

在迭代過程中,使用了集合的方法對元素進行操作。導致迭代器並不知道集合中的變化,容易引發資料的不確定性。

併發修改異常解決辦法:在迭代時,不要使用集合的方法操作元素。

那麼想要在迭代時對元素操作咋辦?通過ListIterator迭代器操作元素是可以的,ListIterator的出現,解決了使用Iterator迭代過程中可能會發生的錯誤情況。

3.3List集合儲存資料的結構

1 堆疊,採用該結構的集合,對元素的存取有如下的特點:

先進後出

棧的入口、出口的都是棧的頂端位置

壓棧:就是存元素。即,把元素儲存到棧的頂端位置,棧中已有元素依次向棧底方向移動一個位置。

彈棧:就是取元素。即,把棧的頂端位置元素取出,棧中已有元素依次向棧頂方向移動一個位置。

2 佇列,採用該結構的集合,對元素的存取有如下的特點:

先進先出

佇列的入口、出口各佔一側

3 陣列,採用該結構的集合,對元素的存取有如下的特點:

查詢元素快:通過索引,可以快速訪問指定位置的元素

增刪元素慢

4 連結串列,採用該結構的集合,對元素的存取有如下的特點:

多個節點之間,通過地址進行連線

查詢元素慢

增刪元素快

3.4ArrayList集合

ArrayList集合資料儲存的結構是陣列結構。元素增刪慢,查詢快,由於日常開發中使用最多的功能為查詢資料、遍歷資料,所以ArrayList是最常用的集合。

許多程式設計師開發時非常隨意地使用ArrayList完成任何需求,並不嚴謹,這種用法是不提倡的。

3.5LinkedList集合

LinkedList集合資料儲存的結構是連結串列結構。方便元素新增、刪除的集合。

LinkedList集合資料儲存的結構是連結串列結構。方便元素新增、刪除的集合。

addFirst(E e)將指定元素插入該列表的開頭

addLast(E e)將指定元素新增到刺裂表的末尾

getFirst()返回刺裂表的第一個元素

getLst()返回此列表的最後一個元素

removeFirst()移除並返回此列表的第一個元素

removeLast()移除並返回此列表的最後一個元素

pop()從此列表所表示的堆疊處彈出一個元素 和removeFirst 效果相同

push()將元素推入此列表所表示的堆疊 和 addLast效果相同

isEmpty()如果列表不包含元素則返回true

LinkedList是List的子類,List中的方法LinkedList都是可以使用

3.6Vector集合

Vector集合資料儲存的結構是陣列結構,為JDK中最早提供的集合。Vector中提供了一個獨特的取出方式,就是列舉Enumeration,它其實就是早期的迭代器。此介面Enumeration的功能與 Iterator 介面的功能是類似的。Vector集合已被ArrayList替代。列舉Enumeration已被迭代器Iterator替代。

lVector常見的方法:

addElement()將指定的元件新增到此向量的末尾使其大小增加1

elementAt()返回指定所引出的元件

elements 返回詞向量的元件的列舉

Enumeration常見方法

hasMoreElements()測試此列舉是否包含更多的元素

nextElement()如果此列舉至少還有一個可以提供的元素則返回此列舉的下一個元素

4Set介面

4.1Set介面介紹

不能有重複元素 無序 沒有索引

4.2HashSet集合介紹

查閱HashSet集合的API介紹:此類實現Set介面,由雜湊表支援(實際上是一個 HashMap集合)。HashSet集合不能保證的迭代順序與元素儲存順序相同。

HashSet集合,採用雜湊表結構儲存資料,保證元素唯一性的方式依賴於:hashCode()與equals()方法。

4.3HashSet儲存JavaAPI中的型別元素

HashSet中儲存JavaAPI中提供的型別元素時,不需要重寫元素的hashCode和equals方法,因為這兩個方法,在JavaAPI的每個類中已經重寫完畢,如String類、Integer類等。

4.4HashSet儲存自定義型別元素

HashSet中存放自定義型別元素時,需要重寫物件中的hashCode和equals方法,建立自己的比較方式,才能保證HashSet集合中的物件唯一