版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第七章 集合案例7-1 Collection接口對集合的操作一、案例描述 1、 考核知識點(diǎn)編號:00107002名稱:Collection接口2、 練習(xí)目標(biāo)Ø 掌握Collection接口中方法的使用3、 需求分析Collection是所有單列集合的父接口,在Collection中定義了單列集合(List和Set)通用的一些方法。為了讓初學(xué)者熟悉Collection接口中的常用方法,本案例將演示Collection接口中的方法對集合進(jìn)行操作來學(xué)習(xí)方法的使用。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example012) 在類中定義兩個Collection集合,并向其中一個集合中添加
2、數(shù)據(jù)3) 用Collection接口中的方法對定義的兩個集合進(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);/ 獲取兩個集合的交集boolean c = col1.retainAll(col2);System.out.println("col1和col2集合是否有交
4、集:"+c);/ 清除集合col2中的元素col2.clear();System.out.println("清除集合col2中的元素后,col2集合:"+col2);/ 獲取集合中元素的個數(shù)int size = col1.size();System.out.println("col1集合中元素的個數(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)向集合中添加一個元素boolean addAll(Collection c)將指定Collection中的所有元素添加到該集合中void clear()刪除該集合中的所有元素boolean remove(Object o)刪除該集合中指定的元素boolean removeAll(Collection c)刪除指定集合中的所有元素boolean isEmpty()判斷該集合是否為空boolean contains(Object o)判斷該集合中是否包含某個元素boolean containsAll(Co
6、llection c)判斷該集合中是否包含指定集合中的所有元素Iterator iterator()返回在該集合的元素上進(jìn)行迭代的迭代器(Iterator),用于遍歷該集合所有元素int size()獲取該集合元素個數(shù)2、在編譯案例時,會得到如圖7-2所示的警告,意思是說在使用ArrayList集合時并沒有顯示的指定集合中存儲什么類型的元素,會產(chǎn)生安全隱患,這涉及到泛型安全機(jī)制的問題。此警告對程序輸出結(jié)果沒有影響。圖7-2 編譯警告3、在編寫程序時,不要忘記使用import java.util.*;語句導(dǎo)包,否則程序?qū)幾g失敗,顯示類找不到。案例7-2 List接口的特有方法一、案例描述 1
7、、 考核知識點(diǎn)編號:00107003名稱:List接口2、 練習(xí)目標(biāo)Ø 掌握List接口的常用方法的使用3、 需求分析List作為Collection集合的子接口,不但繼承了Collection接口中的全部方法,而且還增加了一些根據(jù)元素索引來操作集合的特有方法。為了熟悉List接口中特有方法的使用,本案例將演示使用List接口中的方法對List集合進(jìn)行添加、修改等操作。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example022) 在類中定義兩個list集合,并向其中一個集合中添加數(shù)據(jù)。3) 用 subList(int fromIndex, int toIndex)方法獲取集合的一
8、部分4) 用set(int index, E element)方法修改一個元素5) 用add(int index, E element)方法增加一個元素二、案例實(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()方法獲取集合的前兩個元素 System.out.println(newList); Object o = list.set(0, "haha");/set()方法修改指定位置元素值為hahaSystem.out.println(list);System.out.println(o);list.add(0, "QQ");/add()方法在集合指定位置增加一個元素QQSystem.out.println(l
10、ist);運(yùn)行結(jié)果如圖7-3所示。圖7-3 運(yùn)行結(jié)果三、案例總結(jié)1、在List集合中允許出現(xiàn)重復(fù)的元素,所有的元素是以一種線性方式進(jìn)行存儲的,在程序中可以通過索引來訪問集合中的指定元素。另外,List集合還有一個特點(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對象,并將替換后的元素返回int indexOf(Object o)返回對象o在List集合中出現(xiàn)的位置索引int lastIndexOf(Object o)返
12、回對象o在List集合中最后一次出現(xiàn)的位置索引List subList(int fromIndex, int toIndex)返回從索引fromIndex(包括 )到 toIndex(不包括)處所有元素集合組成的子集合案例7-3 ArrayList集合的存取一、案例描述 1、 考核知識點(diǎn)編號:00107004名稱:ArrayList集合2、 練習(xí)目標(biāo)Ø 了解ArrayList集合的特點(diǎn)Ø 掌握對ArrayList集合中元素的存取操作3、 需求分析ArrayList是List接口的一個實(shí)現(xiàn)類,ArrayList集合中大部分方法都是從父類Collection
13、和List繼承過來的。為了熟悉ArrayList集合的使用,本案例將演示ArrayList集合的定義、存儲元素和取出元素。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example032) 在類中定義一個ArrayList集合3) 用add()方法向集合中添加元素4) 用get()方法獲取集合中的指定元素,由于ArrayList集合的索引的取值范圍是從0開始的,最后一個索引是size-1。所以,要獲取集合中的第2個元素應(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個元素是:" + array.get(1);運(yùn)行結(jié)果如圖7-4所示。圖7-4 運(yùn)行結(jié)果三、案例總結(jié)1、在Ar
15、rayList內(nèi)部封裝了一個長度可變的數(shù)組對象,當(dāng)存入的元素超過數(shù)組長度時,ArrayList會在內(nèi)存中分配一個更大的數(shù)組來存儲這些元素,因此可以將ArrayList集合看作一個長度可變的數(shù)組。2、索引位置為1的元素是集合中的第二個元素,這就說明集合和數(shù)組一樣,索引的取值范圍是從0開始的,最后一個索引是size-1,在訪問元素時一定要注意索引不可超出此范圍,否則會拋出角標(biāo)越界異常IndexOutOfBoundsException。3、由于ArrayList集合的底層是使用一個數(shù)組來保存元素,在增加或刪除指定位置的元素時,會導(dǎo)致創(chuàng)建新的數(shù)組,效率比較低,因此不適合做大量的增刪操作。但這種數(shù)組的結(jié)
16、構(gòu)允許程序通過索引的方式來訪問元素,因此使用ArrayList集合查找元素很便捷。案例7-4 LinkedList集合的特殊方法一、案例描述 1、 考核知識點(diǎn)編號:00107005名稱:LinkedList集合2、 練習(xí)目標(biāo)Ø 了解LinkedList集合的特點(diǎn)Ø 掌握LinkedList集合的特殊方法的使用3、 需求分析ArrayList集合在查詢元素時速度很快,但在增刪元素時效率較低,為了克服這種局限性,可以使用List接口的另一個實(shí)現(xiàn)類LinkedList。LinkedList集合除了對于元素的增刪操作具有很高的效率,還專門針對元素的增刪操作定義了一些特有的方法。為了
17、熟悉這些特殊的方法,本案例將演示如何使用LinkedList中的特殊方法對集合進(jìn)行增刪操作。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example04,在該類中定義一個LinkedList集合2) 分別使用addFirst()和addLast()方法向集合中添加元素3) 使用peekFirst()方法獲取集合中的第一個元素4) 使用pollFirst()方法獲取并移除集合中的第一個元素5) 使用pollLast()方法獲取并移除集合中的最后一個元素6) 此時,集合中應(yīng)該沒有元素了,用peekLast()方法獲取集合中的最后一個元素,由于集合為空,應(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();/獲取但不移除此集合的第一個元素System.out.println(link.pollFirst();/獲取但不移除此集合的最后一個
19、元素System.out.println(link);System.out.println(link.pollLast();/獲取并移除此集合的第一個元素System.out.println(link);System.out.println(link.peekLast();/獲取并移除此集合的最后一個元素運(yùn)行結(jié)果如圖7-5所示。圖7-5 運(yùn)行結(jié)果三、案例總結(jié)1、LinkedList集合內(nèi)部維護(hù)了一個雙向循環(huán)鏈表,鏈表中的每一個元素都使用引用的方式來記住它的前一個元素和后一個元素,從而可以將所有的元素彼此連接起來。當(dāng)插入一個新元素時,只需要修改元素之間的這種引用關(guān)系即可,刪除一個節(jié)點(diǎn)也是如此。正
20、因?yàn)檫@樣的存儲結(jié)構(gòu),所以LinkedList集合對于元素的增刪操作具有很高的效率。2、在本案例中,所用的方法及其功能具體如下:1) peekFirst()方法用于獲取LinkedList集合中的第一個元素,如果此列表為空則返回NULL2) peekLast()方法用于獲取LinkedList集合中的最后一個元素,如果此列表為空則返回NULL3) pollFirst()方法用于獲取并移除LinkedList集合中的第一個元素,如果此列表為空則返回NULL4) pollLast()方法用于獲取并移除LinkedList集合中的最后一個元素,如果此列表為空則返回NULL5) addFirst()方法
21、用于添加LinkedList集合中的第一個元素6) addLast()方法用于添加LinkedList集合中的最后一個元素案例7-5 Iterator遍歷集合元素一、案例描述 1、 考核知識點(diǎn)編號:00107006名稱:Iterator接口2、 練習(xí)目標(biāo)Ø 掌握Iterator迭代器的使用3、 需求分析在程序開發(fā)中,經(jīng)常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個接口Iterator。為了使初學(xué)者熟悉Iterator迭代器的使用,本案例將演示如何使用Iterator迭代器遍歷集合中的元素。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example052) 在類中定義一個
22、List集合,并向集合中添加數(shù)據(jù)3) 通過調(diào)用List集合的iterator()方法獲得迭代器對象4) 在while循環(huán)條件中使用hashNext()方法判斷集合中是否存在下一個元素,如果存在,則調(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(); /獲取迭代器對象while (it.hasNext() /判斷是否還有元素Object obj = it.next(); /取出元素System.out.println(obj);運(yùn)行結(jié)果如圖7-6所示。圖7-6 運(yùn)行結(jié)果三、案例總結(jié)1、需要注意的是,在通過next()方法獲取元素時,必須保證要獲取的元素存在,否則,會拋出NoSuchElementException異常。
24、2、Iterator迭代器對象在遍歷集合時,內(nèi)部采用指針的方式來跟蹤集合中的元素,圖7-7演示了Iterator對象迭代元素的過程。圖7-7 遍歷元素過程圖案例7-6 foreach循環(huán):簡化遍歷一、案例描述 1、 考核知識點(diǎn)編號:00107007名稱:foreach循環(huán)2、 練習(xí)目標(biāo)Ø 掌握使用foreach循環(huán)遍歷集合和數(shù)組3、 需求分析雖然Iterator可以用來遍歷集合中的元素,但寫法上比較繁瑣,為了簡化書寫,從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) 編寫一個類Example06,2) 在該類中定義一個List集合,向集合中添加四個元素3) 用foreach循環(huán)遍歷集合中的元素4) 在類中定義一個數(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)在遍歷集合時語法非常簡潔,沒有循環(huán)條件,也沒有迭代語句,所有這些工作都交給虛擬機(jī)去執(zhí)行了。foreach循環(huán)的次數(shù)是由容器中元素的個數(shù)決定的,每次循環(huán)時,foreach中都通過變量將當(dāng)前循環(huán)的元素記住,從而將集合中的元素分別打印出來。2、使用foreach循環(huán)遍歷集合和數(shù)組時,只能訪問集合中的元素,不能對其中的元素進(jìn)行修改。案例7-7 ListIterator迭代器的特有方法一、案例描述 1、 考核知識點(diǎn)編號:00107008名稱:ListIterator接口2、 練習(xí)目標(biāo)
28、16; 掌握ListIterator接口中特有方法的使用3、 需求分析ListIterator迭代器是Iterator的子類,該類在父類的基礎(chǔ)上增加了一些特有方法。為了讓初學(xué)者能熟悉ListIterator接口中特有方法的使用,本案例將演示如何用ListIterator接口中的方法向集合中插入元素和逆向遍歷集合。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example072) 在該類中定義一個List集合,向集合中添加四個元素3) 用ListIterator接口的add()方法向集合中插入一個元素并遍歷集合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元素時,向集合中添加一個元素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()如果以逆向遍歷列表,列表迭代器有多個元素,則返回 trueObject previous()返回列表中的前一個元素void remove()從列表中移除由 next 或 previous 返回的最后一個元素(可選操作)2、在本案例中,使用hasPrevious()方法判斷是否存在上一個元素,如果存在,則通過previous()方法將元素取出,否則,則表示到達(dá)了集合的末尾,沒有要遍歷的元素。3、在遍歷過程中,如果想增加元素同樣不能調(diào)用集合對象的add()方法,此時需
32、要使用ListIterator提供的add()方法,否則會出現(xiàn)并發(fā)修改異常ConcurrentModificationException。需要注意的是,ListIterator迭代器只能用于List集合。案例7-8 用Enumeration迭代Vector集合一、案例描述 1、 考核知識點(diǎn)編號:00107009名稱:Enumeration接口2、 練習(xí)目標(biāo)Ø 掌握如何使用Enumeration迭代器的特有方法遍歷Vector集合中的元素3、 需求分析在JDK1.2以前還沒有Iterator接口的時候,遍歷集合需要使用Enumeration迭代器接口。由于很多程序中依然在使用Enume
33、ration,因此了解該接口的用法是很有必要的。Vevtor集合是List接口的一個實(shí)現(xiàn)類。為了讓初學(xué)者能熟悉Enumeration迭代器的用法,本案例將演示如何用Enumeration迭代器遍歷Vector集合。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example08,在該類中定義一個Vector集合v2) 向集合v中添加四個元素3) 用Enumeration迭代器遍歷集合v,輸出集合中的每一個元素二、案例實(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中提供了一個Vevtor集合,該集合是List接口的一個實(shí)現(xiàn)類,用法與ArrayList完全相同,區(qū)別在于Vector集合是線程安全的,而ArrayList集合是線程不安全的。在Vector類中提供了一個elements()方法用于返回Enumeration對象,通過Enumeration對象就可以遍歷該集合中的元素。2、在本案例中,使用Enumeration迭代器時,使用一個while循環(huán)對集合中的元素進(jìn)行迭代,其過程與Iterator迭代的過程類似,通過hasMoreElements()方法循環(huán)判斷是否存在下一個元素,如果存在,則通過nex
36、tElement()方法逐一取出每個元素。案例7-9 HashSet集合的存儲一、案例描述 1、 考核知識點(diǎn)編號:00107010名稱:HashSet集合2、 練習(xí)目標(biāo)Ø 了解HashSet集合的存儲特點(diǎn)Ø 掌握HashSet集合的用法3、 需求分析HashSet是Set接口的一個實(shí)現(xiàn)類,它所存儲的元素是不可重復(fù)的,并且元素都是無序的。為了讓初學(xué)者熟悉HashSet集合的用法,本案例將針對HashSet集合中元素不可重復(fù)的特點(diǎn),對HashSet集合的存儲和遍歷過程進(jìn)行演示。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example09,在該類中定義一個HashSet集合hs2
37、) 向集合hs中添加6個元素,其中有一些重復(fù)的元素3) 用size()方法獲取添加完元素后集合中元素的個數(shù)4) 用Iterator迭代器遍歷集合的每一個元素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");/ 輸出集合中元素的個數(shù)System.out.println("添加后集合中元素個數(shù):"+hs.size();/ 輸出集合中每一個元素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接口的一個實(shí)現(xiàn)類,它所存儲的元素是不可重復(fù)的,并且元素都是無序的。當(dāng)向HashSet集合中添加一個對象時,首先會調(diào)用該對象的hashCode()方法來確定元素的存儲位置,然后再調(diào)用對象的equals()方法來確保該位置沒有重復(fù)元素。2、在本案例中,首先通過add()方法向HashSet集合依次添加了六個字符串,然后通過Iterator迭代器遍歷所有的元素并輸出打印。從打印結(jié)果可以看出取出元素的順序與添加元素的順序并不一致,并且重復(fù)存入的字符串對象"abc2"和"abc4"被
40、去除了,只添加了一次。案例7-10 將Object類存入HashSet一、案例描述 1、 考核知識點(diǎn)編號:00107010名稱:HashSet集合2、 練習(xí)目標(biāo)Ø 掌握如何將對象存入HashSet集合并且去除重復(fù)對象3、 需求分析HashSet集合之所以能確保不出現(xiàn)重復(fù)的元素,是因?yàn)樗谔砑訉ο髸r,會先調(diào)用該對象的hashCode()方法來確定元素的存儲位置,再調(diào)用對象的equals()方法來確保該位置沒有重復(fù)元素。為了將Object類存入HashSet集合,本案例將針對如何重寫Object類中的hashCode()和equals()方法去除重復(fù)的Object對象進(jìn)行演示。4、 設(shè)計(jì)
41、思路(實(shí)現(xiàn)原理)1) 設(shè)計(jì)一個Person類,在該類中定義兩個變量name和age2) 在Person類中重寫hashCode()和equals()方法3) 編寫類Example10,在該類中定義一個HashSet集合4) 將Person對象存入HashSet集合中,其中含有重復(fù)的Person對象5) 遍歷HashSet集合中的元素,觀察結(jié)果是否含有重復(fù)的對象二、案例實(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對象HashSet hs = new HashSet();/ 將Person對象存入集合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集合的存入元素時,首先調(diào)用當(dāng)前存入對象的hashCode()方法獲得name屬性的哈希值,然后根據(jù)對象的哈希值計(jì)算出一個存儲位置。如果該位置上沒有元素,則直接將元素存入,如果該位置上有元素存在,則會調(diào)用equals()方法讓當(dāng)前存入的元素依次和該位置上的元素進(jìn)行比較,如果返回的結(jié)果為false就將該元素存入集合,返回的結(jié)果為true則說明有重復(fù)元素,就將該元素舍棄。整個存儲的流程如圖7-13所示。圖7-13 HashSet對象存儲過程案例7-11 TreeSet集合的存儲一、案例描述 1、 考核知識點(diǎn)編號:00107012名稱:TreeS
46、et集合2、 練習(xí)目標(biāo)Ø 了解TreeSet集合的存儲特點(diǎn)Ø 掌握TreeSet集合的存儲和迭代操作3、 需求分析TreeSet是Set接口的另一個實(shí)現(xiàn)類,它內(nèi)部采用平衡二叉樹來存儲元素,這樣的結(jié)構(gòu)可以保證TreeSet集合中沒有重復(fù)的元素,并且可以對元素進(jìn)行排序。為了讓初學(xué)者能熟悉TreeSet集合的使用,本案例通過向TreeSet集合添加元素并遍歷集合元素來演示。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個類Example11,定義一個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)部采用平衡二叉樹來存儲元素,所謂二叉樹就是說每個節(jié)點(diǎn)最多有兩個子節(jié)點(diǎn)的有序樹,每個節(jié)點(diǎn)及其子節(jié)點(diǎn)組成的樹稱為子樹,通常左側(cè)的子節(jié)點(diǎn)稱為“左子樹”,右側(cè)的節(jié)點(diǎn)稱為“右子樹”,其中左子樹上的元素應(yīng)小于它的根結(jié)點(diǎn),而右子樹上的元素應(yīng)大于它的根結(jié)點(diǎn)。二叉樹中元素的存儲結(jié)構(gòu)如圖7-15所示。圖7-15 二叉樹的存儲結(jié)構(gòu)案例7-12 自定義比較器一、
49、案例描述 1、 考核知識點(diǎn)編號:00107013名稱:Comparator比較器2、 練習(xí)目標(biāo)Ø 掌握如何通過自定義比較器的方式對TreeSet集合中的元素排序3、 需求分析如果定義的類沒有實(shí)現(xiàn)Comparable接口或者對于實(shí)現(xiàn)了Comparable接口的類而不想按照定義的compareTo()方法進(jìn)行排序,這時,可以通過自定義比較器的方式對TreeSet集合中的元素排序。為了讓初學(xué)者能掌握自定義比較器的編寫,本案例將通過自定義比較器對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對象中age為主要比較條件,如果age相等再比較name4) 編寫類Example12,創(chuàng)建TreeSet集合,在創(chuàng)建TreeSet集合時傳入自定義比較器MyComparator。并將Person對象存入集合中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對象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é)在本案例中,定義了一個MyComparator類實(shí)現(xiàn)了Comparator接口,在compare()方法中實(shí)現(xiàn)元素的比較,這就相當(dāng)于定義了一個比較器。在創(chuàng)建TreeSet集合時,將MyComparator比
55、較器對象傳入,當(dāng)向集合中添加元素時,比較器對象的compare()方法就會被自動調(diào)用,從而使存入TreeSet集合中的字符串按照長度進(jìn)行排序。案例7-13 操作HashMap集合的方法一、案例描述 1、 考核知識點(diǎn)編號:00107014名稱:HashMap集合2、 練習(xí)目標(biāo) Ø 了解HashMap集合的存儲特點(diǎn)Ø 掌握如何使用操作HashMap集合的方法3、 需求分析Map接口用于存儲具有對應(yīng)關(guān)系的數(shù)據(jù)。它的每個元素都包含一個鍵對象Key和值對象Value,鍵和值對象之間存在映射。HashMap集合是Map接口的一個實(shí)現(xiàn)類。為了讓初學(xué)者能熟悉使用HashMap集合,本章將采用使用不同方法對HashMap集合進(jìn)行操作,學(xué)習(xí)HashMap集合的使用方法。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫類Example13,創(chuàng)建一個HashMap集合,并向集合中添加元素2) 使用一系列方法分別對定義的集合進(jìn)行增加、移除、判斷等操作3) 運(yùn)行程序,根據(jù)輸出結(jié)果,分析這些方法對HashMap集合的操作二、案例實(shí)現(xiàn)編寫Example13類,具體代碼如下:import java.util.*;public class Example13 public static void main(String args) / 創(chuàng)建集合對象Map map = new HashMap();/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024影視作品授權(quán)播放合同播放平臺及時間
- 2025門面房出租經(jīng)營權(quán)質(zhì)押合同經(jīng)營權(quán)質(zhì)押
- 市場營銷臨時用電施工合同
- 建筑工程設(shè)備租賃合同協(xié)議
- 2025技術(shù)許可合同版樣板
- 2024年精簡版餐館轉(zhuǎn)讓合同書例本版B版
- 教育設(shè)施土建施工合同
- 食品代工合作合同
- 省廣電與合作協(xié)議
- 寵物行業(yè)運(yùn)營總監(jiān)招聘協(xié)議
- 期末(試題)-2024-2025學(xué)年人教PEP版英語六年級上冊
- 2024年公安基礎(chǔ)知識考試題庫及答案
- 三創(chuàng)賽獲獎-非遺文化創(chuàng)新創(chuàng)業(yè)計(jì)劃書
- 教你成為歌唱達(dá)人智慧樹知到期末考試答案2024年
- 2024分娩鎮(zhèn)痛ppt課件完整版
- 少年宮籃球活動教案
- 國有建設(shè)企業(yè)《大宗材料及設(shè)備采購招標(biāo)管理辦法》
- 民間秘術(shù)絕招大全
- N摻雜TiO2納米管的合成及光催化性能研究
- 二沉池設(shè)計(jì)說明書
- (完整版)展廳展館博物館美術(shù)館設(shè)計(jì)標(biāo)招標(biāo)評分細(xì)則及打分表
評論
0/150
提交評論