第7章 集合類_補(bǔ)充案例_第1頁
第7章 集合類_補(bǔ)充案例_第2頁
第7章 集合類_補(bǔ)充案例_第3頁
第7章 集合類_補(bǔ)充案例_第4頁
第7章 集合類_補(bǔ)充案例_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第七章 集合案例7-1 Collection接口對(duì)集合的操作一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107002名稱:Collection接口2、 練習(xí)目標(biāo)Ø 掌握Collection接口中方法的使用3、 需求分析Collection是所有單列集合的父接口,在Collection中定義了單列集合(List和Set)通用的一些方法。為了讓初學(xué)者熟悉Collection接口中的常用方法,本案例將演示Collection接口中的方法對(duì)集合進(jìn)行操作來學(xué)習(xí)方法的使用。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example012) 在類中定義兩個(gè)Collection集合,并向其中一個(gè)集合中添加

2、數(shù)據(jù)3) 用Collection接口中的方法對(duì)定義的兩個(gè)集合進(jìn)行各種操作二、案例實(shí)現(xiàn)import java.util.*;public class Example01 public static void main(String args) / 定義集合Collection col1 = new ArrayList();col1.add("123abc");col1.add(123);col1.add(34.121);Collection col2 = new ArrayList();/ 判斷集合是否為空boolean a = col1.isEmpty();boolean

3、b = col2.isEmpty();System.out.println("col1集合是否為空:"+a);System.out.println("col2集合是否為空:"+b);/ 將集合col1中的元素添加到 col2中col2.addAll(col1);System.out.println("col1集合中的元素添加到 col2后,col2集合:"+col2);/ 獲取兩個(gè)集合的交集boolean c = col1.retainAll(col2);System.out.println("col1和col2集合是否有交

4、集:"+c);/ 清除集合col2中的元素col2.clear();System.out.println("清除集合col2中的元素后,col2集合:"+col2);/ 獲取集合中元素的個(gè)數(shù)int size = col1.size();System.out.println("col1集合中元素的個(gè)數(shù):"+size);運(yùn)行結(jié)果如圖7-1所示。圖7-1 運(yùn)行結(jié)果三、案例總結(jié)1、Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合,如表7-1所示。表

5、7-1 Collection中的方法方法聲明功能描述boolean add(Object o)向集合中添加一個(gè)元素boolean addAll(Collection c)將指定Collection中的所有元素添加到該集合中void clear()刪除該集合中的所有元素boolean remove(Object o)刪除該集合中指定的元素boolean removeAll(Collection c)刪除指定集合中的所有元素boolean isEmpty()判斷該集合是否為空boolean contains(Object o)判斷該集合中是否包含某個(gè)元素boolean containsAll(Co

6、llection c)判斷該集合中是否包含指定集合中的所有元素Iterator iterator()返回在該集合的元素上進(jìn)行迭代的迭代器(Iterator),用于遍歷該集合所有元素int size()獲取該集合元素個(gè)數(shù)2、在編譯案例時(shí),會(huì)得到如圖7-2所示的警告,意思是說在使用ArrayList集合時(shí)并沒有顯示的指定集合中存儲(chǔ)什么類型的元素,會(huì)產(chǎn)生安全隱患,這涉及到泛型安全機(jī)制的問題。此警告對(duì)程序輸出結(jié)果沒有影響。圖7-2 編譯警告3、在編寫程序時(shí),不要忘記使用import java.util.*;語句導(dǎo)包,否則程序?qū)?huì)編譯失敗,顯示類找不到。案例7-2 List接口的特有方法一、案例描述 1

7、、 考核知識(shí)點(diǎn)編號(hào):00107003名稱:List接口2、 練習(xí)目標(biāo)Ø 掌握List接口的常用方法的使用3、 需求分析List作為Collection集合的子接口,不但繼承了Collection接口中的全部方法,而且還增加了一些根據(jù)元素索引來操作集合的特有方法。為了熟悉List接口中特有方法的使用,本案例將演示使用List接口中的方法對(duì)List集合進(jìn)行添加、修改等操作。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example022) 在類中定義兩個(gè)list集合,并向其中一個(gè)集合中添加數(shù)據(jù)。3) 用 subList(int fromIndex, int toIndex)方法獲取集合的一

8、部分4) 用set(int index, E element)方法修改一個(gè)元素5) 用add(int index, E element)方法增加一個(gè)元素二、案例實(shí)現(xiàn)import java.util.*;public class Example02public static void main(String args) List list = new ArrayList();list.add("abc1");/add()方法添加元素list.add("abc2");list.add("abc3");list.add("abc4

9、");System.out.println(list);List newList = list.subList(0, 2);/subList()方法獲取集合的前兩個(gè)元素 System.out.println(newList); Object o = list.set(0, "haha");/set()方法修改指定位置元素值為hahaSystem.out.println(list);System.out.println(o);list.add(0, "QQ");/add()方法在集合指定位置增加一個(gè)元素QQSystem.out.println(l

10、ist);運(yùn)行結(jié)果如圖7-3所示。圖7-3 運(yùn)行結(jié)果三、案例總結(jié)1、在List集合中允許出現(xiàn)重復(fù)的元素,所有的元素是以一種線性方式進(jìn)行存儲(chǔ)的,在程序中可以通過索引來訪問集合中的指定元素。另外,List集合還有一個(gè)特點(diǎn)就是元素有序,即元素的存入順序和取出順序一致。2、List作為Collection集合的子接口,不但繼承了Collection接口中的全部方法,而且還增加了一些根據(jù)元素索引來操作集合的特有方法,如表7-2所示。表7-2 List接口中的常見方法方法聲明功能描述void add(int index,Object element)將元素element插入在List集合的index處bo

11、olean addAll(int index,Collection c)將集合c所包含的所有元素插入到List集合的index處Object get(int index)返回集合索引index處的元素Object remove(int index)刪除index索引處的元素Object set(int index, Object element)將索引index處元素替換成element對(duì)象,并將替換后的元素返回int indexOf(Object o)返回對(duì)象o在List集合中出現(xiàn)的位置索引int lastIndexOf(Object o)返

12、回對(duì)象o在List集合中最后一次出現(xiàn)的位置索引List subList(int fromIndex, int toIndex)返回從索引fromIndex(包括 )到 toIndex(不包括)處所有元素集合組成的子集合案例7-3 ArrayList集合的存取一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107004名稱:ArrayList集合2、 練習(xí)目標(biāo)Ø 了解ArrayList集合的特點(diǎn)Ø 掌握對(duì)ArrayList集合中元素的存取操作3、 需求分析ArrayList是List接口的一個(gè)實(shí)現(xiàn)類,ArrayList集合中大部分方法都是從父類Collection

13、和List繼承過來的。為了熟悉ArrayList集合的使用,本案例將演示ArrayList集合的定義、存儲(chǔ)元素和取出元素。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example032) 在類中定義一個(gè)ArrayList集合3) 用add()方法向集合中添加元素4) 用get()方法獲取集合中的指定元素,由于ArrayList集合的索引的取值范圍是從0開始的,最后一個(gè)索引是size-1。所以,要獲取集合中的第2個(gè)元素應(yīng)該是get(1)。二、案例實(shí)現(xiàn)import java.util.*;public class Example03public static void main(String ar

14、gs) ArrayList array = new ArrayList();array.add("lisi"); array.add("wangwu");array.add("jordan");array.add("jackson");array.add("white"); System.out.println(array);System.out.println("第2個(gè)元素是:" + array.get(1);運(yùn)行結(jié)果如圖7-4所示。圖7-4 運(yùn)行結(jié)果三、案例總結(jié)1、在Ar

15、rayList內(nèi)部封裝了一個(gè)長(zhǎng)度可變的數(shù)組對(duì)象,當(dāng)存入的元素超過數(shù)組長(zhǎng)度時(shí),ArrayList會(huì)在內(nèi)存中分配一個(gè)更大的數(shù)組來存儲(chǔ)這些元素,因此可以將ArrayList集合看作一個(gè)長(zhǎng)度可變的數(shù)組。2、索引位置為1的元素是集合中的第二個(gè)元素,這就說明集合和數(shù)組一樣,索引的取值范圍是從0開始的,最后一個(gè)索引是size-1,在訪問元素時(shí)一定要注意索引不可超出此范圍,否則會(huì)拋出角標(biāo)越界異常IndexOutOfBoundsException。3、由于ArrayList集合的底層是使用一個(gè)數(shù)組來保存元素,在增加或刪除指定位置的元素時(shí),會(huì)導(dǎo)致創(chuàng)建新的數(shù)組,效率比較低,因此不適合做大量的增刪操作。但這種數(shù)組的結(jié)

16、構(gòu)允許程序通過索引的方式來訪問元素,因此使用ArrayList集合查找元素很便捷。案例7-4 LinkedList集合的特殊方法一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107005名稱:LinkedList集合2、 練習(xí)目標(biāo)Ø 了解LinkedList集合的特點(diǎn)Ø 掌握LinkedList集合的特殊方法的使用3、 需求分析ArrayList集合在查詢?cè)貢r(shí)速度很快,但在增刪元素時(shí)效率較低,為了克服這種局限性,可以使用List接口的另一個(gè)實(shí)現(xiàn)類LinkedList。LinkedList集合除了對(duì)于元素的增刪操作具有很高的效率,還專門針對(duì)元素的增刪操作定義了一些特有的方法。為了

17、熟悉這些特殊的方法,本案例將演示如何使用LinkedList中的特殊方法對(duì)集合進(jìn)行增刪操作。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example04,在該類中定義一個(gè)LinkedList集合2) 分別使用addFirst()和addLast()方法向集合中添加元素3) 使用peekFirst()方法獲取集合中的第一個(gè)元素4) 使用pollFirst()方法獲取并移除集合中的第一個(gè)元素5) 使用pollLast()方法獲取并移除集合中的最后一個(gè)元素6) 此時(shí),集合中應(yīng)該沒有元素了,用peekLast()方法獲取集合中的最后一個(gè)元素,由于集合為空,應(yīng)該返回NULL二、案例實(shí)現(xiàn)import ja

18、va.util.*;public class Example04 public static void main(String args) LinkedList link = new LinkedList();link.addFirst("abc1");/將指定元素插入此集合的開頭link.addLast("haha");/將指定元素添加到此集合的結(jié)尾System.out.println(link.peekFirst();/獲取但不移除此集合的第一個(gè)元素System.out.println(link.pollFirst();/獲取但不移除此集合的最后一個(gè)

19、元素System.out.println(link);System.out.println(link.pollLast();/獲取并移除此集合的第一個(gè)元素System.out.println(link);System.out.println(link.peekLast();/獲取并移除此集合的最后一個(gè)元素運(yùn)行結(jié)果如圖7-5所示。圖7-5 運(yùn)行結(jié)果三、案例總結(jié)1、LinkedList集合內(nèi)部維護(hù)了一個(gè)雙向循環(huán)鏈表,鏈表中的每一個(gè)元素都使用引用的方式來記住它的前一個(gè)元素和后一個(gè)元素,從而可以將所有的元素彼此連接起來。當(dāng)插入一個(gè)新元素時(shí),只需要修改元素之間的這種引用關(guān)系即可,刪除一個(gè)節(jié)點(diǎn)也是如此。正

20、因?yàn)檫@樣的存儲(chǔ)結(jié)構(gòu),所以LinkedList集合對(duì)于元素的增刪操作具有很高的效率。2、在本案例中,所用的方法及其功能具體如下:1) peekFirst()方法用于獲取LinkedList集合中的第一個(gè)元素,如果此列表為空則返回NULL2) peekLast()方法用于獲取LinkedList集合中的最后一個(gè)元素,如果此列表為空則返回NULL3) pollFirst()方法用于獲取并移除LinkedList集合中的第一個(gè)元素,如果此列表為空則返回NULL4) pollLast()方法用于獲取并移除LinkedList集合中的最后一個(gè)元素,如果此列表為空則返回NULL5) addFirst()方法

21、用于添加LinkedList集合中的第一個(gè)元素6) addLast()方法用于添加LinkedList集合中的最后一個(gè)元素案例7-5 Iterator遍歷集合元素一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107006名稱:Iterator接口2、 練習(xí)目標(biāo)Ø 掌握Iterator迭代器的使用3、 需求分析在程序開發(fā)中,經(jīng)常需要遍歷集合中的所有元素。針對(duì)這種需求,JDK專門提供了一個(gè)接口Iterator。為了使初學(xué)者熟悉Iterator迭代器的使用,本案例將演示如何使用Iterator迭代器遍歷集合中的元素。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example052) 在類中定義一個(gè)

22、List集合,并向集合中添加數(shù)據(jù)3) 通過調(diào)用List集合的iterator()方法獲得迭代器對(duì)象4) 在while循環(huán)條件中使用hashNext()方法判斷集合中是否存在下一個(gè)元素,如果存在,則調(diào)用next()方法將元素取出,否則說明已到達(dá)了集合末尾,停止遍歷元素二、案例實(shí)現(xiàn)定義Example05類,其代碼如下:import java.util.*;public class Example05 public static void main(String args) List list = new ArrayList();list.add("abc1");/向集合中添加元

23、素list.add("abc2");list.add("abc3");list.add("abc4");Iterator it = list.iterator(); /獲取迭代器對(duì)象while (it.hasNext() /判斷是否還有元素Object obj = it.next(); /取出元素System.out.println(obj);運(yùn)行結(jié)果如圖7-6所示。圖7-6 運(yùn)行結(jié)果三、案例總結(jié)1、需要注意的是,在通過next()方法獲取元素時(shí),必須保證要獲取的元素存在,否則,會(huì)拋出NoSuchElementException異常。

24、2、Iterator迭代器對(duì)象在遍歷集合時(shí),內(nèi)部采用指針的方式來跟蹤集合中的元素,圖7-7演示了Iterator對(duì)象迭代元素的過程。圖7-7 遍歷元素過程圖案例7-6 foreach循環(huán):簡(jiǎn)化遍歷一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107007名稱:foreach循環(huán)2、 練習(xí)目標(biāo)Ø 掌握使用foreach循環(huán)遍歷集合和數(shù)組3、 需求分析雖然Iterator可以用來遍歷集合中的元素,但寫法上比較繁瑣,為了簡(jiǎn)化書寫,從JDK5.0開始,提供了foreach循環(huán)。foreach循環(huán)用于遍歷數(shù)組或集合中的元素。為了讓初學(xué)者能熟悉foreach循環(huán)的使用,本案例將演示如何用foreach

25、循環(huán)遍歷數(shù)組和集合中的元素。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example06,2) 在該類中定義一個(gè)List集合,向集合中添加四個(gè)元素3) 用foreach循環(huán)遍歷集合中的元素4) 在類中定義一個(gè)數(shù)組arr,靜態(tài)初始化數(shù)組int arr = 3,2,6;5) 用foreach循環(huán)遍歷arr中的元素二、案例實(shí)現(xiàn)import java.util.*;public class Example06 public static void main(String args) / 創(chuàng)建list集合List list = new ArrayList();list.add("sv"

26、;);list.add("lv");list.add("mv");list.add("tv");System.out.println("遍歷集合中的元素:");for (Object obj : list) /foreach循環(huán)遍歷集合中的元素System.out.println(obj);/ 定義數(shù)組int arr = 3, 2, 6 ;System.out.println("遍歷數(shù)組中的元素:");for (int x : arr) /foreach循環(huán)遍歷數(shù)組中的元素System.out.

27、println(x);運(yùn)行結(jié)果如圖7-8所示。圖7-8 運(yùn)行結(jié)果三、案例總結(jié)1、通過案例可以看出,foreach循環(huán)在遍歷集合時(shí)語法非常簡(jiǎn)潔,沒有循環(huán)條件,也沒有迭代語句,所有這些工作都交給虛擬機(jī)去執(zhí)行了。foreach循環(huán)的次數(shù)是由容器中元素的個(gè)數(shù)決定的,每次循環(huán)時(shí),foreach中都通過變量將當(dāng)前循環(huán)的元素記住,從而將集合中的元素分別打印出來。2、使用foreach循環(huán)遍歷集合和數(shù)組時(shí),只能訪問集合中的元素,不能對(duì)其中的元素進(jìn)行修改。案例7-7 ListIterator迭代器的特有方法一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107008名稱:ListIterator接口2、 練習(xí)目標(biāo)

28、16; 掌握ListIterator接口中特有方法的使用3、 需求分析ListIterator迭代器是Iterator的子類,該類在父類的基礎(chǔ)上增加了一些特有方法。為了讓初學(xué)者能熟悉ListIterator接口中特有方法的使用,本案例將演示如何用ListIterator接口中的方法向集合中插入元素和逆向遍歷集合。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example072) 在該類中定義一個(gè)List集合,向集合中添加四個(gè)元素3) 用ListIterator接口的add()方法向集合中插入一個(gè)元素并遍歷集合list4) 用ListIterator接口的boolean hasPrevious()

29、方法逆向遍歷集合二、案例實(shí)現(xiàn)import java.util.*;public class Example07 public static void main(String args) List list = new ArrayList();list.add("abc1");list.add("abc2");list.add("abc3");list.add("abc4");ListIterator lit = list.listIterator();while (lit.hasNext() Object o =

30、lit.next();/ 遍歷到abc4元素時(shí),向集合中添加一個(gè)元素if ("abc4".equals(o) lit.add("abc5");System.out.println(o);/ 逆向遍歷集合System.out.println("以下是逆向遍歷");while (lit.hasPrevious() System.out.println(lit.previous();運(yùn)行結(jié)果如圖7-9所示。圖7-9 運(yùn)行結(jié)果三、案例總結(jié)1、ListIterator迭代器的特有方法,如表7-3所示。表7-3 ListIterator迭代器的特

31、有方法方法聲明功能描述void add(Object o)將指定的元素插入列表(可選操作)boolean hasPrevious()如果以逆向遍歷列表,列表迭代器有多個(gè)元素,則返回 trueObject previous()返回列表中的前一個(gè)元素void remove()從列表中移除由 next 或 previous 返回的最后一個(gè)元素(可選操作)2、在本案例中,使用hasPrevious()方法判斷是否存在上一個(gè)元素,如果存在,則通過previous()方法將元素取出,否則,則表示到達(dá)了集合的末尾,沒有要遍歷的元素。3、在遍歷過程中,如果想增加元素同樣不能調(diào)用集合對(duì)象的add()方法,此時(shí)需

32、要使用ListIterator提供的add()方法,否則會(huì)出現(xiàn)并發(fā)修改異常ConcurrentModificationException。需要注意的是,ListIterator迭代器只能用于List集合。案例7-8 用Enumeration迭代Vector集合一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107009名稱:Enumeration接口2、 練習(xí)目標(biāo)Ø 掌握如何使用Enumeration迭代器的特有方法遍歷Vector集合中的元素3、 需求分析在JDK1.2以前還沒有Iterator接口的時(shí)候,遍歷集合需要使用Enumeration迭代器接口。由于很多程序中依然在使用Enume

33、ration,因此了解該接口的用法是很有必要的。Vevtor集合是List接口的一個(gè)實(shí)現(xiàn)類。為了讓初學(xué)者能熟悉Enumeration迭代器的用法,本案例將演示如何用Enumeration迭代器遍歷Vector集合。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example08,在該類中定義一個(gè)Vector集合v2) 向集合v中添加四個(gè)元素3) 用Enumeration迭代器遍歷集合v,輸出集合中的每一個(gè)元素二、案例實(shí)現(xiàn)import java.util.*;public class Example08 public static void main(String args) Vector v =

34、new Vector(); /創(chuàng)建Vector集合v.addElement("秦始皇");v.addElement("成吉思汗");v.addElement("朱元璋");v.addElement("李世民");Enumeration e = v.elements();while (e.hasMoreElements() /Enumeration迭代器遍歷Vector集合String name = (String) e.nextElement();System.out.println(name);運(yùn)行結(jié)果如圖7-1

35、0所示。圖7-10 運(yùn)行結(jié)果三、案例總結(jié)1、JDK中提供了一個(gè)Vevtor集合,該集合是List接口的一個(gè)實(shí)現(xiàn)類,用法與ArrayList完全相同,區(qū)別在于Vector集合是線程安全的,而ArrayList集合是線程不安全的。在Vector類中提供了一個(gè)elements()方法用于返回Enumeration對(duì)象,通過Enumeration對(duì)象就可以遍歷該集合中的元素。2、在本案例中,使用Enumeration迭代器時(shí),使用一個(gè)while循環(huán)對(duì)集合中的元素進(jìn)行迭代,其過程與Iterator迭代的過程類似,通過hasMoreElements()方法循環(huán)判斷是否存在下一個(gè)元素,如果存在,則通過nex

36、tElement()方法逐一取出每個(gè)元素。案例7-9 HashSet集合的存儲(chǔ)一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107010名稱:HashSet集合2、 練習(xí)目標(biāo)Ø 了解HashSet集合的存儲(chǔ)特點(diǎn)Ø 掌握HashSet集合的用法3、 需求分析HashSet是Set接口的一個(gè)實(shí)現(xiàn)類,它所存儲(chǔ)的元素是不可重復(fù)的,并且元素都是無序的。為了讓初學(xué)者熟悉HashSet集合的用法,本案例將針對(duì)HashSet集合中元素不可重復(fù)的特點(diǎn),對(duì)HashSet集合的存儲(chǔ)和遍歷過程進(jìn)行演示。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example09,在該類中定義一個(gè)HashSet集合hs2

37、) 向集合hs中添加6個(gè)元素,其中有一些重復(fù)的元素3) 用size()方法獲取添加完元素后集合中元素的個(gè)數(shù)4) 用Iterator迭代器遍歷集合的每一個(gè)元素5) 觀察在輸出結(jié)果中,是否存在重復(fù)的元素二、案例實(shí)現(xiàn)import java.util.*;public class Example09 public static void main(String args) / 創(chuàng)建HashSet集合HashSet hs = new HashSet();/向HashSet集合中添加元素,其中包括重復(fù)元素hs.add("abc2");hs.add("abc2");h

38、s.add("abc1");hs.add("abc4");hs.add("abc4");hs.add("abc3");/ 輸出集合中元素的個(gè)數(shù)System.out.println("添加后集合中元素個(gè)數(shù):"+hs.size();/ 輸出集合中每一個(gè)元素Iterator it = hs.iterator();System.out.println("添加后集合中包含以下元素:");while (it.hasNext() System.out.println(it.next();運(yùn)

39、行結(jié)果如圖7-11所示。圖7-11 運(yùn)行結(jié)果三、案例總結(jié)1、HashSet是Set接口的一個(gè)實(shí)現(xiàn)類,它所存儲(chǔ)的元素是不可重復(fù)的,并且元素都是無序的。當(dāng)向HashSet集合中添加一個(gè)對(duì)象時(shí),首先會(huì)調(diào)用該對(duì)象的hashCode()方法來確定元素的存儲(chǔ)位置,然后再調(diào)用對(duì)象的equals()方法來確保該位置沒有重復(fù)元素。2、在本案例中,首先通過add()方法向HashSet集合依次添加了六個(gè)字符串,然后通過Iterator迭代器遍歷所有的元素并輸出打印。從打印結(jié)果可以看出取出元素的順序與添加元素的順序并不一致,并且重復(fù)存入的字符串對(duì)象"abc2"和"abc4"被

40、去除了,只添加了一次。案例7-10 將Object類存入HashSet一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107010名稱:HashSet集合2、 練習(xí)目標(biāo)Ø 掌握如何將對(duì)象存入HashSet集合并且去除重復(fù)對(duì)象3、 需求分析HashSet集合之所以能確保不出現(xiàn)重復(fù)的元素,是因?yàn)樗谔砑訉?duì)象時(shí),會(huì)先調(diào)用該對(duì)象的hashCode()方法來確定元素的存儲(chǔ)位置,再調(diào)用對(duì)象的equals()方法來確保該位置沒有重復(fù)元素。為了將Object類存入HashSet集合,本案例將針對(duì)如何重寫Object類中的hashCode()和equals()方法去除重復(fù)的Object對(duì)象進(jìn)行演示。4、 設(shè)計(jì)

41、思路(實(shí)現(xiàn)原理)1) 設(shè)計(jì)一個(gè)Person類,在該類中定義兩個(gè)變量name和age2) 在Person類中重寫hashCode()和equals()方法3) 編寫類Example10,在該類中定義一個(gè)HashSet集合4) 將Person對(duì)象存入HashSet集合中,其中含有重復(fù)的Person對(duì)象5) 遍歷HashSet集合中的元素,觀察結(jié)果是否含有重復(fù)的對(duì)象二、案例實(shí)現(xiàn)設(shè)計(jì)Person類,其代碼如下:class Person private String name;private int age;public Person(String name, int age) =

42、name;this.age = age;/ 重寫hashCode方法,返回name屬性的哈希值public int hashCode() return name.hashCode() + age * 2;/ 重寫equals方法public boolean equals(Object obj) if (this = obj)return true;if (obj instanceof Person) Person p = (Person) obj;return .equals() && this.age = p.age;return false;/

43、 重寫toString()方法public String toString() return "Person " + name + age;編寫類Example10,其代碼如下:import java.util.*;public class Example10 public static void main(String args) / 創(chuàng)建HashSet對(duì)象HashSet hs = new HashSet();/ 將Person對(duì)象存入集合hs.add(new Person("lisa", 21);hs.add(new Person("lis

44、i", 32);hs.add(new Person("lisi", 32);hs.add(new Person("leilei", 31);hs.add(new Person("lusi", 25);hs.add(new Person("lusi", 25);/ 遍歷集合中的元素Iterator it = hs.iterator();while (it.hasNext() Person p = (Person) it.next();System.out.println(p);運(yùn)行結(jié)果如圖7-12所示。圖7

45、-12 運(yùn)行結(jié)果三、案例總結(jié)在本案例中,當(dāng)HashSet集合的存入元素時(shí),首先調(diào)用當(dāng)前存入對(duì)象的hashCode()方法獲得name屬性的哈希值,然后根據(jù)對(duì)象的哈希值計(jì)算出一個(gè)存儲(chǔ)位置。如果該位置上沒有元素,則直接將元素存入,如果該位置上有元素存在,則會(huì)調(diào)用equals()方法讓當(dāng)前存入的元素依次和該位置上的元素進(jìn)行比較,如果返回的結(jié)果為false就將該元素存入集合,返回的結(jié)果為true則說明有重復(fù)元素,就將該元素舍棄。整個(gè)存儲(chǔ)的流程如圖7-13所示。圖7-13 HashSet對(duì)象存儲(chǔ)過程案例7-11 TreeSet集合的存儲(chǔ)一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107012名稱:TreeS

46、et集合2、 練習(xí)目標(biāo)Ø 了解TreeSet集合的存儲(chǔ)特點(diǎn)Ø 掌握TreeSet集合的存儲(chǔ)和迭代操作3、 需求分析TreeSet是Set接口的另一個(gè)實(shí)現(xiàn)類,它內(nèi)部采用平衡二叉樹來存儲(chǔ)元素,這樣的結(jié)構(gòu)可以保證TreeSet集合中沒有重復(fù)的元素,并且可以對(duì)元素進(jìn)行排序。為了讓初學(xué)者能熟悉TreeSet集合的使用,本案例通過向TreeSet集合添加元素并遍歷集合元素來演示。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類Example11,定義一個(gè)TreeSet集合2) 向TreeSet集合中添加一系列元素,其中有重復(fù)元素3) 遍歷輸出TreeSet集合中所有的元素二、案例實(shí)現(xiàn)impo

47、rt java.util.*;public class Example11 public static void main(String args) TreeSet ts = new TreeSet();/創(chuàng)建TreeSet集合ts.add("abc3");/向集合中添加一系列元素,其中包括重復(fù)元素ts.add("abc2");ts.add("abc4");ts.add("aabbcc");ts.add("aabbcc");ts.add("abc1");Iterator it

48、 = ts.iterator();while (it.hasNext() /使用Iterator迭代器遍歷TreeSet集合元素System.out.println(it.next();運(yùn)行結(jié)果如圖7-14所示。圖7-14 運(yùn)行結(jié)果三、案例總結(jié)TreeSet內(nèi)部采用平衡二叉樹來存儲(chǔ)元素,所謂二叉樹就是說每個(gè)節(jié)點(diǎn)最多有兩個(gè)子節(jié)點(diǎn)的有序樹,每個(gè)節(jié)點(diǎn)及其子節(jié)點(diǎn)組成的樹稱為子樹,通常左側(cè)的子節(jié)點(diǎn)稱為“左子樹”,右側(cè)的節(jié)點(diǎn)稱為“右子樹”,其中左子樹上的元素應(yīng)小于它的根結(jié)點(diǎn),而右子樹上的元素應(yīng)大于它的根結(jié)點(diǎn)。二叉樹中元素的存儲(chǔ)結(jié)構(gòu)如圖7-15所示。圖7-15 二叉樹的存儲(chǔ)結(jié)構(gòu)案例7-12 自定義比較器一、

49、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107013名稱:Comparator比較器2、 練習(xí)目標(biāo)Ø 掌握如何通過自定義比較器的方式對(duì)TreeSet集合中的元素排序3、 需求分析如果定義的類沒有實(shí)現(xiàn)Comparable接口或者對(duì)于實(shí)現(xiàn)了Comparable接口的類而不想按照定義的compareTo()方法進(jìn)行排序,這時(shí),可以通過自定義比較器的方式對(duì)TreeSet集合中的元素排序。為了讓初學(xué)者能掌握自定義比較器的編寫,本案例將通過自定義比較器對(duì)TreeSet集合中的元素排序。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 設(shè)計(jì)類Person,該類中有變量name和age,并實(shí)現(xiàn)它們的get()和set()

50、方法。2) 設(shè)計(jì)類MyComparator自定義比較器,該類實(shí)現(xiàn)了Comparator接口3) 在類MyComparator中實(shí)現(xiàn)比較方法,以Person對(duì)象中age為主要比較條件,如果age相等再比較name4) 編寫類Example12,創(chuàng)建TreeSet集合,在創(chuàng)建TreeSet集合時(shí)傳入自定義比較器MyComparator。并將Person對(duì)象存入集合中5) 遍歷集合中的元素,觀察執(zhí)行結(jié)果二、案例實(shí)現(xiàn)改寫Person類,具體代碼如下: class Person private String name; private int age; public Person(String name

51、,int age) = name; this.age = age; public String toString() return "Person "+name + age; public String getName() return name; public void setName(String name) = name; public int getAge() return age; public void setAge(int age) this.age = age; 自定義比較器,具體代碼如下:class MyCompar

52、ator implements Comparator public int compare(Object o1, Object o2) / 類型轉(zhuǎn)換,比較的是Person對(duì)象Person p1 = (Person) o1;Person p2 = (Person) o2;/ 以年齡為主要條件int num = p1.getAge() - p2.getAge();return num = 0 ? p1.getName().compareTo(p2.getName() : num;編寫Example12類,具體代碼如下:import java.util.TreeSet;import java.uti

53、l.Iterator;import java.util.Comparator;public class Example12 public static void main(String args) TreeSet ts = new TreeSet(new MyComparator();ts.add(new Person("lisa", 22);ts.add(new Person("lisi", 24);ts.add(new Person("lisi", 21);ts.add(new Person("wangwu",

54、 20);ts.add(new Person("zhaoliu", 19);ts.add(new Person("zhaoliu", 26);Iterator it = ts.iterator();while (it.hasNext() System.out.println(it.next();運(yùn)行結(jié)果如圖7-16所示。圖7-16 運(yùn)行結(jié)果三、案例總結(jié)在本案例中,定義了一個(gè)MyComparator類實(shí)現(xiàn)了Comparator接口,在compare()方法中實(shí)現(xiàn)元素的比較,這就相當(dāng)于定義了一個(gè)比較器。在創(chuàng)建TreeSet集合時(shí),將MyComparator比

55、較器對(duì)象傳入,當(dāng)向集合中添加元素時(shí),比較器對(duì)象的compare()方法就會(huì)被自動(dòng)調(diào)用,從而使存入TreeSet集合中的字符串按照長(zhǎng)度進(jìn)行排序。案例7-13 操作HashMap集合的方法一、案例描述 1、 考核知識(shí)點(diǎn)編號(hào):00107014名稱:HashMap集合2、 練習(xí)目標(biāo) Ø 了解HashMap集合的存儲(chǔ)特點(diǎn)Ø 掌握如何使用操作HashMap集合的方法3、 需求分析Map接口用于存儲(chǔ)具有對(duì)應(yīng)關(guān)系的數(shù)據(jù)。它的每個(gè)元素都包含一個(gè)鍵對(duì)象Key和值對(duì)象Value,鍵和值對(duì)象之間存在映射。HashMap集合是Map接口的一個(gè)實(shí)現(xiàn)類。為了讓初學(xué)者能熟悉使用HashMap集合,本章將采用使用不同方法對(duì)HashMap集合進(jìn)行操作,學(xué)習(xí)HashMap集合的使用方法。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫類Example13,創(chuàng)建一個(gè)HashMap集合,并向集合中添加元素2) 使用一系列方法分別對(duì)定義的集合進(jìn)行增加、移除、判斷等操作3) 運(yùn)行程序,根據(jù)輸出結(jié)果,分析這些方法對(duì)HashMap集合的操作二、案例實(shí)現(xiàn)編寫Example13類,具體代碼如下:import java.util.*;public class Example13 public static void main(String args) / 創(chuàng)建集合對(duì)象Map map = new HashMap();/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論