国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】

這篇具有很好參考價(jià)值的文章主要介紹了【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm

??本章學(xué)習(xí)目標(biāo)

  • 掌握 Java 設(shè)置類集的主要目的以及核心接口的使用;
  • 掌握 Collection 接口的作用及主要操作方法;
  • 掌握 Collection 子接口 List、Set 的區(qū)別及常用子類的使用;
  • 掌握 Map 接口的定義及使用;
  • 掌握集合的4種輸出操作語(yǔ)法結(jié)構(gòu);
  • 掌握 Properties類的使用;
  • 了解類集工具類 Collections 的作用

1?? 類集框架介紹

在實(shí)際的開發(fā)中幾乎所有項(xiàng)目都會(huì)使用到數(shù)據(jù)結(jié)構(gòu)(核心意義在于解決數(shù)組的固定長(zhǎng)度限制問(wèn)題),所以為了開發(fā)者的使用方便, JDK1.0 提供了 Vector、Hashtable、Enumeration 等常見的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)類。而從 JDK1.2 開始, Java 又進(jìn)一步完善了自己的可用數(shù)據(jù)結(jié)構(gòu)操作,提出了完整的類集框架的概念。下面將為大家講解在類集框架之中較為常見的接口與類的使用。

在實(shí)際的項(xiàng)目開發(fā)中, 一定會(huì)出現(xiàn)保存多個(gè)對(duì)象的操作,根據(jù)之前學(xué)習(xí)的知識(shí)來(lái)講,此時(shí)會(huì)使用對(duì)象數(shù)組的概念。但是傳統(tǒng)的對(duì)象數(shù)組有一個(gè)問(wèn)題:長(zhǎng)度是固定的。因?yàn)榇巳毕?,所以?shù)組一般不會(huì)使用,而為了可以動(dòng)態(tài)地實(shí)現(xiàn)多個(gè)對(duì)象的保存,可以利用鏈表來(lái)實(shí)現(xiàn)一個(gè)動(dòng)態(tài)的對(duì)象數(shù)組,但是對(duì)于鏈表的數(shù)據(jù)結(jié)構(gòu)編寫會(huì)存在以下一些問(wèn)題。

  • 由于需要處理大量的引用關(guān)系,如果要開發(fā)鏈表工具類,對(duì)初學(xué)者而言難度較高;
  • 為了保證鏈表在實(shí)際的開發(fā)中可用,在編寫鏈表實(shí)現(xiàn)時(shí)必須更多地考慮到性能問(wèn)題;
  • 鏈表為了可以保存任意對(duì)象類型,統(tǒng)一使用了 Object 類型進(jìn)行保存。那么所有要保存的對(duì)象必會(huì)發(fā)生向上轉(zhuǎn)型,而在進(jìn)行對(duì)象信息取出時(shí)又必須強(qiáng)制性地向下轉(zhuǎn)型操作。如果在一個(gè)鏈表中所保存的數(shù)據(jù)不是某種類型,這樣的操作會(huì)帶來(lái)安全隱患。

綜上,可以得出一個(gè)結(jié)論:如果在開發(fā)項(xiàng)目里面由開發(fā)者自己去實(shí)現(xiàn)一個(gè)鏈表,那么不僅加大了項(xiàng)目的開發(fā)難度并且沒(méi)必要。因?yàn)樵谒械捻?xiàng)目里面都會(huì)存在數(shù)據(jù)結(jié)構(gòu)的應(yīng)用,在 Java 設(shè)計(jì)之初就考慮到了此類問(wèn)題,所以提供了一個(gè)與鏈表類似的工具類——Vector (向量類)。但是隨著時(shí)間的推移,這個(gè)類并不能很好地描述出所需要的數(shù)據(jù)結(jié)構(gòu),所以 Java 2(JDK1.2 之后) 提供了一個(gè)專門實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的開發(fā)框架——類集框架 (所有的程序接口與類都保存在 java.util 包中)。在JDK 1.5之后,泛型技術(shù)的引入,又解決了類集框架中,所有的操作類型都使用 Object 所帶來(lái)的安全隱患。而 JDK1.8又針對(duì)類集的大數(shù)據(jù)操作環(huán)境推出了數(shù)據(jù)流的分析操作功能 (MapReduce 操作)。

類集在整個(gè)Java 中最為核心的用處就在于其實(shí)現(xiàn)了動(dòng)態(tài)對(duì)象數(shù)組的操作,并且定義了大量的操作標(biāo)準(zhǔn)。在整個(gè)類集框架中,其核心接口為: Collection、ListSet、Map、Iterator、Enumeration等。

2?? 單列集合頂層接口:Collection

java.util.Collection 是進(jìn)行單對(duì)象保存的最大父接口,即每次利用 Collection 接口都只能保存一個(gè)對(duì)象信息。單對(duì)象保存頂層接口定義如下。

public interface Collection<E> extends Iterable<E>

通過(guò)定義可以發(fā)現(xiàn) Collection 接口中使用了泛型,這樣可以保證集合中操作數(shù)據(jù)類型的統(tǒng)一,同時(shí) Collection 接口屬于 Iterable 的子接口。

隨著Java 版本的不斷提升,Collection接口經(jīng)歷從無(wú)到有的使用以及定義結(jié)構(gòu)的不斷加強(qiáng),需要對(duì) Collection 接口的發(fā)展進(jìn)行以下幾點(diǎn)說(shuō)明。

  • Collection 接口是從JDK 1.2開始定義的,最初所有的操作數(shù)據(jù)都會(huì)使用 Object 進(jìn)行接收,這樣就會(huì)存在向下轉(zhuǎn)型的安全隱患;
  • JDK 1.5之后為了解決 Object 所帶來(lái)的安全隱患,使用泛型重新定義了 Collection 接口,同時(shí)為了進(jìn)一步定義迭代操作的標(biāo)準(zhǔn),增加了 Iterable接口(JDK 1.5時(shí)增加),使得Collection 接口又多了一個(gè)父接口;
  • JDK 1.8之后引入了 staticdefault 定義接口方法的定義,所以在 Collection 接口中的方法又得到了進(jìn)一步擴(kuò)充(主要是為了進(jìn)行數(shù)據(jù)流操作)。

Collection接口里面定義了9個(gè)常用操作方法,如下表所示。

方法名稱 類型 描述
public boolean add(E e) 普通 向集合里面保存數(shù)據(jù)
public boolean addAll(Collection<? extends E> c) 普通 追加一個(gè)集合
public void clear() 普通 清空集合,根元素為null
public boolean contains(Object o) 普通 判斷是否包含指定的內(nèi)容,需要 equals()支持
public boolean isEmpty() 普通 判斷是否是空集合(不是null)
public boolean remove(Object o) 普通 刪除對(duì)象,需要equals()支持
public int size() 普通 取得集合中保存的元素個(gè)數(shù)
public Object[] toArray() 普通 將集合變?yōu)閷?duì)象數(shù)組保存
public Iterator<E> iterator() 普通 Iterator接口實(shí)例化(Iterable接口定義)

對(duì)于上表所列出的方法,大家應(yīng)該要記住 add()iterator() 兩個(gè)方法,因?yàn)檫@兩個(gè)方法幾乎所有的項(xiàng)目都會(huì)使用到,同時(shí)在進(jìn)行 contains()remove() 兩個(gè)方法的操作時(shí),必須保證類中已經(jīng)成功地覆寫了 Object 類中的equals() 方法,否則將無(wú)法正常完成操作。

雖然 Collection 是單對(duì)象集合操作的頂層父接口,但是 Collection 接口本身卻存在一個(gè)問(wèn)題:無(wú)法區(qū)分保存的數(shù)據(jù)是否重復(fù)。所以在實(shí)際的開發(fā)中,往往會(huì)使用 Collection 的兩個(gè)子接口: List 子接口 (數(shù)據(jù)允許重復(fù))、 Set 子接口(數(shù)據(jù)不允許重復(fù)),繼承關(guān)系如下所示。

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm
圖1 Collection 及其子接口繼承關(guān)系

3?? List 子接口

List 子接口最大的功能是里面所保存的數(shù)據(jù)可以存在重復(fù)內(nèi)容,并且在 Collection 的子接口中,List 子接口是最為常用的一個(gè)子接口,在 List 接口中對(duì) Collection 接口的功能進(jìn)行了擴(kuò)充。 List子接口擴(kuò)充的方法如下所示。

方法名稱 類型 描述
public E get(int index) 普通 取得索引編號(hào)的內(nèi)容
public E set(int index, E element) 普通 修改指定索引編號(hào)的內(nèi)容
public ListIterator<E> listIterator() 普通 為L(zhǎng)istIterator接口實(shí)例化

在使用 List 接口時(shí)主要使用 ArrayListLinkedList 兩個(gè)子類來(lái)進(jìn)行接口對(duì)象的實(shí)例化操作。List 接口的繼承體系如下所示,接下來(lái)我們會(huì)一一介紹ArrayList 類、 LinkedList 類、Vector類、Stack類。

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm
圖2 List 及其子接口繼承關(guān)系

3.1 ArrayList 類

ArrayList 子類是 List子接口中最為常用的一個(gè)子類,下面通過(guò) ArrayList 類來(lái)實(shí)現(xiàn) List 接口的操作。

//	范例 1: List 基本操作
package com.xiaoshan.demo;
import java.util.ArrayList;
import java.util.List;

public class TestDemo  {
	public static void main(String[] args){
		//從JDK1.5 開始應(yīng)用了泛型,從而保證集合中所有的數(shù)據(jù)類型都一致
		List<String> all = new ArrayList<String>();   // 實(shí)例化 List 集合
		System.out.println("長(zhǎng)度:"+ all.size() +",是否為空:"+ all.isEmpty());
		all.add("Hello");                 	//保存數(shù)據(jù)
		all.add("Hello");                  	//保存重復(fù)元素
		all.add("World");                                                            //保存數(shù)據(jù)
		System.out.println("長(zhǎng)度:"+ alL.size() +",是否為空:"+ all.isEmpty());
		// Collection 接口定義size()方法取得了集合長(zhǎng)度, List子接口擴(kuò)充get()方法根據(jù)索引取得了數(shù)據(jù) 
		for (int x=0; x<all.size();x++){
			String str = all.get(x);		//取得索引數(shù)據(jù)
			System.out.println(str);		//直接輸出內(nèi)容
		}
	}
}

程序執(zhí)行結(jié)果:

長(zhǎng)度:0,是否為空:true 
長(zhǎng)度:3,是否為空:false
Hello
Hello
World

此程序通過(guò) ArrayList 子類實(shí)例化了 List 接口對(duì)象,這樣就可以使用 List 接口中定義的方法 (包括 Collection 接口定義的方法),由于List 接口相對(duì)于 Collection 接口中擴(kuò)充了 get()方法,所以可以利用循環(huán)的方式依次取出集合中的每一個(gè)保存數(shù)據(jù)。

?? 數(shù)組(Array)與列表(ArrayList)有什么區(qū)別?

數(shù)組(Array)中保存的內(nèi)容是固定的,而列表(ArrayList)中保存的內(nèi)容是可變的。在很多時(shí)候,列表(ArrayList) 進(jìn)行數(shù)據(jù)保存與取得時(shí)需要一系列的判斷,而如果是數(shù)組(Array) 只需要操作索引即可。

如果在已經(jīng)確定好長(zhǎng)度的前提下,完全可以使用數(shù)組(Array)來(lái)替代數(shù)組列表 (ArrayList),但是如果集合保存數(shù)據(jù)的內(nèi)容長(zhǎng)度是不固定的,那么就使用 ArrayList。

另外,在許多開發(fā)框架中會(huì)將數(shù)組與List 集合作為同一種形式。例如,在 Mybatis 框架中的參數(shù)及結(jié)果映射中,如果是數(shù)組或者是List集合,其最終的結(jié)果是完全相同的。關(guān)于這一點(diǎn)大家可以隨著技術(shù)的深入而有更深的體會(huì)。

ArrayListList接口的子類,所以也就是 Collection接口的子類,這樣就可以利用 ArrayListCollection 接口實(shí)例化(大部分情況下這樣的操作不會(huì)出現(xiàn)),但是如果直接使用 Collection接口對(duì)象將不具備 get()方法,只能將全部集合轉(zhuǎn)化為對(duì)象數(shù)組后才可以使用循環(huán)進(jìn)行輸出。

//	范例 2: Collection接口實(shí)例化操作
package com.xiaoshan.demo;
import java.util.ArrayList;
import java.util.Collection;

public class TestDemo  {
	public static void main(String[] args){
		Collection<String> all = new ArrayList<String>();
		all.add("Hello");            	//保存數(shù)據(jù)
		all.add("Hello");               //重復(fù)元素
		all.add("World");               //保存數(shù)據(jù)
		//Collection不具備List接口的get()方法,所以必須將其轉(zhuǎn)化為對(duì)象數(shù)組
		Object obj[] = all.toArray():	//變?yōu)閷?duì)象數(shù)組
		for (int x=0; x<obj.length; x++){ 	//采用循環(huán)輸出
			String str = (String) obj[x];	//強(qiáng)制向下轉(zhuǎn)型
			System.out.println(str);		//輸出數(shù)據(jù)
		}
	}
}			

程序執(zhí)行結(jié)果:

Hello
Hello
World

可以發(fā)現(xiàn),CollectionList接口的最大區(qū)別在于,List 提供了get() 方 法,這樣就可以根據(jù)索引取得內(nèi)容,在實(shí)際的開發(fā)中,此方法使用較多。但是需要提醒大家的是,范例2的輸出操作并不是集合的標(biāo)準(zhǔn)輸出操作,具體的輸出操作在下文講解。

范例2的操作是在集合中保存了String 類的對(duì)象,然而對(duì)于集合的操作,也可以保存自定義對(duì)象。而如果要正確地操作集合中的 remove()contains() 方法,則必須保證自定義類中明確地覆寫了 equals() 方法。

//	范例 3: 在集合里面保存對(duì)象
package com.xiaoshan.demo;
import java util.ArrayList;
import java.util.List;

class Book {	//創(chuàng)建一個(gè)自定義類
	private String title;
	private double price;

	public Book(String title, double price){
		this.title = title;
		this.price = price;
	}

	@Override
	public boolean equals(Object obj){   //必須覆寫此方法,否則remove()、contains()無(wú)法使用
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (!(obj instanceof Book)){
			return false;
		}
		Book book =(Book) obj;
		if (this.title.equals(book.title) && this.price == book.price){
			return true;
		}
		return false;
	}

	@Override
	public String toString(){
		return "書名:"+this.title+",價(jià)格:"+this.price+"\n";
	}
}

public class TestDemo {
	public static void main(String[] args){
		List<Book> all = new ArrayList<Book>();
		all.add(new Book("Java開發(fā)入門教程", 129.9));	//保存自定義類對(duì)象
		all.add(new Book("Java開發(fā)實(shí)戰(zhàn)經(jīng)典", 69.8)); 
		all.add(new Book("Oracle開發(fā)實(shí)戰(zhàn)經(jīng)典", 89.8));
		all.remove(new Book("Oracle開發(fā)實(shí)戰(zhàn)經(jīng)典", 89.8));	//需要使用equals()方法
		System.out.println(all);
	}
}

程序執(zhí)行結(jié)果:

[書名:Java開發(fā)入門教程,價(jià)格:129.9,
書名:Java開發(fā)實(shí)戰(zhàn)經(jīng)典,價(jià)格:69.8]

此程序?qū)崿F(xiàn)了自定義類對(duì)象的保存,由于設(shè)置的泛型限制,所以在集合保存數(shù)據(jù)操作中只允許保存 Book 類對(duì)象,同時(shí)為了可以使用集合中的 remove() 方法 , 在 Book 類中必須明確覆寫 equals() 方法。

3.2 LinkedList 類

List子接口中還存在一個(gè)LinkedList子類,而使用時(shí)大部分情況下都是利用子類為父接口實(shí)例化。ArrayListLinkedList的主要區(qū)別如下:

  • ArrayList 中采用順序式的結(jié)果進(jìn)行數(shù)據(jù)的保存,并且可以自動(dòng)生成相應(yīng)的索引信息;
  • LinkedList 集合保存的是前后元素,也就是說(shuō),它每一個(gè)節(jié)點(diǎn)中保存的是兩個(gè)元素對(duì)象, 一個(gè)它對(duì)應(yīng)的下一個(gè)節(jié)點(diǎn),以及另外一個(gè)它對(duì)應(yīng)的上一個(gè)節(jié)點(diǎn),所以 LinkedList 要占用比 ArrayList 更多的內(nèi)存空間。同時(shí) LinkedListArrayList 多實(shí)現(xiàn) 了一個(gè)Queue隊(duì)列數(shù)據(jù)接口。
//	范例 4: 觀察 LinkedList 的使用
public class TestDemo {
	public static void main(String[] args) {
		// 創(chuàng)建一個(gè)LinkedList對(duì)象
		LinkedList<Book> books = new LinkedList<>();

		// 添加元素到列表的末尾
		books.add(new Book("Java開發(fā)入門教程", 129.9));	//保存自定義類對(duì)象
		books.add(new Book("Java開發(fā)實(shí)戰(zhàn)經(jīng)典", 69.8));
		books.add(new Book("Oracle開發(fā)實(shí)戰(zhàn)經(jīng)典", 89.8));

		// 在列表指定位置插入元素
		books.add(1, new Book("Oracle從入門到放棄", 328.8));

		// 獲取列表中的第一個(gè)元素
		Book firstBook = books.getFirst();

		// 移除列表中的最后一個(gè)元素
		Book lastBook = books.removeLast();

		// 遍歷LinkedList并打印所有元素
		System.out.println("LinkedList元素:" + books);

		// 打印首個(gè)和最后一個(gè)元素
		System.out.println("首個(gè)元素: " + firstBook);
		System.out.println("最后一個(gè)元素: " + lastBook);
	}
}

程序執(zhí)行結(jié)果:

LinkedList元素:[書名:Java開發(fā)入門教程,價(jià)格:129.9
, 書名:Oracle從入門到放棄,價(jià)格:328.8
, 書名:Java開發(fā)實(shí)戰(zhàn)經(jīng)典,價(jià)格:69.8
]
首個(gè)元素: 書名:Java開發(fā)入門教程,價(jià)格:129.9

最后一個(gè)元素: 書名:Oracle開發(fā)實(shí)戰(zhàn)經(jīng)典,價(jià)格:89.8

在上邊代碼中,我們首先創(chuàng)建了一個(gè)LinkedList<Book>類型的對(duì)象,然后使用add()方法向列表添加元素。還通過(guò)指定索引位置使用add()方法將元素插入列表中。接下來(lái)使用getFirst()方法獲取列表中的第一個(gè)元素,使用removeLast()方法從列表中移除最后一個(gè)元素。

最后打印出每個(gè)元素,首個(gè)及最后一個(gè)元素。從輸出結(jié)果中可以看出,我們成功地創(chuàng)建了一個(gè)含有幾個(gè)元素的LinkedList,并且能夠插入、移除和遍歷它們。

3.3 Vector 類

在 JDK 1.0 時(shí)就已經(jīng)提供了Vector 類(當(dāng)時(shí)稱為向量類),同時(shí)由于其提供的較早,這個(gè)類被大量使用。但是到了 JDK 1.2時(shí)由于類集框架的引入,對(duì)于整個(gè)集合的操作就有了新的標(biāo)準(zhǔn),為了可以繼續(xù)保留 Vector 類,就讓這個(gè)類多實(shí)現(xiàn)了一 個(gè)List 接口 。

//	范例 5: 使用Vector
package com.xiaoshan.demo;
import java.util.List;
import java.util.Vector;

public class TestDemo{
	public static void main(String[] args){
		//由于都是利用子類為父類實(shí)例化,所以不管使用哪個(gè)子類, List接口功能不變
		List<String> all = new Vector<String>();             //實(shí)例化 List集合
		System.out.println("長(zhǎng)度:"+ all.size()+", 是否為空:"+ all.isEmpty());
		all.add("Hello");	//保存數(shù)據(jù)
		all.add("Hello");	//保存重復(fù)元素
		all.add("World");
		System.out.println("長(zhǎng)度:"+ all.size()+", 是否為空:"+ all.isEmpty());	
		
		// Collection接口定義了size()方法取得集合長(zhǎng)度, List子接口擴(kuò)充了get()方法,根據(jù)索引取得數(shù)據(jù)
		for (int x=0; x<all.size(); x++){
			String str = all.get(x);	//取得索引數(shù)據(jù) 
			System.out.println(str);	//直接輸出內(nèi)容
		}
	}
}

程序執(zhí)行結(jié)果:

長(zhǎng)度:0,是否為空:true
長(zhǎng)度:3,是否為空:false
Hello
Hello
World

此程序只是將 ArrayList 子類替換為 Vector 子類,由于最終都是利用子類實(shí)例化 List 接口對(duì)象, 所以最終的操作結(jié)果并沒(méi)有區(qū)別,而兩個(gè)操作子類最大的區(qū)別在于 Vector 類中的部分方法使用 synchronized 關(guān)鍵字聲明,也就是說(shuō)類中操作都是同步操作。

3.4 Stack 類

Stack 類表示棧,棧也是一種動(dòng)態(tài)對(duì)象數(shù)組,采用的是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)形式,即在棧中最早保存的數(shù)據(jù)最后才會(huì)取出,而最后保存的數(shù)據(jù)可以最先取出,如下所示。

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm
圖3 入棧與出棧

java.util 包中可以利用 Stack 類實(shí)現(xiàn)棧的功能,此類定義如下。

public class Stack<E> extends Vector<E>

通過(guò)定義可以發(fā)現(xiàn), Stack 類屬于 Vector 子類,但是需要注意的是,在進(jìn)行 Stack 類操作時(shí)不會(huì)使用 Vector 類定義的方法,主要使用 Stack 自己定義的方法。 Stack 類的常用方法如下所示。

方法 類型 描述
public E push(E item) 普通 數(shù)據(jù)入棧
public E pop() 普通 數(shù)據(jù)出棧,如果棧中沒(méi)有數(shù)據(jù),則調(diào)用此方法會(huì)拋出空棧異常(EmptyStackException)
//	范例 6: 觀察棧的操作
package com.xiaoshan.demo;
import java.util.Stack;

public class TestDemo {
	public static void main(String[] args){
		Stack<String> all = new Stack<String>();
		all.push("www.baidu.com");
		all.push("www.xiaoshan.com");
		all.push("www.ccc.cn");
		System.out.println(all.pop());
		System.out.println(all.pop());
		System.out.println(all.pop());
		System.out println(all.pop());	//  EmptyStackException
	}
}

程序執(zhí)行結(jié)果:

www.ccc.cn
www.xiaoshan.com
www.baidu.com
Exception in thread"main"java.util.EmptyStackException
	at java.util.Stack.peek(Unknown Source)
	at java.util.Stack.pop(Unknown Source)
	at com.xiaoshan.demo.TestDemo.main(TestDemo.java:14)

程序利用 Stack 類的 push() 方法向棧中保存數(shù)據(jù),而取得數(shù)據(jù)時(shí)只需要利用 pop()方法即可實(shí)現(xiàn)出棧操作,如果棧中沒(méi)有任何數(shù)據(jù),進(jìn)行出棧操作時(shí)則將拋出 “EmptyStackException” 異常。

3.5 List 各子類間的區(qū)別及聯(lián)系

  • ArrayListArrayList是基于數(shù)組實(shí)現(xiàn)的動(dòng)態(tài)數(shù)組,它可以根據(jù)需要自動(dòng)調(diào)整大小。它提供了快速的隨機(jī)訪問(wèn)和高效的插入/刪除操作。ArrayList允許存儲(chǔ)重復(fù)元素,并且繼承了AbstractList抽象類;
  • LinkedListLinkedList是基于雙向鏈表實(shí)現(xiàn)的列表。它僅保留到前后節(jié)點(diǎn)的引用,在插入/刪除操作時(shí)具有更好的性能。與ArrayList相比,LinkedList適用于頻繁的插入/刪除操作,但對(duì)于隨機(jī)訪問(wèn)較慢,它也允許存儲(chǔ)重復(fù)元素;
  • VectorVector是一個(gè)線程安全的列表實(shí)現(xiàn),與ArrayList類似,但它的所有方法都是同步的。它提供了與ArrayList相似的功能,不過(guò)由于同步的開銷,通常比ArrayList的性能稍差。由于Java 2的引入,推薦使用ArrayList而不是Vector;
  • StackStack是一個(gè)基于后進(jìn)先出(LIFO)原則的列表,它繼承自Vector類。它提供了常規(guī)的棧操作,如push(將元素推入棧頂)、pop(將元素彈出棧頂)和peek(查看棧頂元素)。

這些類都位于Java集合框架(Java Collections Framework)中,通過(guò)它們可以方便地對(duì)列表進(jìn)行操作。每個(gè)類都有其自己的特性和適用場(chǎng)景,根據(jù)實(shí)際需求選擇適當(dāng)?shù)念愂呛苤匾摹?br>

4?? Set 子接口

Collection 接口下又有另外一個(gè)比較常用的子接口為 Set 子接口,但是 Set 子接口并不像 List 子接口那樣對(duì) Collection 接口進(jìn)行了大量的擴(kuò)充,而是簡(jiǎn)單地繼承了接口。也就是說(shuō)在Set 子接口里面無(wú)法使用 get()方法根據(jù)索引取得保存數(shù)據(jù)的操作。在Set 子接口下有兩個(gè)常用的子類: HashSet、TreeSet

HashSet是散列存放數(shù)據(jù),而TreeSet是有序存放的子類。在實(shí)際的開發(fā)中,如果要使用TreeSet子類則必須同時(shí)使用比較器的概念,而 HashSet子類相對(duì)于TreeSet子類更加容易一些,所以如果沒(méi)有排序要求應(yīng)優(yōu)先考慮 HashSet子類。

//	范例 7: 觀察 HashSet 子類的特點(diǎn)
package com.xiaoshan.demo;
import java.util.HashSet;
import java.util.Set;

public class TestDemo{
	public static void main(String[] args){
		Set<String> all = new HashSet<String>();	//實(shí)例化Set接口
		all.add("abcdefg");	//保存數(shù)據(jù)
		all.add("小山")
		all.add("HELLO")
		all.add("小山");	//重復(fù)數(shù)據(jù)
		System.out.println(all);	//直接輸出集合
	}
}

程序執(zhí)行結(jié)果:

[abcdefg, 小山, HELLO]

此程序利用 HashSet 子類實(shí)例化了Set 接口對(duì)象,并且在Set 集合中不允許保存重復(fù)數(shù)據(jù)。

程序使用的是HashSet子類,并且根據(jù)名稱可以發(fā)現(xiàn),在這個(gè)子類上采用了 Hash算法(也稱為散列、無(wú)序)。這種算法就是利用二進(jìn)制的計(jì)算結(jié)果來(lái)設(shè)置保存的空間,根據(jù)數(shù)值的不同,最終保存空間的位置也不同,所以利用Hash算法保存的集合都是無(wú)序的,但是其查找速度較快。

而如果希望保存的數(shù)據(jù)有序,那么可以使用 Set 接口的另外一個(gè)子類: TreeSet 子類。

//	范例 8: 使用TreeSet 子類
package com.xiaoshan.demo;
import java.util.Set;
import java.util.TreeSet;

public class TestDemo {
	public static void main(String[] args){
		Set<String> all = new TreeSet<String>();	// 實(shí)例化Set接口
		all.add("abcdefg");	//保存數(shù)據(jù)
		all.add("小山");
		all.add("HELLO");
		all.add("小山");	//重復(fù)數(shù)據(jù)
		System.out.println(all);	//直接輸出集合
	}
}

程序執(zhí)行結(jié)果:

[HELLO, abcdefg, 小山]

TreeSet 子類屬于排序的類集結(jié)構(gòu),所以當(dāng)使用 TreeSet 子類實(shí)例化 Set 接口后,所保存的數(shù)據(jù)將會(huì)變?yōu)橛行驍?shù)據(jù),默認(rèn)情況下按照字母的升序排列。

4.1 關(guān)于數(shù)據(jù)排序的說(shuō)明

TreeSet 子類保存的內(nèi)容可以進(jìn)行排序,但是其排序是依靠比較器接口(Comparable) 實(shí)現(xiàn)的,即如果要利用TreeSet 子類保存任意類的對(duì)象,并且按照自定義順序?qū)?duì)象排序,那么該對(duì)象所在的類必須要實(shí)現(xiàn) java.lang.Comparable接口。

在前面的講解常用類庫(kù)時(shí)的文章中,曾經(jīng)講解過(guò)比較器的使用,現(xiàn)在在TreeSet子類中,由于其不允許保存重復(fù)元素 (compareTo() 方法的比較結(jié)果返回0),如果說(shuō)此時(shí)類中存在5個(gè)屬性,但是只比較了3個(gè)屬性,并且這3個(gè)屬性的內(nèi)容完全相同 (其余兩個(gè)屬性不同),那么TreeSet 也會(huì)認(rèn)為是相同內(nèi)容,從而不會(huì)保存該數(shù)據(jù),因此會(huì)出現(xiàn)數(shù)據(jù)丟失的情況。

//	范例 9: 利用TreeSet 保存自定義類對(duì)象
package com.xiaoshan.demo;
import java.util.Set;
import java.util.TreeSet;

class Book implements Comparable<Book>{	//需要實(shí)現(xiàn)Comparable 接口
	private String title;
	private double price;
	
	public Book(String title, double price){
		this.title = title;
		this.price = price;
	}
	
	@Override
	public String toString(){
		return " 書名:"+this.title+",價(jià)格:"+this.price+"\n";
	}
	
	@Override
	public int compareTo(Book o){      	//排序方法,比較所有屬性
		if (this.price > o.price){
			return 1;
		}else if(this.price < o.price){
			return -1;
		}else{
			return this.title.compareTo(o.title);    	//調(diào)用String類的比較大小
		}
	}
}

public class TestDemo{
	public static void main(String[] args){
		Set<Book> all = new TreeSet<Book>();	// 實(shí)例化Set接口
		all.add(new	Book("Java開發(fā)實(shí)戰(zhàn)寶典",79.8));	//保存數(shù)據(jù)
		all.add(new	Book("Java開發(fā)實(shí)戰(zhàn)寶典",79.8));	//全部信息重復(fù)
		all.add(new	Book("JSP開發(fā)實(shí)戰(zhàn)寶典",79.8));	//價(jià)格信息重復(fù)
		all.add(new Book("Android開發(fā)實(shí)戰(zhàn)寶典",89.8)); 	//都不重復(fù)
		System.out.println(all);	
	}
}

程序執(zhí)行結(jié)果:

[書名:JSP開發(fā)實(shí)戰(zhàn)寶典,價(jià)格:79.8,
書名:Java開發(fā)實(shí)戰(zhàn)寶典,價(jià)格:79.8,
書名:Android開發(fā)實(shí)戰(zhàn)寶典,價(jià)格:89.8]

此程序首先利用 TreeSet 子類保存了幾個(gè) Book 類對(duì)象,由于 Book 類實(shí)現(xiàn)了 Comaprable 接口,所以會(huì)自動(dòng)將所有保存的 Book 類對(duì)象強(qiáng)制轉(zhuǎn)換為 Comparable 接口對(duì)象,然后調(diào)用 compareTo() 方法進(jìn)行排序,如果發(fā)現(xiàn)比較結(jié)果為0則認(rèn)為是重復(fù)元素,將不再進(jìn)行保存。因此 TreeSet 數(shù)據(jù)的排序以及重復(fù)元素的消除依靠的都是 Comparable 接口。

4.2 關(guān)于重復(fù)元素的說(shuō)明

TreeSet 利用 Comparable 接口實(shí)現(xiàn)重復(fù)元素的判斷,但是這樣的操作只適合支持排序類集操作環(huán)境下;而其他子類(例如: HashSet) 如果要消除重復(fù)元素,則必須依靠 Object 類中提供的兩個(gè)方法。

  • 取得哈希碼: public int hashCode();
  • 對(duì)象比較: public boolean equals(Object obj)。

依靠著兩個(gè)方法,先通過(guò)第一個(gè)方法判斷對(duì)象的哈希碼是否相同,若不同則說(shuō)明一定不是同一個(gè)對(duì)象,則相同則繼續(xù)比較,通過(guò)第二個(gè)方法再將對(duì)象的屬性進(jìn)行依次的比較。

對(duì)于 hashCode()equals()兩個(gè)方法的使用可以換個(gè)角度來(lái)看。例如:如果要核查一個(gè)人的信息,肯定先要通過(guò)身份證編號(hào)查找到這個(gè)編號(hào)的信息(hashCode()方法負(fù)責(zé)編號(hào)), 再利用此身份證信息與個(gè)人信息進(jìn)行比較(equals()進(jìn)行屬性的比較) 后才可以確定結(jié)果。

//	范例 10: 利用HashSet子類保存自定義類對(duì)象
package com.xiaoshan.demo;
import java.util.Set;
import java.util.HashSet;

class Book{
	private String title;
	private double price;
	
	public Book(String title, double price){
		this.title = title;
		this.price = price;
	}
	
	@Override
	public int hashCode(){
		final int prime = 31;
		int result = 1;
		long temp;
		temp = Double.doubleToLongBits(price);
		result = prime* result +(int)(temp^(temp>>>32));
		result = prime* result +((title == null) ? 0 : title.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj){
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Book other =(Book) obj;
		if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price)){
			return false;
		}
		if (title == null){
			if (other.title != null){
				return false;
			}else if(!title.equals(other.title)){
				return false;
			}
			return true;
		}
	}
	
	@Override
	public String toString(){
		return "書名:"+this.title+",價(jià)格:"+ this.price+"\n";
	}
}

public class TestDemo{
	public static void main(String[] args){
		Set<Book> all = new HashSet<Book>();		//實(shí)例化Set接口
		all.add(new Book("Java開發(fā)實(shí)戰(zhàn)經(jīng)典",79.8)); 	//保存數(shù)據(jù)
		all.add(new Book("Java開發(fā)實(shí)戰(zhàn)經(jīng)典",79.8)); 	//全部信息重復(fù)
		all.add(new Book("JSP開發(fā)實(shí)戰(zhàn)經(jīng)典",79.8));	//價(jià)格信息重復(fù)
		all.add(new Book("Android開發(fā)實(shí)戰(zhàn)經(jīng)典",89.8));	//都不重復(fù)
		System.out.println(all);
	}
}

程序執(zhí)行結(jié)果:

[書名:Android開發(fā)實(shí)戰(zhàn)經(jīng)典,價(jià)格:89.8,
書名:JSP開發(fā)實(shí)戰(zhàn)經(jīng)典,價(jià)格:79.8,
書名:Java開發(fā)實(shí)戰(zhàn)經(jīng)典,價(jià)格:79.8]

此程序?qū)崿F(xiàn)了集合中重復(fù)元素的清除,利用的就是 hashCode()equals() 兩個(gè)方法,所以在進(jìn)行非排序集合操作時(shí),只要是判斷重復(fù)元素依靠的永遠(yuǎn)都是 hashCode()equals()

5?? 取出集合元素

由于集合中往往會(huì)保存多個(gè)對(duì)象數(shù)據(jù),所以一般進(jìn)行集合輸出時(shí)都會(huì)采用循環(huán)的方式完成。而在 Java 中,集合的輸出操作有4種形式: Iterator 輸出、 ListIterator 輸出、 foreach (加強(qiáng)for 循環(huán) ) 輸出、 Enumeration 輸出。

5.1 迭代輸出:Iterator

Iterator (迭代器)是集合輸出操作中最為常用的接口,而在 Collection 接口中也提供了直接為 Iterator 接口實(shí)例化的方法 iterator(), 所以任何集合類型都可以轉(zhuǎn)換為 Iterator接口輸出。

在JDK1.5之前,Collection 接口會(huì)直接提供 iterator() 方法,但是到了JDK1.5之后,為了可以讓更多的操作支持Iterator 迭代輸出,單獨(dú)建立了 Iterable 接口,同時(shí)在這個(gè)接口里只定義了一個(gè) iterator() 的抽象方法。所謂迭代器就好比排隊(duì)點(diǎn)名一樣,從前向后開始,一邊判斷是否有人,一邊進(jìn)行操作。

Iterator 接口中一共定義了兩個(gè)抽象方法,如下所示。

方法 類型 描述
public boolean hasNext() 普通 判斷是否還有內(nèi)容
public E next() 普通 取出當(dāng)前內(nèi)容

當(dāng)使用 Iterator接口輸出時(shí),往往都先利用 hasNext() 改變指針位置,同時(shí)判斷是否有數(shù)據(jù),如果當(dāng)前指針?biāo)谖恢么嬖跀?shù)據(jù),則利用 next() 取出數(shù)據(jù),這兩個(gè)方法的作用如下所示。

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm
圖4 Iterator迭代器操作流程

在前面講解 IO操作的文章中,曾經(jīng)講解過(guò)一個(gè) java.util.Scanner 的類,實(shí)際上 Scanner 就是 Iterator 接口的子類,所以在Scanner使用時(shí)才要求先利用 hasNextXxx() 判斷是否有數(shù)據(jù),再利用 nextXxx()取得數(shù)據(jù)。

//	范例 11: 使用 Iterator 輸出集合
package com.xiaoshan.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestDemo  {
	public static void main(String[] args){
		List<String> all = new ArrayList<String>();	//實(shí)例化List集合
		all.add("Hello");	//保存數(shù)據(jù)
		all.add("Hello");
		all.add("World");
		Iterator<String> iterator= all.iterator(); 	//實(shí)例化Iterator接口
		while (iterator.hasNext()){		//判斷是否有數(shù)據(jù)
			String str = iter.next();	//取出當(dāng)前數(shù)據(jù)
			System.out.println(str);	//輸出數(shù)據(jù)
		}
	}
}

程序執(zhí)行結(jié)果:

Hello
Hello
World

此程序利用 List 接口的 iterator()方法 (Collection 接口繼承而來(lái)) 將全部集合轉(zhuǎn)變?yōu)?Iterator 輸出,由于不確定循環(huán)次數(shù),所以使用 while循環(huán)進(jìn)行迭代輸出。

Iterator接口定義了一個(gè)刪除數(shù)據(jù)的操作方法,但是對(duì)不同的版本,此方法也存在以下兩種定義。

  • JDK 1.8以前:public void remove();
  • JDK 1.8之后:default void remove()。

在JDK 1.8之前 remove()屬于一個(gè)普通的刪除方法,而JDK 1.8之后將其定義為一個(gè)接口的 default方法。而之所以提供這個(gè)方法,是因?yàn)樵谑褂?Iterator輸出數(shù)據(jù)時(shí),如果利用集合類 (Collection、List、Set) 提供的 remove()方法會(huì)導(dǎo)致程序中斷執(zhí)行的問(wèn)題,而如果非要進(jìn)行集合元素的刪除,只能利用 Iterator 接口提供的 remove()方法才可以正常完成。

//	范例 12: 觀察刪除問(wèn)題
package com.xiaoshan.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestDemo{
	public static void main(String[] args){
		List<String> all=new ArrayList<String>();	//實(shí)例化List集合
		all.add("Hello");		//保存數(shù)據(jù)
		all.add("java");
		all.add("World");
		all.add("xiaoshan");
		Iterator<String> iterator= all.iterator();	//實(shí)例化Iterator接口
		while (iterator.hasNext()){
			String str = iter.next();	//取出當(dāng)前數(shù)據(jù)
			if ("java".equals(str)){
				all.remove(str);	//此代碼一執(zhí)行,輸出將中斷
			}
			System.out.println(str);//輸出數(shù)據(jù)
		}
	}
}

程序執(zhí)行結(jié)果:

Hello
java
Exception in thread"main" java.util.ConcurrentModificationException

程序并沒(méi)有完成正常輸出,這是因?yàn)樵诘敵鰰r(shí)進(jìn)行了集合數(shù)據(jù)的錯(cuò)誤刪除操作,而要避免此類問(wèn)題,只能利用Iterator接口提供的 remove() 方法。但是需要注意的是,從實(shí)際的開發(fā)來(lái)講,集合輸出中幾乎不會(huì)出現(xiàn)刪除數(shù)據(jù)的操作,所以對(duì)此概念了解即可。

同時(shí)也希望大家要記住,在集合的操作中,增加數(shù)據(jù)(add())以及迭代輸出操作是較為核心的部分,對(duì)于此操作模式一定要熟練掌握。

5.2 雙向迭代:Listlterator

雖然利用Iterator 接口可以實(shí)現(xiàn)集合的迭代輸出操作,但是 Iterator 本身卻存在一個(gè)問(wèn)題:只能進(jìn)行由前向后的輸出。所以為了讓輸出變得更加靈活,在類集框架中就提供了一個(gè) ListIterator 接口,利用此接口可以實(shí)現(xiàn)雙向迭代。 Listlterator 屬于Iterator 的子接口,此接口常用方法如下所示。

方法 類型 描述
public boolean hasPrevious() 普通 判斷是否有前一個(gè)元素
public E previous() 普通 取出前一個(gè)元素
public void add(E e) 普通 向集合追加數(shù)據(jù)
public void set(E e) 普通 修改集合數(shù)據(jù)

ListIterator 接口中除了可以繼續(xù)使用 Iterator 接口的 hasNext()next()方法,也具備了向前迭代的操作(hasPrevious()、previous()), 同時(shí)還提供了向集合追加數(shù)據(jù)和修改數(shù)據(jù)的支持。

從實(shí)際的開發(fā)來(lái)講,絕大多數(shù)情況如果要進(jìn)行集合的輸出都會(huì)使用Iterator接口,相較而言ListIterator接口在實(shí)際使用中并不常見。同時(shí)通過(guò)ListIterator接口的定義可以發(fā)現(xiàn),該接口除了支持輸出之外,還可以進(jìn)行集合更新 (增加、修改、刪除), 但是這些操作在實(shí)際開發(fā)中使用得非常有限。

Listlterator 是專門為 List 子接口定義的輸出接口,所以 ListIterator 接口對(duì)象的實(shí)例化可以依靠 List 接口提供的方法:

public ListIterator<E> listIterator()

實(shí)際上迭代器本質(zhì)上就是一個(gè)指針的移動(dòng)操作,而 ListIteratorIterator的迭代處理原理類似。所以如果要進(jìn)行由后向前迭代,必須先進(jìn)行由前向后迭代。

//	范例 13: 完成雙向迭代
package com.xiaoshan.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Listlterator;

public class TestDemo {
	public static void main(String[] args){
		List<String> all = new ArrayList<String>(); //實(shí)例化List接口對(duì)象 
		all.add("www.xiaoshan.com");	//向集合保存數(shù)據(jù)
		all.add("www.baidu.com");
		all.add("www.csdn.cn");
		System.out.print("由前向后輸出:");		
		ListIterator<String> iterator = all.listIterator();		//實(shí)例化Listlterator接口
		while (iterator.hasNext()){		//由前向后迭代
			String str = iter.next();	//取出當(dāng)前數(shù)據(jù)
			System.out.print(str + " 、");//輸出數(shù)據(jù)
		}
		System.out.print("\n由后向前輸出:");
		while(iter.hasPrevious()){			//由后向前迭代  
			String str = iter.previous();	//取出當(dāng)前數(shù)據(jù)
			System.out.print(str+" 、");	//輸出數(shù)據(jù)
		}
	}
}

程序執(zhí)行結(jié)果:

由前向后輸出:www.xiaoshan.com、www.baidu.com、www.csdn.cn、
由后向前輸出:www.csdn.cn、www.baidu.com、www.xiaoshan.com、

程序利用 ListIterator 接口實(shí)現(xiàn)了List 集合的雙向迭代輸出,首先利用 hasNext()next()實(shí)現(xiàn)由前向后的數(shù)據(jù)迭代,然后使用 hasPrevious()previous()兩個(gè)方法實(shí)現(xiàn)了數(shù)據(jù)的由后向前迭代。

5.3 foreach 輸出

JDK 1.5之后為了簡(jiǎn)化數(shù)組以及集合的輸出操作,專門提供了 foreach (增強(qiáng)型 for 循環(huán))輸出,所以也可以利用 foreach 語(yǔ)法實(shí)現(xiàn)所有集合數(shù)據(jù)的輸出操作。

//	范例 14: 利用foreach 輸出集合數(shù)據(jù)
package com.xiaoshan.demo;
import java.util.ArrayList;
import java.util.List;

public class TestDemo{
	public static void main(String[] args){
		List<String> all =new ArrayList<String>();// 實(shí)例化List接口對(duì)象 
		all.add("www.baidu.com");      	//向集合保存數(shù)據(jù)
		all.add("www.xiaoshan.com");        
		all.add("www.csdn.cn");             
		//集合中包含的數(shù)據(jù)都是String型,所以需要使用String接收集合中的每一個(gè)數(shù)據(jù)
		for (String str: all){     	//for循環(huán)輸出
			System.out.println(str);
		}
	}
}

程序執(zhí)行結(jié)果:

www.baidu.com
www.xiaoshan.com
www.csdn.cn

此程序利用 foreach 循環(huán)實(shí)現(xiàn)了集合輸出,由于集合中保存的都是 String 型數(shù)據(jù),所以每次執(zhí)行 foreach 循環(huán)時(shí),都會(huì)將當(dāng)前對(duì)象內(nèi)容賦值給 str 對(duì)象,而后就可以在循環(huán)體中利用 str 對(duì)象進(jìn)行操作。

5.4 Enumeration 輸出

Enumeration (枚舉輸出) 是與 Vector 類一起在JDK 1.0 時(shí)推出的輸出接口,即最早的 Vector 如果要輸出數(shù)據(jù),就需要使用 Enumeration 接口完成,此接口定義如下。

public interface Enumeration<E>{
	public boolean hasMoreElements(); 	// 判斷是否有下一個(gè)元素,等同于hasNext()
	public E nextElement();		//取出當(dāng)前元素,等同于next()
}		

通過(guò)定義可以發(fā)現(xiàn)在 Enumeration 接口中一共定義了兩個(gè)方法, hasMoreElements() 方法用于操作指針并且判斷是否有數(shù)據(jù),而 nextElement() 方法用于取得當(dāng)前數(shù)據(jù)。

因?yàn)?Enuemration 出現(xiàn)較早,所以在 Collection 接口中并沒(méi)有定義取得 Enumeration 接口對(duì)象的方法。 所以Enumeration 接口對(duì)象的取得只在 Vector 類中有所定義: public Enumeration<E> elements()

//	范例 15: 利用 Enumeration 接口輸出數(shù)據(jù)
package com.xiaoshan.demo;
import java.util.Enumeration;
import java.util.Vector;

public class TestDemo{
	public static void main(String[] args){
		Vector<String> all= new Vector<String>();	//實(shí)例化Vector子類對(duì)象
		all.add("www.baidu.com");		//向集合保存數(shù)據(jù)
		all.add("www.xiaoshan.com");
		all.add("www.csdn.cn");
		Enumeration<String> enumeration = all.elements();		//取得Enumeration接口對(duì)象
		while(enumeration.hasMoreElements()){		//判斷是否有數(shù)據(jù)
			String str = enumeration.nextElement();	//取出當(dāng)前數(shù)據(jù)
			System.out.println(str);				//輸出數(shù)據(jù)
		}
	}
}

程序執(zhí)行結(jié)果:

www.baidu.com
www.xiaoshan.com
www.csdn.cn

此程序與 Iterator 接口輸出實(shí)現(xiàn)的最終效果是完全一致的,唯一的區(qū)別就是,如果要利用集合類為 Enuemration 接口實(shí)例化,就必須依靠 Vector 子類完成。

如果要進(jìn)行類集的操作,大部分情況下都會(huì)使用 ListSet子接口,很少會(huì)直接操作 Vector子類,所以對(duì)于Enumeration接口而言使用情況有限,大部分都以 Iterator輸出為主。

?? 總結(jié)

本文介紹了Java類集框架,重點(diǎn)關(guān)注了單列集合頂層接口Collection和其子接口List的特點(diǎn)和用法。我們比較了數(shù)組和列表(ArrayList)之間的區(qū)別,并深入探討了List子類(ArrayList、LinkedList、VectorStack)之間的聯(lián)系與區(qū)別。

Set子接口部分,我們介紹了HashSetTreeSet的區(qū)別,并解釋了數(shù)據(jù)排序和處理重復(fù)元素的方法。

最后,我們討論了取出集合元素的幾種常見方式,包括迭代輸出使用Iterator、雙向迭代使用ListIterator、使用foreach循環(huán)以及使用Enumeration輸出。

通過(guò)本文的學(xué)習(xí),我們對(duì)類集框架有了全面的了解。了解不同的集合類型和它們的特點(diǎn),可以根據(jù)實(shí)際需求選擇最合適的集合。同時(shí),熟練使用各種元素取出方法,可以方便地遍歷和操作集合中的元素。

???? 送書活動(dòng)

書籍介紹:

ISBN編號(hào):9787302511052
書名:設(shè)計(jì)模式(第2版)(高等學(xué)校設(shè)計(jì)模式課程系列教材)
作者:劉偉、夏莉、于俊洋、黃辛迪
定價(jià):79.80元
開本:16開
出版社名稱:清華大學(xué)出版社

書籍圖示:【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm
【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm
書籍目錄:

  • 抽獎(jiǎng)方式:滿足條件的用戶中隨機(jī)抽取兩名(程序抽取)~
  • 參與方式:關(guān)注+點(diǎn)贊+收藏,評(píng)論區(qū)留言“打工真快樂(lè),我愛上班,我學(xué)編程發(fā)自內(nèi)心!” 每人最多評(píng)論三次?。ń刂沟浇y(tǒng)計(jì)時(shí),未關(guān)注、未收藏、未按格式正確評(píng)論的朋友將無(wú)法成功被程序統(tǒng)計(jì)到)
  • 截止時(shí)間:2023/8/1 20:00:00
  • 通知方式:私信 + 評(píng)論區(qū)@公布~

書籍目錄:

第1章 統(tǒng)一建模語(yǔ)言基礎(chǔ)知識(shí)
1.1 UML簡(jiǎn)介
1.1.1 UML的延生
1.1.2 UML的結(jié)構(gòu)
1.1.3 UML的特點(diǎn)
1.2 類圖
1.2.1 類與類圖
1.2.2 類之間的關(guān)系
1.2.3 類圖實(shí)例
1.3 順序圖
1.3.1 順序圖定義
1.3.2 順序圖組成元素與繪制
1.3.3 順序圖實(shí)例
1.4 狀態(tài)圖
1.4.1 狀態(tài)圖定義
1.4.2 狀態(tài)圖組成元素與繪制
1.4.3 狀態(tài)圖實(shí)例
1.5 本章小結(jié)
思考與練習(xí)

第2章 面向?qū)ο笤O(shè)計(jì)原則
2.1 面向?qū)ο笤O(shè)計(jì)原則概述
2.1.1 軟件的可維護(hù)性和可復(fù)用性
2.1.2 面向?qū)ο笤O(shè)計(jì)原則簡(jiǎn)介
2.2 單一職責(zé)原則
2.2.1 單一職責(zé)原則定義
2.2.2 單一職責(zé)原則分析
2.2.3 單一職責(zé)原則實(shí)例
2.3 開閉原則
2.3.1 開閉原則定義
2.3.2 開閉原則分析
2.3.3 開閉原則實(shí)例
2.4 里氏代換原則
2.4.1 里氏代換原則定義
2.4.2 里氏代換原則分析
2.4.3 里氏代換原則實(shí)例
2.5 依賴倒轉(zhuǎn)原則
2.5.1 依賴倒轉(zhuǎn)原則定義
2.5.2 依賴倒轉(zhuǎn)原則分析
2.5.3 依賴倒轉(zhuǎn)原則實(shí)例
2.6 接口隔離原則
2.6.1 接口隔離原則定義
2.6.2 接口隔離原則分析
2.6.3 接口隔離原則實(shí)例
2.7 合成復(fù)用原則
2.7.1 合成復(fù)用原則定義
2.7.2 合成復(fù)用原則分析
2.7.3 合成復(fù)用原則實(shí)例
2.8 迪米特法則
2.8.1 迪米特法則定義
2.8.2 迪米特法則分析
2.8.3 迪米特法則實(shí)例
2.9 本章小結(jié)
思考與練習(xí)

第3章 設(shè)計(jì)模式概述
3.1 設(shè)計(jì)模式的誕生與發(fā)展
3.1.1 模式的誕生與定義
3.1.2 軟件模式
3.1.3 設(shè)計(jì)模式的發(fā)展
3.2 設(shè)計(jì)模式的定義與分類
3.2.1 設(shè)計(jì)模式的定義
3.2.2 設(shè)計(jì)模式的基本要素
3.2.3 設(shè)計(jì)模式的分類
3.3 GoF設(shè)計(jì)模式簡(jiǎn)介
3.4 設(shè)計(jì)模式的優(yōu)點(diǎn)
3.5 本章小結(jié)
思考與練習(xí)

第4章 簡(jiǎn)單工廠模式
4.1 創(chuàng)建型模式
4.1.1 創(chuàng)建型模式概述
4.1.2 創(chuàng)建型模式簡(jiǎn)介
4.2 簡(jiǎn)單工廠模式動(dòng)機(jī)與定義
4.2.1 模式動(dòng)機(jī)
4.2.2 模式定義
4.3 簡(jiǎn)單工廠模式結(jié)構(gòu)與分析
4.3.1 模式結(jié)構(gòu)
4.3.2 模式分析
4.4 簡(jiǎn)單工廠模式實(shí)例與解析
4.4.1 簡(jiǎn)單工廠模式實(shí)例之簡(jiǎn)單電視機(jī)工廠
4.4.2 簡(jiǎn)單工廠模式實(shí)例之權(quán)限管理
4.5 簡(jiǎn)單工廠模式效果與應(yīng)用
4.5.1 模式優(yōu)缺點(diǎn)
4.5.2 模式適用環(huán)境
4.5.3 模式應(yīng)用
4.6 簡(jiǎn)單工廠模式擴(kuò)展
4.7 本章小結(jié)
思考與練習(xí)

第5章 工廠方法模式
5.1 工廠方法模式動(dòng)機(jī)與定義
5.1.1 簡(jiǎn)單工廠模式的不足
5.1.2 模式動(dòng)機(jī)
5.1.3 模式定義
5.2 工廠方法模式結(jié)構(gòu)與分析
5.2.1 模式結(jié)構(gòu)
5.2.2 模式分析
5.3 工廠方法模式實(shí)例與解析
5.3.1 工廠方法模式實(shí)例之電視機(jī)工廠
5.3.2 工廠方法模式實(shí)例之日志記錄器
5.4 工廠方法模式效果與應(yīng)用
5.4.1 模式優(yōu)缺點(diǎn)
5.4.2 模式適用環(huán)境
5.4.3 模式應(yīng)用
5.5 工廠方法模式擴(kuò)展
5.6 本章小結(jié)
思考與練習(xí)

第6章 抽象工廠模式
6.1 抽象工廠模式動(dòng)機(jī)與定義
6.1.1 模式動(dòng)機(jī)
6.1.2 模式定義
6.2 抽象工廠模式結(jié)構(gòu)與分析
6.2.1 模式結(jié)構(gòu)
6.2.2 模式分析
6.3 抽象工廠模式實(shí)例與解析
6.3.1 抽象工廠模式實(shí)例之電器工廠
6.3.2 抽象工廠模式實(shí)例之?dāng)?shù)據(jù)庫(kù)操作工廠
6.4 抽象工廠模式效果與應(yīng)用
6.4.1 模式優(yōu)缺點(diǎn)
6.4.2 模式適用環(huán)境
6.4.3 模式應(yīng)用
6.5 抽象工廠模式擴(kuò)展
6.6 本章小結(jié)
思考與練習(xí)

第7章 建造者模式
7.1 建造者模式動(dòng)機(jī)與定義
7.1.1 模式動(dòng)機(jī)
7.1.2 模式定義
7.2 建造者模式結(jié)構(gòu)與分析
7.2.1 模式結(jié)構(gòu)
7.2.2 模式分析
7.3 建造者模式實(shí)例與解析
7.4 建造者模式效果與應(yīng)用
7.4.1 模式優(yōu)缺點(diǎn)
7.4.2 模式適用環(huán)境
7.4.3 模式應(yīng)用
7.5 建造者模式擴(kuò)展
7.6 本章小結(jié)
思考與練習(xí)

第8章 原型模式
8.1 原型模式動(dòng)機(jī)與定義
8.1.1 模式動(dòng)機(jī)
8.1.2 模式定義
8.2 原型模式結(jié)構(gòu)與分析
8.2.1 模式結(jié)構(gòu)
8.2.2 模式分析
8.3 原型模式實(shí)例與解析
8.3.1 原型模式實(shí)例之郵件復(fù)制(淺克?。?br> 8.3.2 原型模式實(shí)例之郵件復(fù)制(深克?。?br> 8.4 原型模式效果與應(yīng)用
8.4.1 模式優(yōu)缺點(diǎn)
8.4.2 模式適用環(huán)境
8.4.3 模式應(yīng)用
8.5 原型模式擴(kuò)展
8.6 本章小結(jié)
思考與練習(xí)

第9章 單例模式

第27章 訪問(wèn)者模式
27.1 訪問(wèn)者模式動(dòng)機(jī)與定義
27.1.1 模式動(dòng)機(jī)
27.1.2 模式定義
27.2 訪問(wèn)者模式結(jié)構(gòu)與分析
27.2.1 模式結(jié)構(gòu)
27.2.2 模式分析
27.3 訪問(wèn)者模式實(shí)例與解析
27.3.1 訪問(wèn)者模式實(shí)例之購(gòu)物車
27.3.2 訪問(wèn)者模式實(shí)例之獎(jiǎng)勵(lì)審批系統(tǒng)
27.4 訪問(wèn)者模式效果與應(yīng)用
27.4.1 模式優(yōu)缺點(diǎn)
27.4.2 模式適用環(huán)境
27.4.3 模式應(yīng)用
27.5 訪問(wèn)者模式擴(kuò)展
27.6 本章小結(jié)
思考與練習(xí)
參考文獻(xiàn)
文摘Abstract



? 溫習(xí)回顧上一篇(點(diǎn)擊跳轉(zhuǎn))
《【Java基礎(chǔ)教程】(四十七)網(wǎng)絡(luò)編程篇:網(wǎng)絡(luò)通訊概念,TCP、UDP協(xié)議,Socket與ServerSocket類使用實(shí)踐與應(yīng)用場(chǎng)景~》

? 繼續(xù)閱讀下一篇(點(diǎn)擊跳轉(zhuǎn))
《【Java基礎(chǔ)教程】(四十九)集合體系篇 · 下:雙列集合解析——HashMap、Hashtable、LinkedHashMap、TreeMap、Properties ~》
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-611667.html

【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】,# Java基礎(chǔ)教程,java,list,開發(fā)語(yǔ)言,經(jīng)驗(yàn)分享,java-ee,數(shù)據(jù)結(jié)構(gòu),jvm

到了這里,關(guān)于【Java基礎(chǔ)教程】(四十八)集合體系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍歷方式~【文末送書】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包