




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、網(wǎng) 絡(luò) 程 序 設(shè) 計JAVAJAVA網(wǎng)絡(luò)程序設(shè)計網(wǎng)絡(luò)程序設(shè)計SsandyYao泛型與集合框架泛型與集合框架P136 P136 例例7-77-7P137 P137 例例7-87-8P140 P140 例例7-107-10P141 P141 例例7-117-11P143 P143 例例7-127-12P145 P145 例例7-137-13P146 P146 例例7-147-14P148 P148 例例7-157-15P149 P149 作業(yè)題作業(yè)題3-43-4泛型與集合框架泛型與集合框架1 LinkedList1 LinkedList泛型類泛型類2 HashSet2 HashSet泛型類泛型類
2、3 HashMap3 HashMap泛型類泛型類4 TreeSet4 TreeSet泛型類泛型類5 TreeMap5 TreeMap泛型類泛型類6 Stack6 Stack泛型類泛型類泛型與集合框架泛型與集合框架什么是集合框架 集合框架:集合框架:是為表示和操作集合而是為表示和操作集合而規(guī)定的一種統(tǒng)一標準的體系結(jié)構(gòu)。規(guī)定的一種統(tǒng)一標準的體系結(jié)構(gòu)。 集合中只能容納對象。集合中只能容納對象。 對象會自動擴展,以容納添加到其對象會自動擴展,以容納添加到其中的所有對象。中的所有對象。 Java 2 Java 2的集合類型被統(tǒng)一組織在的集合類型被統(tǒng)一組織在JavaJava集合框架(集合框架(Java C
3、ollections Java Collections FrameworkFramework)當中。)當中。什么是集合框架JavaJava的集合框架提供了一套設(shè)計優(yōu)良的接口的集合框架提供了一套設(shè)計優(yōu)良的接口和類,使程序員操作成批的數(shù)據(jù)或?qū)ο笤睾皖?,使程序員操作成批的數(shù)據(jù)或?qū)ο笤貥O為方便,極大的減化了程序員編程時的負極為方便,極大的減化了程序員編程時的負擔。擔。JavaJava的集合框架的核心接口為:的集合框架的核心接口為:Collection、Map、Iterator,這三個接口是以后要使用的,這三個接口是以后要使用的最重要,最多的接口。最重要,最多的接口。Java 2Java 2的集合類
4、型被統(tǒng)一組織在的集合類型被統(tǒng)一組織在JavaJava集合框集合框架(架(Java Collections FrameworkJava Collections Framework)當中。)當中。什么是集合框架CollectionListSetMapSortedSetSortedMapArrayListLinkedListHashSetTreeSetHashMapTreeMapAbstractListAbstractSetAbstractMapAbstractSequentialListAbstractCollection什么是集合框架按具體集合類使用上的特性來分的話,主要按具體集合類使用上的特性
5、來分的話,主要有三類:有三類:List、Set和和Map。List是有序的,但允許重復。是有序的,但允許重復。Set是無序的,但不允許重復。是無序的,但不允許重復。Map主要表現(xiàn)的是鍵值對的概念。主要表現(xiàn)的是鍵值對的概念。集合與數(shù)組的區(qū)別數(shù)組是定長,即創(chuàng)建后固定不變;集合是不數(shù)組是定長,即創(chuàng)建后固定不變;集合是不定長的,其長度可以動態(tài)增長或減少。定長的,其長度可以動態(tài)增長或減少。數(shù)組是同構(gòu)的,即數(shù)組中的元素是相同的類數(shù)組是同構(gòu)的,即數(shù)組中的元素是相同的類型;集合可以是異構(gòu)的,當然也可以通過泛型;集合可以是異構(gòu)的,當然也可以通過泛型創(chuàng)建類型安全的同構(gòu)集合。型創(chuàng)建類型安全的同構(gòu)集合。數(shù)組中可以存放
6、基本數(shù)據(jù)類型或?qū)ο?;集合?shù)組中可以存放基本數(shù)據(jù)類型或?qū)ο?;集合只存放對象。只存放對象。Collection接口Collection接口是在整個接口是在整個Java集合中集合中List和和Set的父接口,此接口定義如下:的父接口,此接口定義如下:public interface Collection extends Iterable此接口使用了泛型。此接口使用了泛型。Collection接口常用方法:常用方法:add(E e)/remove(Object o)添加或移除元素。添加或移除元素。clear() 清空集合中的所有元素。清空集合中的所有元素。contains(Object o)如果此集合
7、包含指定的元素,則返回如果此集合包含指定的元素,則返回true。iterator() 返回在此集合內(nèi)的元素的迭代器。返回在此集合內(nèi)的元素的迭代器。size() 獲取集合獲取集合 中的元素個數(shù)。中的元素個數(shù)。toArray()/toArray(T a)返回包含些集合中的所有元素的數(shù)組。返回包含些集合中的所有元素的數(shù)組。List接口List是是Collection的子接口,里面的所有內(nèi)容的子接口,里面的所有內(nèi)容都是允許重復。都是允許重復。它在它在Collection接口的基礎(chǔ)上做了不少的擴接口的基礎(chǔ)上做了不少的擴展。比較典型的方法有:展。比較典型的方法有:add(),get(),remove(),
8、listIterator()。什么是迭代器模式迭代器模式:提供一種方法,它能夠用來遍迭代器模式:提供一種方法,它能夠用來遍歷(訪問)集合的部分或全部元素,而又不歷(訪問)集合的部分或全部元素,而又不暴露其內(nèi)部的表示。暴露其內(nèi)部的表示。Java的集合框架已經(jīng)實現(xiàn)好了迭代器模式,的集合框架已經(jīng)實現(xiàn)好了迭代器模式,只需要使用即可。只需要使用即可。什么是鏈表? 以以鏈式結(jié)構(gòu)鏈式結(jié)構(gòu)存儲的線性表稱之為線性鏈存儲的線性表稱之為線性鏈表。表。 特點是該線性表中的數(shù)據(jù)元素可以用任特點是該線性表中的數(shù)據(jù)元素可以用任意的存儲單元來存儲。線性表中邏輯相鄰的意的存儲單元來存儲。線性表中邏輯相鄰的兩元素的存儲空間可以是
9、不連續(xù)的。為表示兩元素的存儲空間可以是不連續(xù)的。為表示邏輯上的順序關(guān)系,對表的每個數(shù)據(jù)元素除邏輯上的順序關(guān)系,對表的每個數(shù)據(jù)元素除存儲本身的信息之外,還需存儲一個指示其存儲本身的信息之外,還需存儲一個指示其直接銜接的信息。這兩部分信息組成數(shù)據(jù)元直接銜接的信息。這兩部分信息組成數(shù)據(jù)元素的存儲映象,稱為結(jié)點。素的存儲映象,稱為結(jié)點。7.4 LinkedList泛型類 使用使用LinkedListLinkedList泛型類可以創(chuàng)建泛型類可以創(chuàng)建鏈表結(jié)構(gòu)的數(shù)據(jù)對象。鏈表是由若干個鏈表結(jié)構(gòu)的數(shù)據(jù)對象。鏈表是由若干個節(jié)點組成的一個種數(shù)據(jù)結(jié)構(gòu),每個節(jié)點節(jié)點組成的一個種數(shù)據(jù)結(jié)構(gòu),每個節(jié)點含有一個數(shù)據(jù)和下一個節(jié)
10、點的引用(單含有一個數(shù)據(jù)和下一個節(jié)點的引用(單鏈表),或含有一個數(shù)據(jù)以及上一個節(jié)鏈表),或含有一個數(shù)據(jù)以及上一個節(jié)點的引用和下一個節(jié)點的引用(雙鏈點的引用和下一個節(jié)點的引用(雙鏈表),節(jié)點的索引從表),節(jié)點的索引從0 0開始。鏈表適合動開始。鏈表適合動態(tài)改變它存儲的數(shù)據(jù),如增加、刪除節(jié)態(tài)改變它存儲的數(shù)據(jù),如增加、刪除節(jié)點等。點等。7.4 LinkedList泛型類1 1、LinkedListLinkedList對象對象 java.utiljava.util包中的包中的LinkedListLinkedList泛泛型類創(chuàng)建的對象以鏈表結(jié)構(gòu)存儲數(shù)據(jù),型類創(chuàng)建的對象以鏈表結(jié)構(gòu)存儲數(shù)據(jù),習慣上稱習慣上稱
11、LinkedListLinkedList類創(chuàng)建的對象為類創(chuàng)建的對象為鏈表對象。例如,鏈表對象。例如,LinkedList mylist=new LinkedList mylist=new LinkedList();LinkedList();7.4 LinkedList泛型類創(chuàng)建一個空雙鏈表。然后創(chuàng)建一個空雙鏈表。然后mylistmylist可可以使用以使用add(String obj)add(String obj)方法向鏈表方法向鏈表依次增加節(jié)點,節(jié)點中的數(shù)據(jù)是參依次增加節(jié)點,節(jié)點中的數(shù)據(jù)是參數(shù)數(shù)objobj指定對象的引用,如:指定對象的引用,如: mylist.add(“How”);myli
12、st.add(“How”); mylist.add(“Are”); mylist.add(“Are”); mylist.add(“You”); mylist.add(“You”);7.4 LinkedList泛型類 mylist.add(“Java”); 這時,雙鏈表這時,雙鏈表mylistmylist就有了就有了4 4個個節(jié)點,節(jié)點是自動連接在一起的,節(jié)點,節(jié)點是自動連接在一起的,不需要我們再去做連接。也就是說,不需要我們再去做連接。也就是說,不需要我們?nèi)ゲ僮靼才殴?jié)點中所存不需要我們?nèi)ゲ僮靼才殴?jié)點中所存放的下一個或上一個節(jié)點的引用。放的下一個或上一個節(jié)點的引用。7.4 LinkedList泛
13、型類2 2、常用方法、常用方法 以下是以下是LinkedListLinkedList泛型類的泛型類的一些常用方法:一些常用方法:lpublic boolean add(E public boolean add(E element)element)向鏈表的末尾添加一向鏈表的末尾添加一個新的節(jié)點,該節(jié)點中的數(shù)據(jù)是參個新的節(jié)點,該節(jié)點中的數(shù)據(jù)是參數(shù)數(shù)elementelement指定的對象。指定的對象。7.4 LinkedList泛型類lpublic void add(int index,E element)向鏈表的指定位置添向鏈表的指定位置添加一個新的節(jié)點,該節(jié)點中的數(shù)據(jù)加一個新的節(jié)點,該節(jié)點中的數(shù)
14、據(jù)是參數(shù)是參數(shù)elementelement指定的對象。指定的對象。lpublic void addFirst(E element)向鏈表的頭添加一個向鏈表的頭添加一個新的節(jié)點,該節(jié)點中的數(shù)據(jù)是參數(shù)新的節(jié)點,該節(jié)點中的數(shù)據(jù)是參數(shù)elementelement指定的對象。指定的對象。7.4 LinkedList泛型類lpublic void addLast(E element)向鏈表的末尾添加一向鏈表的末尾添加一個新的節(jié)點,該節(jié)點中的數(shù)據(jù)是參個新的節(jié)點,該節(jié)點中的數(shù)據(jù)是參數(shù)數(shù)elementelement指定的對象。指定的對象。lpublic void clear()刪除鏈刪除鏈表中的所有節(jié)點,使當前
15、鏈表成為表中的所有節(jié)點,使當前鏈表成為空鏈表。空鏈表。7.4 LinkedList泛型類lpublic E remove(int index)刪除鏈表中指定位置上的節(jié)點。刪除鏈表中指定位置上的節(jié)點。lpublic boolean remove(E element)刪除首次出現(xiàn)含有數(shù)刪除首次出現(xiàn)含有數(shù)據(jù)據(jù)elementelement的節(jié)點。的節(jié)點。lpublic E removeFirst()刪除刪除鏈表中第一個節(jié)點,并返回這個節(jié)鏈表中第一個節(jié)點,并返回這個節(jié)點中的對象。點中的對象。7.4 LinkedList泛型類lpublic E removeLast()刪除鏈刪除鏈表中最后一個節(jié)點,并返回
16、這個節(jié)表中最后一個節(jié)點,并返回這個節(jié)點中的對象。點中的對象。lpublic E get(int index)得到得到鏈表中指定位置處節(jié)點中的對象。鏈表中指定位置處節(jié)點中的對象。lpublic E getFirst()得到鏈表得到鏈表中第一個節(jié)點的對象。中第一個節(jié)點的對象。7.4 LinkedList泛型類lpublic E getLast()得到鏈表中最后一得到鏈表中最后一個節(jié)點的對象。個節(jié)點的對象。lpublic int indexOf(E element)返回返回含有數(shù)據(jù)含有數(shù)據(jù)elementelement的節(jié)點在鏈表中首次出現(xiàn)的的節(jié)點在鏈表中首次出現(xiàn)的位置,如果鏈表中無此節(jié)點則返回位置,
17、如果鏈表中無此節(jié)點則返回-1-1。lpublic int lastindexOf(E element)返返回含有數(shù)據(jù)回含有數(shù)據(jù)elementelement的節(jié)點在鏈表中最后出現(xiàn)的節(jié)點在鏈表中最后出現(xiàn)的位置,如果鏈表中無此節(jié)點則返回的位置,如果鏈表中無此節(jié)點則返回-1-1。7.4 LinkedList泛型類lpublic E set(int index,E element)將當前鏈表將當前鏈表indexindex位位置節(jié)點中的對象替換為參數(shù)置節(jié)點中的對象替換為參數(shù)elementelement指定的對象,并返回被替換的對象。指定的對象,并返回被替換的對象。lpublic int size()返回鏈
18、表的返回鏈表的長度,即節(jié)點的個數(shù)。長度,即節(jié)點的個數(shù)。7.4 LinkedList泛型類lpublic boolean contains(Object element)判斷鏈表節(jié)點中是否判斷鏈表節(jié)點中是否有節(jié)點含有對象有節(jié)點含有對象elementelement。lpublic Object clone()得到當?shù)玫疆斍版湵淼囊粋€克隆鏈表,該克隆鏈前鏈表的一個克隆鏈表,該克隆鏈表中的節(jié)點數(shù)據(jù)的改變不會影響到表中的節(jié)點數(shù)據(jù)的改變不會影響到當前鏈表中節(jié)點的數(shù)據(jù),反之亦然。當前鏈表中節(jié)點的數(shù)據(jù),反之亦然。例例7-77-7:import java.util.*;class Student String
19、name; int score; Student(String name,int score) =name; this.score=score; 例例7-67-6:public class Example7_7 public static void main(String args) LinkedList mylist=new LinkedList(); Student stu1=new Student(張小一張小一,78), stu2=new Student(王小二王小二,98), stu3=new Student(李大山李大山,67); mylist.add(stu1);
20、 mylist.add(stu2);例例7-77-7: mylist.add(stu3); int number=mylist.size(); System.out.println(現(xiàn)在鏈表中有現(xiàn)在鏈表中有+number+個節(jié)點個節(jié)點:); for(int i=0;inumber;i+) Student temp=mylist.get(i);System.out.printf(第第+i+節(jié)點中的數(shù)節(jié)點中的數(shù)據(jù)據(jù),學生學生:%s,分分數(shù)數(shù):%dn,,temp.score); 例例7-77-7:Student removeSTU=mylist.remove(1);System.o
21、ut.printf(被刪除的節(jié)點中的數(shù)據(jù)被刪除的節(jié)點中的數(shù)據(jù)是是:%s,%dn,removeSTU.name,removeSTU.score);Student replaceSTU=mylist.set(1,new Student(趙鉤林趙鉤林,68);System.out.printf(被替換的節(jié)點中的數(shù)據(jù)被替換的節(jié)點中的數(shù)據(jù)是是:%s,%dn,replaceSTU.name,replaceSTU.score);number=mylist.size();例例7-77-7: System.out.println(現(xiàn)在鏈表中有現(xiàn)在鏈表中有+number+個節(jié)點個節(jié)點:);for(int i=0;
22、inumber;i+) Student temp=mylist.get(i);System.out.printf(第第+i+節(jié)點中的數(shù)據(jù)節(jié)點中的數(shù)據(jù),學學生生:%s,分數(shù)分數(shù):%dn,,temp.score); 例例7-77-7: if(mylist.contains(stu1)System.out.println(鏈表包含鏈表包含+stu1+:);System.out.println(+,+stu1.score); elseSystem.out.println(鏈表沒有節(jié)點含有鏈表沒有節(jié)點含有+stu1); 7.4 LinkedList泛型類3、遍歷鏈表、
23、遍歷鏈表 在例在例7-7中借助中借助get()方法實現(xiàn)了遍歷鏈方法實現(xiàn)了遍歷鏈表。我們可以借助泛型類表。我們可以借助泛型類Iterator實實現(xiàn)遍歷鏈表,一個鏈表對象可以使用現(xiàn)遍歷鏈表,一個鏈表對象可以使用iterator()方法返回一個方法返回一個Iterator類型類型的對象,該對象中每個數(shù)據(jù)成員剛好是的對象,該對象中每個數(shù)據(jù)成員剛好是鏈表節(jié)點中的數(shù)據(jù),而且這些數(shù)據(jù)成員鏈表節(jié)點中的數(shù)據(jù),而且這些數(shù)據(jù)成員是按順序存放在是按順序存放在Iterator對象中的。對象中的。7.4 LinkedList泛型類如果鏈表是如果鏈表是“Student類型類型”的鏈表,即的鏈表,即鏈表節(jié)點中的數(shù)據(jù)是鏈表節(jié)點
24、中的數(shù)據(jù)是Student類創(chuàng)建的對類創(chuàng)建的對象,那么該鏈表使用象,那么該鏈表使用iterator()方法返回方法返回一個一個Iterator類型的對象,該類型的對象,該對象使用對象使用next()方法遍歷鏈表。方法遍歷鏈表。例例7-87-8:遍歷鏈表。:遍歷鏈表。import java.util.*;class Student String name ; int number; float score;Student(String name,int number,float score) =name; this.number=number; this.score=score;
25、 例例7-87-8:遍歷鏈表。:遍歷鏈表。public class Example7_8 public static void main(String args) LinkedList mylist=new LinkedList();Student stu_1=new Student(趙民趙民 ,9012,80.0f),stu_2=new Student(錢青錢青 ,9013,90.0f), stu_3=new Student(孫枚孫枚 ,9014,78.0f),stu_4=new Student(周右周右 ,9015,55.0f);例例7-87-8:遍歷鏈表。:遍歷鏈表。 mylist.ad
26、d(stu_1); mylist.add(stu_2); mylist.add(stu_3); mylist.add(stu_4); Iterator iter=mylist.iterator();例例7-87-8:遍歷鏈表。:遍歷鏈表。 while(iter.hasNext() Student te=iter.next(); /使用使用next()方法遍歷鏈表。方法遍歷鏈表。 System.out.println(+ +te.number+ +te.score); 7.4 LinkedList泛型類4、LinkedList泛型類實現(xiàn)的接口泛型類實現(xiàn)的接口 LinkedList泛
27、型類實現(xiàn)了泛型接口泛型類實現(xiàn)了泛型接口List,而,而List接口是接口是Collection接接口的子接口。口的子接口。LinkedList類中的絕大部分類中的絕大部分方法都是接口方法的實現(xiàn)。編程時,可以使方法都是接口方法的實現(xiàn)。編程時,可以使用接口回調(diào)技術(shù),即把用接口回調(diào)技術(shù),即把LinkedList對象的對象的引用賦值給引用賦值給Collection接口或接口或List接接口變量,那么接口就可以調(diào)用實現(xiàn)的接口方口變量,那么接口就可以調(diào)用實現(xiàn)的接口方法。法。7.4 LinkedList泛型類5、JDK 1.5之前的之前的LinkedList類類 JDK 1.5之前沒有泛型的之前沒有泛型的L
28、inkedList類,可類,可以用普通的以用普通的LinkedList創(chuàng)建一個鏈表對象,創(chuàng)建一個鏈表對象,如:如:LinkedList mylist=new LinkedList();創(chuàng)建了一個空雙鏈表,然后創(chuàng)建了一個空雙鏈表,然后mylist鏈表可以鏈表可以使用使用add(Object obj)方法向這個鏈表依次添方法向這個鏈表依次添加節(jié)點。加節(jié)點。7.4 LinkedList泛型類由于任何類都是由于任何類都是Object類的子類,因此類的子類,因此可以把任何一個對象作為鏈表節(jié)點中的可以把任何一個對象作為鏈表節(jié)點中的對象。需要注意的是,使用對象。需要注意的是,使用get()獲取一獲取一個節(jié)點
29、中的對象時,要用類型轉(zhuǎn)制運算個節(jié)點中的對象時,要用類型轉(zhuǎn)制運算符轉(zhuǎn)換回原來的類型。符轉(zhuǎn)換回原來的類型。7.4 LinkedList泛型類 Java泛型的主要目的是可以建立具有泛型的主要目的是可以建立具有類型安全的集合框架,如鏈表、散列表類型安全的集合框架,如鏈表、散列表等數(shù)據(jù)結(jié)構(gòu),最重要的一個優(yōu)點就是:等數(shù)據(jù)結(jié)構(gòu),最重要的一個優(yōu)點就是:在使用這些泛型類建立的數(shù)據(jù)結(jié)構(gòu)時,在使用這些泛型類建立的數(shù)據(jù)結(jié)構(gòu)時,不必進行強制類型轉(zhuǎn)換,即不要求進行不必進行強制類型轉(zhuǎn)換,即不要求進行運行時類型檢查。運行時類型檢查。7.4 LinkedList泛型類JDK 1.5是支持泛型的編譯器,它將運行是支持泛型的編譯器
30、,它將運行時類型檢查提前到編譯時執(zhí)行,使得代時類型檢查提前到編譯時執(zhí)行,使得代碼更加安全。如果使用舊版本的碼更加安全。如果使用舊版本的LinkedList類,類,SDK 1.5編譯器會給出警編譯器會給出警告信息,但程序仍能正常運行。告信息,但程序仍能正常運行。例例7-97-9:舊版本:舊版本LinkedListLinkedList的例子。的例子。import java.util.*;public class Example7_9 public static void main(String args) LinkedList mylist=new LinkedList(); mylist.add
31、(It); /鏈表中的第一個節(jié)點。鏈表中的第一個節(jié)點。 mylist.add(is); /鏈表中的第二個節(jié)點。鏈表中的第二個節(jié)點。 mylist.add(a); /鏈表中的第三個節(jié)點。鏈表中的第三個節(jié)點。 mylist.add(door); /鏈表中的第四個節(jié)點。鏈表中的第四個節(jié)點。 int number=mylist.size(); /獲取鏈表的長度。獲取鏈表的長度。例例7-87-8:舊版本:舊版本LinkedListLinkedList的例子。的例子。 for(int i=0;inumber;i+) String temp=(String)mylist.get(i); /必須強必須強制轉(zhuǎn)換
32、取出的數(shù)據(jù)。制轉(zhuǎn)換取出的數(shù)據(jù)。System.out.println(第第+i+節(jié)點中的數(shù)節(jié)點中的數(shù)據(jù)據(jù):+temp); 例例7-87-8:舊版本:舊版本LinkedListLinkedList的例子。的例子。 Iterator iter=mylist.iterator(); while(iter.hasNext() String te=(String)iter.next();/必須強制轉(zhuǎn)換取出的數(shù)據(jù)。必須強制轉(zhuǎn)換取出的數(shù)據(jù)。 System.out.println(te); 7.4 LinkedList泛型類 注:注:Java也提供了順序結(jié)構(gòu)的動態(tài)數(shù)組類也提供了順序結(jié)構(gòu)的動態(tài)數(shù)組類ArrayLi
33、st,數(shù)組采用順序結(jié)構(gòu)來存儲數(shù),數(shù)組采用順序結(jié)構(gòu)來存儲數(shù)據(jù)??梢杂行Ю每臻g,可用于存儲大量的據(jù)。可以有效利用空間,可用于存儲大量的數(shù)據(jù)。數(shù)組不適合動態(tài)改變它存儲的數(shù)據(jù),數(shù)據(jù)。數(shù)組不適合動態(tài)改變它存儲的數(shù)據(jù),如增加、刪除單元等。由于數(shù)組采用順序結(jié)如增加、刪除單元等。由于數(shù)組采用順序結(jié)構(gòu)存儲數(shù)據(jù),數(shù)組獲得第構(gòu)存儲數(shù)據(jù),數(shù)組獲得第n單元中的數(shù)據(jù)的單元中的數(shù)據(jù)的速度要比鏈表獲得第速度要比鏈表獲得第n單元中的數(shù)據(jù)快。類單元中的數(shù)據(jù)快。類ArrayList的很多方法與類的很多方法與類LinkedList類類似,兩者的本質(zhì)區(qū)別就是:一個使用順序結(jié)似,兩者的本質(zhì)區(qū)別就是:一個使用順序結(jié)構(gòu),一個使用鏈表結(jié)構(gòu)。
34、構(gòu),一個使用鏈表結(jié)構(gòu)。Set接口Set接口是接口是Collection的子接口,的子接口,Set內(nèi)的元素內(nèi)的元素是唯一的。是唯一的。Set接口并沒有對接口并沒有對Collection接口進行擴展,接口進行擴展,但在具體方法的含義上進行了進一步的約定。但在具體方法的含義上進行了進一步的約定。7.5 HashSet泛型類 HashSet泛型類在數(shù)據(jù)組織上類似數(shù)學泛型類在數(shù)據(jù)組織上類似數(shù)學上的集合,可以進行上的集合,可以進行“交交”、“并并”、“差差”等運算。等運算。1、HashSet對象對象 HashSet泛型類創(chuàng)建的對象稱為集合,泛型類創(chuàng)建的對象稱為集合,例如:例如: HashSet set=n
35、ew HashSet();7.5 HashSet泛型類那么那么set就是一個可以存儲就是一個可以存儲String類型數(shù)據(jù)的類型數(shù)據(jù)的集合,集合,set可以調(diào)用可以調(diào)用add(String s)方法將方法將String類型數(shù)據(jù)添加到集合中,添加到集合中的數(shù)類型數(shù)據(jù)添加到集合中,添加到集合中的數(shù)據(jù)稱做集合的元素。集合不允許有相同的元據(jù)稱做集合的元素。集合不允許有相同的元素,也就是說,如果素,也就是說,如果b已經(jīng)是集合中的元素,已經(jīng)是集合中的元素,那么再執(zhí)行那么再執(zhí)行set.add(b)操作是無效的。集合對操作是無效的。集合對象的初始容量是象的初始容量是16個字節(jié),裝載因子是個字節(jié),裝載因子是0.7
36、5。也就是說,如果集合添加的元素超過總?cè)萘恳簿褪钦f,如果集合添加的元素超過總?cè)萘康牡?5時,集合的容量將增加一倍。時,集合的容量將增加一倍。7.5 HashSet泛型類2、常用方法、常用方法 以下是以下是HashSet泛型類的常用泛型類的常用方法:方法:public boolean add(E o)向集合向集合添加參數(shù)指定的元素。添加參數(shù)指定的元素。public void clear()清空集合,清空集合,使集合不含有任何元素。使集合不含有任何元素。7.5 HashSet泛型類lpublic boolean contains(Object o)判斷參數(shù)指定的數(shù)據(jù)是否屬于判斷參數(shù)指定的數(shù)據(jù)是否屬
37、于集合。集合。lpublic boolean isEmpty()判判斷集合是否為空。斷集合是否為空。lpublic boolean remove(Object o)刪除集合中參數(shù)指定的元素。刪除集合中參數(shù)指定的元素。7.5 HashSet泛型類lpublic int size()返回集合中的元素個返回集合中的元素個數(shù)。數(shù)。lObject toArray()將集合元素存放到將集合元素存放到數(shù)組中,并返回這個數(shù)組。數(shù)組中,并返回這個數(shù)組。lboolean containsAll(HashSet set)判判斷當前集合是否包含參數(shù)指定的集合斷當前集合是否包含參數(shù)指定的集合。lpublic Objec
38、t clone()得到當前集合的得到當前集合的一個克隆對象,該對象中元素的改變不會影一個克隆對象,該對象中元素的改變不會影響到當前集合中的元素,反之亦然。響到當前集合中的元素,反之亦然。7.5 HashSet泛型類 我們可以借助泛型類我們可以借助泛型類Iterator實實現(xiàn)遍歷集合,一個集合對象可以使用現(xiàn)遍歷集合,一個集合對象可以使用iterator()方法返回一個方法返回一個Iterator類型類型的對象,如果集合是的對象,如果集合是“Student類型類型”的的集合,那么該鏈表使用集合,那么該鏈表使用iterator()方法返方法返回一個回一個Iterator類型的對象,類型的對象,該對象
39、使用該對象使用next()方法遍歷集合。方法遍歷集合。例例7-107-10:遍歷集合。:遍歷集合。import java.util.*;class Student String name; int score; Student(String name,int score) =name; this.score=score; 例例7-107-10:遍歷集合。:遍歷集合。public class Example7_10 public static void main(String args) Student zh=new Student(張紅銘張紅銘,77), wa=new Stu
40、dent(王家家王家家,68), li=new Student(李佳佳李佳佳,67); HashSet set=new HashSet(); HashSet subset=new HashSet();例例7-107-10:遍歷集合。:遍歷集合。 set.add(zh); set.add(wa); set.add(li); subset.add(wa); subset.add(li); if(set.contains(wa) System.out.println(集合集合set中含中含有有:+); 例例7-107-10:遍歷集合。:遍歷集合。if(set.containsAll(s
41、ubset)System.out.println(集合集合set包含集合包含集合subset); int number=subset.size(); System.out.println(集合集合subset中有中有+number+個元素個元素:); Object s=subset.toArray();例例7-107-10:遍歷集合。:遍歷集合。 for(int i=0;is.length;i+)System.out.printf(姓名姓名:%s,分分數(shù)數(shù):%dn,(Student)si).name,(Student)si).score); number=set.size(); System.
42、out.println(集合集合set中有中有+number+個元素個元素:);例例7-107-10:遍歷集合。:遍歷集合。Iterator iter=set.iterator(); while(iter.hasNext() Student te=iter.next(); System.out.printf(學生學生:%s,分分數(shù)數(shù):%dn,,te.score); 7.5 HashSet泛型類3、集合的交、并與差、集合的交、并與差 集合對象調(diào)用集合對象調(diào)用boolean addAll(HashSet set)方法可以與參數(shù)指定方法可以與參數(shù)指定的集合求并運算,使得當前集合成為兩的
43、集合求并運算,使得當前集合成為兩個集合的并集。個集合的并集。 集合對象調(diào)用集合對象調(diào)用boolean retainAll(HashSet set)方法可以與參數(shù)指方法可以與參數(shù)指定的集合求交運算,使得當前集合成為定的集合求交運算,使得當前集合成為兩個集合的交集。兩個集合的交集。7.5 HashSet泛型類 集合對象調(diào)用集合對象調(diào)用boolean removeAll(HashSet set)方法可以與參數(shù)方法可以與參數(shù)指定的集合求差運算,使得當前集合成指定的集合求差運算,使得當前集合成為兩個集合的差集。(屬于集合為兩個集合的差集。(屬于集合A,但,但不屬于集合不屬于集合B的部分。)的部分。) 參
44、數(shù)指定的集合必須與當前集合是同參數(shù)指定的集合必須與當前集合是同種類型的集合,否則上述方法返回種類型的集合,否則上述方法返回false。例例7-117-11:求集合:求集合A A、B B的對稱差集合,即求的對稱差集合,即求(A-B)(B-A)(A-B)(B-A)。import java.util.*;public class Example7_11 public static void main(String args) Integer one=new Integer(1), two=new Integer(2), three=new Integer(3), four=new Integer(4
45、), five=new Integer(5), six=new Integer(6); 例例7-117-11:求集合:求集合A A、B B的對稱差集合,即求的對稱差集合,即求(A-B)(B-A)(A-B)(B-A)。HashSet A=new HashSet(),B=new HashSet(),tempSet=new HashSet(); A.add(one); A.add(two); A.add(three); A.add(four); B.add(one); B.add(two);例例7-117-11:求集合:求集合A A、B B的對稱差集合,即求的對稱差集合,即求(A-B)(B-A)(A
46、-B)(B-A)。 B.add(five); B.add(six);tempSet=(HashSet)A.clone(); A.removeAll(B);/A變成調(diào)用該方法之前的變成調(diào)用該方法之前的A集合與集合與B集合的集合的差集。差集。 B.removeAll(tempSet);/B變成調(diào)用該方法之前的變成調(diào)用該方法之前的B集合與集合與tempSet集集合的差集。合的差集。例例7-117-11:求集合:求集合A A、B B的對稱差集合,即求的對稱差集合,即求(A-B)(B-A)(A-B)(B-A)。 B.addAll(A);/B就是最初的就是最初的A與與B的對稱差。的對稱差。 int num
47、ber=B.size(); System.out.println(A和和B的對稱差集合的對稱差集合有有+number+個元素個元素:); Iterator iter=B.iterator(); while(iter.hasNext() Integer te=iter.next();System.out.printf(%d,,Value(); 7.5 HashSet泛型類 請同學們思考,為什么在這個請同學們思考,為什么在這個地方不能直接把數(shù)據(jù)添加到集合當?shù)胤讲荒苤苯影褦?shù)據(jù)添加到集合當中去?中去?7.5 HashSet泛型類4、HashSet泛型類實現(xiàn)的接口泛型類實現(xiàn)的接口 HashS
48、et泛型類實現(xiàn)了泛型接口泛型類實現(xiàn)了泛型接口Set,而,而Set接口是接口是Collection接口的子接口。接口的子接口。HashSet類中的絕大類中的絕大部分方法都是接口方法的實現(xiàn)。編程時,部分方法都是接口方法的實現(xiàn)。編程時,可以使用接口回調(diào)技術(shù),即把可以使用接口回調(diào)技術(shù),即把HashSet對象的引用賦值給對象的引用賦值給Collection接口變量或接口變量或Set接口變接口變量,那么接口就可以調(diào)用實現(xiàn)的接口方量,那么接口就可以調(diào)用實現(xiàn)的接口方法。法。7.6 HashMap泛型類 HashMap也是一個很實用的也是一個很實用的類,類,HashMap對象采用散列表這對象采用散列表這種數(shù)據(jù)結(jié)
49、構(gòu)存儲數(shù)據(jù),習慣上稱種數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù),習慣上稱HashMap對象為散列映射對象。對象為散列映射對象。散列映射用于存儲鍵散列映射用于存儲鍵/值數(shù)據(jù)對,允許把值數(shù)據(jù)對,允許把任何數(shù)量的鍵任何數(shù)量的鍵/值數(shù)據(jù)對存儲在一起。鍵值數(shù)據(jù)對存儲在一起。鍵不可以發(fā)生邏輯沖突,兩個數(shù)據(jù)項不要不可以發(fā)生邏輯沖突,兩個數(shù)據(jù)項不要使用相同的鍵,如果出現(xiàn)兩個數(shù)據(jù)項對使用相同的鍵,如果出現(xiàn)兩個數(shù)據(jù)項對應相同的鍵,那么先前散列映射中的鍵應相同的鍵,那么先前散列映射中的鍵/值數(shù)據(jù)對將被替換。值數(shù)據(jù)對將被替換。7.6 HashMap泛型類 散列映射在它需要更多的存儲空間散列映射在它需要更多的存儲空間時會自動增加容量。例如,如
50、果散列映時會自動增加容量。例如,如果散列映射的裝載因子是射的裝載因子是0.75,那么當散列映射,那么當散列映射的容量被使用了的容量被使用了75時,它就把容量增時,它就把容量增加到原始容量的加到原始容量的2倍。對于數(shù)組和鏈表這倍。對于數(shù)組和鏈表這兩種數(shù)據(jù)結(jié)構(gòu),如果要查找它們存儲的兩種數(shù)據(jù)結(jié)構(gòu),如果要查找它們存儲的某個特定的元素卻不知道它的位置,就某個特定的元素卻不知道它的位置,就需要從頭開始訪問元素直到找到匹配的需要從頭開始訪問元素直到找到匹配的為止;如果數(shù)據(jù)結(jié)構(gòu)中包含很多的元素,為止;如果數(shù)據(jù)結(jié)構(gòu)中包含很多的元素,就會浪費時間。就會浪費時間。7.6 HashMap泛型類這時最好使用散列映射來存
51、儲要查找的這時最好使用散列映射來存儲要查找的數(shù)據(jù),使用散列映射可以減少檢索的開數(shù)據(jù),使用散列映射可以減少檢索的開銷。銷。 散列方法不同于其他的查找方法散列方法不同于其他的查找方法(順序查找、二分查找)。它不以關(guān)鍵(順序查找、二分查找)。它不以關(guān)鍵字的比較為基本操作,采用直接尋址技字的比較為基本操作,采用直接尋址技術(shù)。在理想情況下,無須任何比較就可術(shù)。在理想情況下,無須任何比較就可以找到待查關(guān)鍵字。以找到待查關(guān)鍵字。7.6 HashMap泛型類1、HashMap對象對象 HashMap泛型類創(chuàng)建的對象稱泛型類創(chuàng)建的對象稱為散列映射,例如:為散列映射,例如:HashMap hashtable=ne
52、w HashMap ();7.6 HashMap泛型類那么,那么,hashtable就可以存儲鍵就可以存儲鍵/值數(shù)據(jù)對,值數(shù)據(jù)對,其中的鍵必須是一個其中的鍵必須是一個String對象,鍵對對象,鍵對應的值必須是應的值必須是Student對象。對象。hashtable可可以調(diào)用以調(diào)用public V put(K key,V value)將鍵將鍵/值數(shù)據(jù)對存放到散列映射當中,同時返值數(shù)據(jù)對存放到散列映射當中,同時返回鍵所對應的值?;劓I所對應的值。7.6 HashMap泛型類2、常用方法、常用方法HashMap泛型類的常用方法:泛型類的常用方法:lpublic void clear()清空散列映射。
53、清空散列映射。lpublic Object clone()返回當前散列返回當前散列映射的一個克隆。映射的一個克隆。7.6 HashMap泛型類lpublic boolean containsKey(Object key)如果散列映射有鍵如果散列映射有鍵/值數(shù)據(jù)對的值數(shù)據(jù)對的值是參數(shù)指定的鍵,方法返回值是參數(shù)指定的鍵,方法返回true,否,否則返回則返回false。lpublic boolean containsValue(Object value)如果散列映射有鍵如果散列映射有鍵/值數(shù)據(jù)對值數(shù)據(jù)對的值是參數(shù)指定的值,方法返回的值是參數(shù)指定的值,方法返回true,否則返回否則返回false。7.
54、6 HashMap泛型類lpublic V get(Object key)返回散列返回散列映射中使用映射中使用key作為鍵的鍵作為鍵的鍵/值對中的值。值對中的值。lpublic boolean isEmpty()如果散列如果散列映射不含任何鍵映射不含任何鍵/值對,方法返回值對,方法返回true,否則返回否則返回false。7.6 HashMap泛型類lpublic V remove(Object key)刪除刪除散列映射中鍵為參數(shù)指定的鍵散列映射中鍵為參數(shù)指定的鍵/值對,并值對,并返回鍵對應的值。返回鍵對應的值。lpublic int size()返回散列映射的大返回散列映射的大小,即散列映射
55、中鍵小,即散列映射中鍵/值對的數(shù)目。值對的數(shù)目。7.6 HashMap泛型類3、遍歷散列映射、遍歷散列映射 如果想獲得散列映射中所有鍵如果想獲得散列映射中所有鍵/值對中的值,值對中的值,首先使用:首先使用:public Collection values()方法返回一個實現(xiàn)方法返回一個實現(xiàn)Collection接口類創(chuàng)建接口類創(chuàng)建的對象的引用,并要求將該對象的引用返回的對象的引用,并要求將該對象的引用返回到到Collection接口變量中。接口變量中。values()方法返方法返回的對象中存儲了散列映射中所有鍵回的對象中存儲了散列映射中所有鍵/值對中值對中的的“值值”,這樣接口變量就可以調(diào)用類實
56、現(xiàn),這樣接口變量就可以調(diào)用類實現(xiàn)的方法,如獲取的方法,如獲取Iterator對象,然后輸出所有對象,然后輸出所有的值。的值。例例7-127-12:遍歷散列映射。:遍歷散列映射。import java.util.*;class Book String ISBN,name; Book(String ISBN,String name) =name; this.ISBN=ISBN; 例例7-127-12:遍歷散列映射。:遍歷散列映射。public class Example7_12 public static void main(String args) Book book1=new
57、 Book(7302033218,C+基基礎(chǔ)教程礎(chǔ)教程), book2=new Book(7808315162,Java編程編程語言語言), book3=new Book(7302054991,J2ME無線無線設(shè)備編程設(shè)備編程); String key=7808315162;例例7-127-12:遍歷散列映射。:遍歷散列映射。HashMap table=new HashMap(); table.put(book1.ISBN,book1); table.put(book2.ISBN,book2); table.put(book3.ISBN,book3); if(table.containsKey
58、(key)System.out.println(table.get(key).name+有貨有貨); 例例7-127-12:遍歷散列映射。:遍歷散列映射。 Book b=table.get(7302054991); System.out.println(書書名名:++,ISBN:+b.ISBN); int number=table.size(); System.out.println(散列映射中有散列映射中有+number+個元素個元素:); Collection collection=table.values();例例7-127-12:遍歷散列映射。:遍歷散列映射。Iterato
59、r iter=collection.iterator(); while(iter.hasNext() Book te=iter.next();System.out.printf(書書名名:%s,ISBN:%sn,,te.ISBN); 7.6 HashMap泛型類4、HashMap泛型類實現(xiàn)的接口泛型類實現(xiàn)的接口 HashMap泛型類實現(xiàn)了泛型接泛型類實現(xiàn)了泛型接口口Map,而,而HashMap類中類中的絕大部分方法都是的絕大部分方法都是Map接口方接口方法的實現(xiàn)。編程時,可以使用接口回調(diào)法的實現(xiàn)。編程時,可以使用接口回調(diào)技術(shù),即把技術(shù),即把HashMap對象的引用對象的引用賦值給
60、賦值給Map接口變量,那么接口接口變量,那么接口就可以調(diào)用實現(xiàn)的接口方法。就可以調(diào)用實現(xiàn)的接口方法。7.7 TreeSet泛型類 TreeSet類是實現(xiàn)類是實現(xiàn)Set接口的類,接口的類,它的大部分方法都是接口方法的實現(xiàn)。它的大部分方法都是接口方法的實現(xiàn)。TreeSet泛型類創(chuàng)建的對象稱為樹集。泛型類創(chuàng)建的對象稱為樹集。 樹集是一個有序集合,可以按照任樹集是一個有序集合,可以按照任何順序?qū)⒃夭迦氲皆摷?。何順序?qū)⒃夭迦氲皆摷稀?.7 TreeSet泛型類例如:例如: TreeSet tree=new TreeSet();那么那么tree就是一個可以存儲就是一個可以存儲Student類型類型
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦石買賣運輸合同范本
- 危廢處置合同范本
- 醫(yī)院標識設(shè)計合同范本
- 農(nóng)村聯(lián)營合同范本
- 反恐安全運輸合同范例
- 上半年政務(wù)工作總結(jié)
- 危運司機合同范本
- 設(shè)備保養(yǎng)合同范本
- 合伙做母嬰店合同范本
- 產(chǎn)品批發(fā)代銷合同范本
- 土石方運輸中介三方合同協(xié)議書
- 2024年四川省公務(wù)員考試《行測》真題及答案解析
- 上海市幼兒園幼小銜接活動指導意見(修訂稿)
- 投資可行性分析財務(wù)數(shù)據(jù)全套表格
- 《十萬個為什么》整本書閱讀-課件-四年級下冊語文(統(tǒng)編版)
- -小學英語人稱代詞與物主代詞講解課件(共58張課件).課件
- 2024年四年級英語下冊 Unit 8 How are you第4課時教案 譯林牛津版
- 2024年濟南廣播電視臺招考電視工作人員高頻500題難、易錯點模擬試題附帶答案詳解
- 《中國詩詞大會》九宮格(原題)
- 住院病人跌倒墜床風險評估及防范措施表
- 人教版《道德與法治》二年級下冊全冊課件
評論
0/150
提交評論