電工與電子技術電子商務電子課件JAVA語言程序設計java08ppt_第1頁
電工與電子技術電子商務電子課件JAVA語言程序設計java08ppt_第2頁
電工與電子技術電子商務電子課件JAVA語言程序設計java08ppt_第3頁
電工與電子技術電子商務電子課件JAVA語言程序設計java08ppt_第4頁
電工與電子技術電子商務電子課件JAVA語言程序設計java08ppt_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、電子課件JAVA語言程序設計java08第8章數(shù)據(jù)結構和數(shù)據(jù)處理8.1基本數(shù)據(jù)結構的構造8.2泛型8.3枚舉8.4容器集合類8.5注解本章目錄8.1基本數(shù)據(jù)結構的構造一、自引用類在定義類時,可以把另一個類的對象實例作為該類的成員定義在該類中。如果作為類成員的對象實例就是所定義的類的類型,這個類就稱為自引用類,這種方式在Java語言中是被允許的?!翱梢员蛔约阂玫念悺?。一種遞歸調(diào)用。class Node private int data; private Node nextNode; public Node(int d) data = d; public int getData() return

2、 data; public void setData(int dd) data = dd; public Node getNextNode() return nextNode; public void setNextNode(Node next) nextNode = next; 二、構造鏈表鏈表是一種典型的線性結構,包括單向鏈表和雙向鏈表。利用自引用類,構造鏈表節(jié)點類,從而構造出單向鏈表?!纠?.1】單向鏈表的例子稍作改進,即可構造出雙向鏈表。三、構造棧棧也是一種線性結構,特點是只允許在棧尾添加和刪除節(jié)點,即后進先出結構。先進入棧的是頭元素,后進入棧的是尾元素。利用自引用類,構造棧節(jié)點類,從

3、而構造出棧。【例8.2】線性棧的例子四、構造隊列隊列也是一種線性結構,隊列是先進先出結構,即先進入隊列的元素必定先從隊列中離開。參照鏈表和棧,很容易構造出隊列。五、構造二叉樹樹形結構是一種重要的非線性結構,其中,樹和二叉樹結構較為常用。樹形結構包含根節(jié)點、分支節(jié)點和葉節(jié)點。對于每個節(jié)點而言,除了需要有保存數(shù)據(jù)的變量,還必須有指向下一層節(jié)點的指針??梢远x帶有兩個子節(jié)點指針的節(jié)點類,從而構造出二叉樹?!纠?.3】二叉樹抽象類的例子8.2泛型一、泛型的概念泛型(Generics)是Java語言中在面向?qū)ο缶幊碳案鞣N設計模式中應用非常廣泛的一個概念,自Java SE 5版本開始引入。使用泛型,一方面

4、是為了編寫更為通用的程序代碼,讓定義的代碼具有更為廣泛的表達能力;另一方面是為了加強程序的數(shù)據(jù)安全性。泛型是把類型作為變量的一種定義方式,實現(xiàn)了參數(shù)化類型的概念。程序清單8.1中,把作為鏈表節(jié)點存儲值的變量data定義為Object類型,其用意是表示這個定義具有一定程度的適應性,可以用于多種引用類型,但是實際效果可能難以盡如人意。當存儲數(shù)據(jù)時,若同時存儲不同類型的數(shù)據(jù),類型驗證總是正確的。這樣會導致一些后續(xù)問題。在引入泛型概念之后,這樣的問題就好處理了??梢园焉厦娴臄?shù)據(jù)類型定義為一個變量,當實際使用這段代碼時,指定具體的數(shù)據(jù)類型,使得代碼在運行時按照給出的具體數(shù)據(jù)類型進行類型驗證,這就是泛型,

5、就是“關于類型的變量”。使用泛型方法,使得程序具有抽象性和概括性,可以讓程序員避免重復編寫平行的程序段。class UnidirectionalListNode T data; UnidirectionalListNode nextNode; /定義兩個構造方法 UnidirectionalListNode(T object) this(object,null); UnidirectionalListNode(T object,UnidirectionalListNode node) data = object; nextNode = node; T getDate() return data

6、; UnidirectionalListNode getNextNode() return nextNode; 使用一個帶有尖括號的符號放在類名后面,把類中原來的Object使用T替換,即完成了一個泛型類的定義。當實際使用時,給出一個具體的引用類型,替代尖括號中的T,即可進行編譯和運行。這里相當于定義了一個變量,即一個關于類型的變量,T就是這個變量的標識符。泛型變量的書寫沒有明確的要求,習慣上使用單個的大寫字母。JFC類庫中經(jīng)常使用以下的字母作為泛型定義的類型變量。T:類型Type的首字母,使用頻率比較高,通常用于一般的類型定義。E:元素Element的首字母,多用于Java集合框架。K:關鍵

7、字Key的首字母,用于鍵/值對的關鍵字。V:值Value的首字母,用于鍵/值對的對應值。N:數(shù)字Number的首字母,用于指代泛型中的數(shù)字類型。當實際使用這樣的代碼時,需要使用一個具體的類型替代類型變量,這個類型要求必須是引用類型,不能是基本數(shù)據(jù)類型,但可以是基本數(shù)據(jù)類型的封裝類??梢愿鶕?jù)需要在一個代碼段中使用兩個或兩個以上的泛型變量。泛型的核心概念是通過代碼告訴編譯器想要使用什么類型,而使用類型的細節(jié)就需要編譯器幫助處理了。泛型定義僅在編譯階段有效,不會進入運行階段,進入運行階段的是使用實際引用類型替代類型變量后的代碼。二、泛型類將泛型定義方式應用于類定義,得到的類就是泛型類。在實際使用時,

8、必須使用一個具體的類型替代泛型類定義中的類型變量。然后繼續(xù)向下使用,可以獲得一個存儲字符串型引用的單向鏈表。三、泛型接口將泛型定義方式應用于接口定義,得到的接口就是泛型接口,其具體使用與泛型類類似,也是將泛型參數(shù)放到接口名的后面。泛型接口在實現(xiàn)時有兩種方式,可以在實現(xiàn)類中依然保留泛型變量,成為泛型類的定義;也可以在實現(xiàn)類中給出一個具體的類型替代泛型變量,成為實用類的定義。四、泛型方法將泛型定義方式應用于方法定義,得到的方法就是泛型方法。在定義泛型方法時,需要把泛型參數(shù)放到方法的返回值類型說明之前。在方法體中應該出現(xiàn)引用類型的地方,一律使用泛型參數(shù),以備編譯系統(tǒng)在運行代碼時使用實際引用類型替代。

9、這里有一個設計原則:如果只使用泛型方法就可以將整個類泛型化,就應該只使用泛型方法,不使用泛型類,因為這樣可以表述得更清楚。五、泛型通配符泛型通配符一般使用“?”代替具體的類型實參出現(xiàn)在程序代碼中,代表可以是任意的類型。注意,泛型通配符“?”與泛型定義使用的類型變量不同,類型變量是一個形參,而泛型通配符“?”代表的是實參。泛型通配符解決了泛型類不適用向上轉(zhuǎn)型原則的問題。六、泛型的上下邊界稱為上界通配符(Upper Bounds Wildcards),是指所有由T派生的子類,這時的“?”泛指在類的繼承樹上位置低于T的所有類,所以稱為上界通配符。稱為下界通配符(Lower Bounds Wildca

10、rds),是指所有派生了T的父類,這時的“?”泛指在類的繼承樹上位置高于T的所有類,所以稱為下界通配符。8.3枚舉一、枚舉的定義Java SE 5版本增加定義了枚舉,添加了枚舉關鍵字enum,用來定義枚舉數(shù)據(jù)類型。public enum Special MATHEMATICS,PHYSICS,CHEMISTRY,ELECTRONICS,COMPUTER;這就定義了一個“Special”的枚舉類型。這相當于聲明了一個“Special”類,此類繼承自Enum類,所有的元素都是類的字段,具有常量值,所以一般使用大寫字母的字符串描述元素。在使用枚舉類型時,需要生成類的對象實例引用,并將枚舉的一個元素賦

11、值給對象實例引用。在創(chuàng)建枚舉類型時,編譯器會自動添加一些特性給枚舉類型,如添加toString()方法用來顯示枚舉實例的名稱,添加ordinal()方法用來獲取枚舉常量元素的聲明順序,這兩個方法來自Enum類;還會添加static values()方法用來獲取聲明順序?qū)脑?,這個方法是編譯器添加的。二、Enum類Java SE 5版本增加定義了枚舉類,即Enum類,其元素使用泛型描述。該類實現(xiàn)了Serializable和Comparable兩個接口,具有可序列化和可比較的屬性,其中的幾個方法是比較常用的:compareTo(E o) /比較此枚舉與指定對象的順序equals(Object

12、other) /當指定對象等于此枚舉常量時,返回truehashCode() /返回枚舉常量的哈希碼ordinal() /返回枚舉常量的序數(shù)toString() /返回枚舉常量的名稱valueOf(Class enumType, String name) /返回指定枚舉類型的枚舉常量三、枚舉的使用枚舉實例可以像普通的常量一樣被使用。此外,枚舉有一個特別的用途,它可以在switch語句內(nèi)部使用,以枚舉實例引用作為switch語句的控制表達式?!纠?.6】枚舉和switch 語句使用8.4容器集合類從Java SE 5版本開始,對數(shù)據(jù)處理的內(nèi)容進行了整理和加強,JFC類庫中增加定義了一些專門用于處

13、理數(shù)據(jù)的API。一、For-each遍歷與迭代器例8.6使用了For-each遍歷,這是Java SE 5版本提供的一個新的遍歷工具。Foreach遍歷與for循環(huán)語句有些類似,其基本語法格式如下:for(ObjectInstanceName:Collection_or_Array) statements二、迭代器Java語言中的迭代器是通過Iterable接口和Iterator接口的定義實現(xiàn)的。Iterable接口的定義原型為java.lang.Iterable,其中只聲明了1個方法成員:Iterator iterator() /返回一個在一組T 類型的元素上 /進行迭代的迭代器Iterat

14、or接口的定義原型為java.util.Iterator,這里的代表其元素類型泛型,其中聲明了3個方法成員:boolean hasNext() /如果仍有元素可以迭代,則返回trueE next() /返回迭代的下一個元素void remove() /從迭代器指向的集合中移除迭代器 /返回的最后一個元素迭代器就是一種遍歷方法,它對各種容器集合類的元素都以一種序列的方式進行檢索,能夠讓程序員在不必了解集合的結構細節(jié)的前提下完成對集合元素的操作。相比而言,迭代器遍歷需要編寫的語句比較煩瑣,F(xiàn)or-each遍歷則是一種快捷的遍歷方法。Iterator接口還有一個子接口,其定義原型為java.util

15、.ListIterator,其中增加了幾個方法成員,可以實現(xiàn)雙向的遍歷操作。ListIterator一般只對LinkedList或其他可以實現(xiàn)雙向鏈接的鏈表進行遍歷,并且可以在迭代期間修改列表,同時獲得迭代器在列表中的當前位置。ListIterator沒有當前元素,它的指針位置始終位于調(diào)用previous()方法所返回的元素和調(diào)用next()方法所返回的元素之間。在確定位置時,使用的是Index索引值。在長度為n的列表中,有n+1個有效的索引值,索引值0位于第一個元素之前,索引值1位于第一個元素與第二個元素之間,以此類推,索引值n位于第n個元素之后。三、容器容器接口Collection定義了一

16、套實現(xiàn)數(shù)據(jù)類型處理的公共方法集,可以在這個方法集的基礎上定義進一步處理數(shù)據(jù)的方法。這個接口的定義原型為java.util.Collection,有一個默認的實現(xiàn)類java.util.AbstractCollection,以簡單方式實現(xiàn)了Collection接口。Collection接口的繼承層次結構:由于這些接口派生自Iterable接口,因此它們都可以生成迭代器,并且實現(xiàn)類的對象都可以使用For-each遍歷。四、列表接口List若干個實現(xiàn)類完成了對列表功能的定義。與其他接口相比,List接口強調(diào)順序(Sequence)概念,其中的每個元素都有特定的順序位置,并且順序是不能被改動的,可以通過

17、位置訪問其中的每個元素,所以將List接口稱為“有序的Collection”。列表的使用功能主要是通過List接口的兩個實現(xiàn)類ArrayList和LinkedList體現(xiàn)的。下面分別介紹List接口的兩個實現(xiàn)類ArrayList和LinkedList。ArrayListArrayList類的定義原型為java.util.ArrayList。ArrayList類善于隨機訪問元素,但是如果需要在其元素中間插入和刪除一個元素時,則需要移動后面的所有元素,所以運算比較慢。從實際功能上看,ArrayList類實現(xiàn)了一個大小可調(diào)的數(shù)組,因此ArrayList類也被稱為動態(tài)數(shù)組,在數(shù)值計算時有一定的優(yōu)勢。L

18、inkedListLinkedList類也實現(xiàn)了List接口,在其元素中間插入和刪除一個元素時的計算效率比ArrayList類高,但是在隨機訪問時的表現(xiàn)比ArrayList類遜色。在類的內(nèi)部,LinkedList類可以維護一個帶有頭節(jié)點的雙向鏈表,同時因為它實現(xiàn)了Queue接口,所以可以作為棧、隊列或雙向隊列使用。五、集合集合接口Set定義原型為java.util.Set,其若干個實現(xiàn)類完成了集合功能的定義。這里的集合實現(xiàn)了數(shù)學意義上的集合概念,其中的元素不可以重復出現(xiàn),卻不關注元素的順序。其常用的實現(xiàn)類包括HashSet、TreeSet和LinkedHashSet。下面分別介紹Set接口的實

19、現(xiàn)類HashSet、TreeSet和LinkedHashSet。HashSet類的定義原型為java.util.HashSet,是為快速查詢而設計的集合,稱為散列集合。其內(nèi)部維護了一個Hash表,存入其中的元素必須定義hashCode()方法,并且向其中添加元素的add()方法隱含了比較元素的步驟,要求添加的元素必須與已有的所有元素都不相同才能被添加。一般而言,HashSet類的總體性能總是優(yōu)于TreeSet類和LinkedHashSet類。TreeSet類的定義原型為java.util.TreeSet,是一個保持次序的集合,其內(nèi)部由一個數(shù)結構維護,并將元素存儲在紅-黑樹結構中。TreeSet

20、類最重要的性能是維護順序,可以從中提取有序序列,前提是元素類型必須實現(xiàn)了Comparable接口,具有可比較屬性。LinkedHashSet類的內(nèi)部使用鏈表維護元素的順序,其定義原型為java.util.LinkedHashSet,查詢操作的速度比較快,但是在插入、刪除操作方面就要慢得多。當使用迭代器遍歷時,元素的輸出順序就是元素的輸入順序?!纠?.9】使用HashSet 類、TreeSet 類和LinkedHashSet 類六、隊列隊列是一個先進先出的容器,在并發(fā)處理中具有重要的作用。隊列接口Queue也是從容器接口Collection派生而來的,其定義原型為java.util.Queue,

21、實現(xiàn)Queue接口的類主要有LinkedList,并且該類已經(jīng)很好地實現(xiàn)了隊列的功能,還有一個PriorityQueue類,其定義原型為java.util.PriorityQueue,是Java SE 5 版本中新增的,實現(xiàn)了優(yōu)先級隊列。七、映射映射實際上維護了一組鍵/值關系,即從鍵到值的對應關系。Java語言的映射功能是通過Map接口和幾個主要的實現(xiàn)類的定義完成的。Map接口的定義原型為java.util.Map,泛型變量K和V分別代表鍵和值。Map接口的元素是一組鍵/值對,這些元素是無序的,其中的鍵是唯一的,在同一個Map接口中,不允許出現(xiàn)重復的鍵,但允許出現(xiàn)重復的值。Map接口沒有父接口

22、,也沒有繼承Iterable接口,因此Map接口的實現(xiàn)類都不能生成迭代器,也不能使用For-each遍歷。在映射中存在3種視圖,即映射關系集合視圖、鍵的集合視圖和值的集合視圖,可以使用entrySet()方法、keySet()方法和values()方法分別獲取這3種視圖,并且可以通過對這3種視圖的遍歷實現(xiàn)對映射的遍歷。在Map接口的實現(xiàn)類中,HashMap類是最重要的,也是性能最好的,其他幾個實現(xiàn)類則各有所長,亦各有所短。HashMap類是最主要的Map接口實現(xiàn)類,其定義原型為java.util.HashMap,類中的方法都是對Map接口中定義的方法的實現(xiàn)。在HashMap類中維護了一個Has

23、h表,其性能會隨著容量的增大而降低,在其中進行查找操作的代價比較小,進行插入操作的代價比較大。HashMap類是最具代表性的映射實現(xiàn)類,所以在大多數(shù)情況下,程序中使用的都是HashMap類。java.util.LinkedHashMap類類似于HashMap類,在存儲鍵/值對時依然保留插入時的順序,在使用時的計算速度比HashMap類慢,但是在迭代檢索時的速度比較快。其內(nèi)部維護了一個鏈表。java.util.TreeMap類實現(xiàn)了紅-黑樹,所得到的結果是經(jīng)過排序的,其中定義了一個subMap()方法,可以返回一個子樹。java.util.WeakHashMap類稱為弱鍵(Weak Key)映射,是專門為了解決某類特殊問題而設計的,如果在程序中沒有引用指向某個鍵,則這個鍵可以被釋放,并被垃圾收集器回收。java.util.IdentityHashMap類使用運算符“=”代替equals()方法來比較鍵,是一種特定應用的映射實現(xiàn)類。8.5注解一、什么是注解注解(Annotation)也稱標注,是從Java SE 5 版本開始引入Java語言的一種注釋機制,是一種形式化地向程序代碼中添加信息的方法。這種方法在Java SE中有使用,在Java EE中的使用更為廣泛。注解本身

溫馨提示

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

最新文檔

評論

0/150

提交評論