版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三講 對(duì)象的容納及字符處理,1、數(shù)組 2、向量 3、位集 4、堆棧 5、散列表 6、集合使用,復(fù)習(xí)-java應(yīng)用程序結(jié)構(gòu),每個(gè)java源文件可以包含很多類; 每個(gè)java源文件只能有一個(gè)public類; 若有public類,源文件必須按該類命名; 含有多個(gè)類的java源文件編譯后對(duì)應(yīng)多個(gè)class文件,每個(gè)類對(duì)應(yīng)一個(gè)class文件; Public類可以供命令行、本類、包內(nèi)其它類其它包調(diào)用; 非public類根據(jù)訪問(wèn)權(quán)限符來(lái)決定如何訪問(wèn)。,復(fù)習(xí)-上溯造型和下溯造型,復(fù)習(xí)-上溯造型和下溯造型,/: c07:RTTI.java import java.util.*; class Useful pu
2、blic void f() public void g() class MoreUseful extends Useful public void f() public void g() public void u() public void v() public void w() ,public class RTTI public static void main(String args) Useful x = new Useful(), new MoreUseful() ; x0.f(); x1.g();/上溯造型安全 /Compile-time: method not /found in
3、 Useful: /! x1.u(); (MoreUseful)x1).u(); / 下溯造型必須檢查 (MoreUseful)x0).u(); / Exception thrown /:,集合庫(kù),Java1.1集合庫(kù) Vector BitSet Stack Hashtable,Java1.2集合庫(kù) Collections Lists Sets Maps,1、數(shù)組,一維數(shù)組 (1) 一維數(shù)組的定義 一維數(shù)組的定義方式為: type arrayName ; 其中類型(type)可以為Java中任意的數(shù)據(jù)類型,包 括簡(jiǎn)單類型和組合類型,數(shù)組名arrayName為一個(gè) 合法的標(biāo)識(shí)符, 指明該變量是一
4、個(gè)數(shù)組類型變量。 例如: int intArray ; 聲明了一個(gè)整型數(shù)組,數(shù)組中的每個(gè)元素為整型數(shù)據(jù)。,1、數(shù)組,我們還可以定義一個(gè)復(fù)合類型的數(shù)組,例如: Date dateArray ; 聲明了一個(gè)容納復(fù)合數(shù)據(jù)類型Date的數(shù)組。 與C、C+不同,Java在數(shù)組的定義中并不為數(shù)組元素分配內(nèi)存,因此 中不用指出數(shù)組中元素的個(gè)數(shù),即數(shù)組長(zhǎng)度,而且對(duì)于如上定義的一個(gè)數(shù)組是不能訪問(wèn)它的任何元素的。必須經(jīng)過(guò)初始化后,才能應(yīng)用數(shù)組的元素。,1、數(shù)組,除了這種定義數(shù)組的方式之外,java語(yǔ)言還提供了其他的定義形式,如下所示: type arrayName; 對(duì)于以上舉出的例子,我們也可以這樣定義: in
5、t intArray; Date dateArray;,1、數(shù)組,(2) 一維數(shù)組的初始化 一維數(shù)組定義之后,必須經(jīng)過(guò)初始化才可以引用。數(shù)組的初始化分為靜態(tài)初始化和動(dòng)態(tài)初始化兩種: 靜態(tài)初始化:在定義數(shù)組的同時(shí)對(duì)數(shù)組元素進(jìn)行初始化,例如: int intArray =1,2,3,4;/定義了一個(gè)含有4個(gè) / 元素的int型數(shù)組。,1、數(shù)組,動(dòng)態(tài)初始化:使用運(yùn)算符new為數(shù)組分配空間,對(duì)于簡(jiǎn) 單類型的數(shù)組,其格式如下: type arrayName =new typearraySize; type arrayName=new typearraySize; 對(duì)于復(fù)合類型的數(shù)組,需要經(jīng)過(guò)兩步空間分配
6、。 首先: type arrayName =new typearraySize; 然后:arrayName0=new type(paramList); arrayNamearraySize-1=new type(paramList);,例如: String stringArrar; /定義一個(gè)String類型的數(shù)組 stringArray = new String3; /給數(shù)組stringArray分配3個(gè)應(yīng)用 /空間,初始化每個(gè)引用值為null stringArray0=new String(“how”); stringArray1=new String(“are”); stringArra
7、y2=new String(“you”);,1、數(shù)組,初始化各數(shù)組元素,(3) 一維數(shù)組的引用 當(dāng)定義了一個(gè)數(shù)組,并用運(yùn)算符new為它分配了內(nèi)存空間后,就可以引用數(shù)組中的每一個(gè)元素了。元素的引用方式為: arrayNameindex index為數(shù)組下標(biāo),可以是整型常數(shù)或表達(dá)式,如:arrayName1, arrayNamei, arrayName6*i等。下標(biāo)是0序的,即從0開(kāi)始,一直到數(shù)組長(zhǎng)度減1。,1、數(shù)組,1、數(shù)組,另外,與C、C+中不同,Java對(duì)數(shù)組元素要進(jìn)行越界檢查以保證安全性。同時(shí),對(duì)于每個(gè)數(shù)組都有一個(gè)屬性length指明它的長(zhǎng)度,例如: intArray.length指明數(shù)組
8、intArray的長(zhǎng)度。,1、數(shù)組-返回,假定寫(xiě)一個(gè)方法,讓它返回一系列東西 c和c+中問(wèn)題復(fù)雜化 因?yàn)椴荒芊祷匾粋€(gè)數(shù)組,只能返回指向數(shù)組的 指針。很難控制數(shù)組的“存在時(shí)間”,容易造成內(nèi)存泄漏。 Java采用類似的方法 此時(shí)返回的仍然是數(shù)組指針,但是不必?fù)?dān)心它是否可用,垃圾收集器會(huì)在我們完成后自動(dòng)將其清除。,2、向量,向量(Vector)是java.util類包提供的一個(gè)工具類。它對(duì)應(yīng)于類似數(shù)組的順序存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),但是具有比數(shù)組更強(qiáng)大的功能。它是允許不同類型元素共存的變長(zhǎng)數(shù)組。每個(gè)Vector類的對(duì)象可以表達(dá)一個(gè)完整的數(shù)據(jù)序列。Vector類的對(duì)象不但可以保存順序的一列數(shù)據(jù),而且還提供了許多
9、有用的方法來(lái)操作和處理這些數(shù)據(jù)。 另外,Vector類對(duì)象所表達(dá)的序列中元素的個(gè)數(shù)是可 變的,即Vector實(shí)現(xiàn)了變長(zhǎng)數(shù)組。,2、向量,Java中的數(shù)組只能保存固定數(shù)目的元素,且必須把所有需要的內(nèi)存單元一次性的申請(qǐng)出來(lái),而不能先創(chuàng)建數(shù)組再追加數(shù)組元素?cái)?shù)量,為了解決這個(gè)問(wèn)題Java中引入了向量類Vector。Vector也是一組對(duì)象的集合,但相對(duì)于數(shù)組,Vector可以追加對(duì)象元素?cái)?shù)量,可以方便的修改和維護(hù)序列中的對(duì)象。,2、向量,向量比較適合在如下情況下使用: 1. 需要處理的對(duì)象數(shù)目不定,序列中的元素都是對(duì) 象或可以表示為對(duì)象。 2. 需要將不同類的對(duì)象組合成一個(gè)數(shù)據(jù)序列。 3. 需要做頻繁
10、的對(duì)象序列中元素的插入和刪除。 4. 經(jīng)常需要定位序列中的對(duì)象和其他查找操作。 5. 在不同的類之間傳遞大量的數(shù)據(jù)。 Vector類的方法相對(duì)于數(shù)組要多一些,但是使用這個(gè) 類也有一定的局限性,例如其中的對(duì)象不能是簡(jiǎn)單數(shù)據(jù) 類型等。,(1) 創(chuàng)建向量類的對(duì)象 Vector類有三個(gè)構(gòu)造函數(shù): Vector():構(gòu)造一個(gè)空的向量 Vector(int capacity):以指定的存儲(chǔ)容量構(gòu)造一個(gè)空的向量 Vector(int capacity, int capacityIncrement):以指定的存儲(chǔ)容量和容量增量構(gòu)造一個(gè)空的Vector。 例如: Vector MyVector=new Vect
11、or(100,50); 這個(gè)語(yǔ)句創(chuàng)建的MyVector向量序列初始有100個(gè)元素的空間,以后一旦使用殆盡則以50為單位遞增,使序列中元素的個(gè)數(shù)變化成150,200,。在創(chuàng)建Vector序列時(shí),不需要指明序列中元素的類型,可以在使用時(shí)確定。,2、向量,(2) 向向量序列中添加元素: 有兩種添加元素的方法: addElement( Object obj):將新元素添加到序列尾部。 insertElementAt(Object obj, int index):將新元素插 入到指定位置。,2、向量,2、向量,下面是使用這兩種方法的例子:,Vector MyVector=new Vector(); fo
12、r (int i=1;i=10;i+) MyVector.addElement(new Random(); MyVector.insertElementAt(middle,5);,2、向量,(3) 修改或刪除向量序列中的元素: 使用以下方法修改或刪除向量序列中的元素: 1. setElementAt(Object obj,int index) 將向量序列index位置處的對(duì)象元素設(shè)置成為obj,如 果這個(gè)位置原來(lái)有元素則被覆蓋。 2. removeElement(Object obj) 刪除向量序列中第一個(gè)與指定的obj對(duì)象相同的元素, 同時(shí)將后面的元素前提,補(bǔ)上空位。這個(gè)方法返回的是 布爾值
13、。 3. removeElementAt(int index) 刪除index指定位置處的元素,同時(shí)將后面的元素前提。,2、向量,4. removeAllElements() 清除向量序列中的所有元素。 下例中先創(chuàng)建了一個(gè)Vector,再刪除掉其中的所有字符串對(duì)象“to”。,Vector MyVector=new Vector(100); for (int i=0;i10;i+) MyVector.addElement(“welcome”); MyVector.addElement(“to”); MyVector.addElement(“beijing”); while (MyVector.r
14、emoveElement(“to”);,2、向量,(4)查找向量序列中的元素 常用于查找向量序列中某元素的方法如下: 1.Object elementAt(int index) 返回指定位置處的元素。 一個(gè)要注意的問(wèn)題:由于返回的是Object類型的對(duì)象, 在使用之前通常需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將返回的對(duì)象引 用轉(zhuǎn)換成Object類的某個(gè)具體子類的對(duì)象。例如: String str=(String)MyVector.elementAt(0); 2. boolean contains(Object obj) 檢查向量序列中是否包含指定的對(duì)象元素obj。,2、向量,3. int indexOf (O
15、bject obj,int start_index) 從指定的start_index位置開(kāi)始向后搜索,返回所找到 的第一個(gè)與指定對(duì)象obj相同的元素的下標(biāo)位置。若指定 的對(duì)象不存在,則返回1。 4. int lastIndexOf(Object obj,int start_index) 從指定的start_index位置開(kāi)始向前搜索,返回所找到 的第一個(gè)與指定對(duì)象obj相同的元素的下標(biāo)位置。若指定 的對(duì)象不存在,則返回1。例如:,int i=0; while(i=MyVector.indexOf(“welcome”,i)!=-1) System.out.println(i); ,2、向量,(5
16、)Vector中的其他方法: capacity():返回Vector的容量 clone():建立Vector的備份 copyInto(Object):把Vector中的元素拷貝到一個(gè)數(shù)組中 firstElement():返回第一個(gè)元素 lastElement():返回最后一個(gè)元素 isEmpty():判斷是否為空 setSize(int size):設(shè)置Vector的大小 size():返回Vector中元素的數(shù)量 trimToSize():將Vector的容量下調(diào)至最小值,2、向量,使用Vector時(shí),一個(gè)需要特別注意的問(wèn)題就是要先創(chuàng)建后使用。如果不先使用new算法利用構(gòu)造函數(shù)創(chuàng)建Vecto
17、r類的對(duì)象,而直接使用Vector的方法,如:addElement()等方法,則可能造成堆棧溢出或使用null指針等異常,妨礙程序的正常運(yùn)行。,3、位集(BitSet),位集是由“二進(jìn)制位”構(gòu)成的一個(gè)Vector。 適用場(chǎng)合:高效率保存大量“開(kāi)關(guān)”信息。 優(yōu)點(diǎn):節(jié)省空間 缺點(diǎn): 速度比固有類型的數(shù)組慢 最小長(zhǎng)度64位,如果存8位數(shù)據(jù),用BitSet顯得浪費(fèi)。 具體細(xì)節(jié):參見(jiàn)教材201頁(yè),4、堆棧(Stack),Stack是一種“后入先出”集合。,import java.util.*;/: c09:Stacks.java public class Stacks static String mon
18、ths = January, February, March, April, May, June, July, August, September, October, November, December ; public static void main(String args) Stack stk = new Stack();,4、堆棧(Stack),for(int i = 0; i months.length; i+) stk.push(monthsi + ); / Treating a stack as a Vector: stk.addElement(The last line);
19、System.out.println( element 5 = + stk.elementAt(5); System.out.println(popping elements:); while(!stk.empty() System.out.println(stk.pop(); /:,5、散列表(Hashtable),散列表是通過(guò)對(duì)象來(lái)查找對(duì)象的工具,也可以成為“映射”、“字典”或“關(guān)聯(lián)數(shù)組”。(參見(jiàn)203頁(yè)) 創(chuàng)建散列表 Hashtable numbers = new Hashtable(); numbers.put(one, new Integer(1); numbers.put(two,
20、 new Integer(2); numbers.put(three, new Integer(3); 檢索散列表 Integer n = (Integer)numbers.get(two); if (n != null) System.out.println(two = “n); ,6、集合使用,使用java集合的“缺點(diǎn)”是在將對(duì)象置入一個(gè)集合時(shí)丟失了類型信息。 集合實(shí)際容納的是類型為Object的一些對(duì)象的句柄。 如果容納實(shí)際類型,將不通用,妨礙它成為常規(guī)工具。 不能包含基本數(shù)據(jù)類型。 使用java集合注意的兩點(diǎn): 由于類型信息被拋棄,任何類型的對(duì)象都可以進(jìn)入集合。 集合能肯定的唯一事情就
21、是自己容納的一個(gè)對(duì)象的句柄。使用之前必須對(duì)其進(jìn)行造型。,6、集合使用,/: c09:Cat.java public class Cat private int catNumber; Cat(int i) catNumber = i; void print() System.out.println(Cat # + catNumber); /:,/: c09:Dog.java public class Dog private int dogNumber; Dog(int i) dogNumber = i; void print() System.out.println(Dog # + dogNum
22、ber); /:,6、集合使用,/: c09:CatsAndDogs.java import java.util.*; public class CatsAndDogs public static void main(String args) Vector cats = new Vector(); for(int i = 0; i 7; i+) cats.addElement(new Cat(i); / Not a problem to add a dog to cats: cats.addElement(new Dog(7); for(int i = 0; i cats.size(); i+
23、) (Cat)cats.elementAt(i).print(); / Dog is detected only at run-time /:,7、枚舉器(Enumeration),要求集合的elements()方法要求集合提供一個(gè)Enumeration。 nextElement(),首次調(diào)用返回第一個(gè)對(duì)象,再次調(diào)用返回 下一個(gè)對(duì)象。 hasMoreElements(),檢查序列中是否還有更多的對(duì)象。,7、枚舉器,/: c09:Cat.java public class Cat private int catNumber; Cat(int i) catNumber = i; void prin
24、t() System.out.println(Cat # + catNumber); /:,/: c09:Dog.java public class Dog private int dogNumber; Dog(int i) dogNumber = i; void print() System.out.println(Dog # + dogNumber); /:,7、枚舉器,/: c09:CatsAndDogs.java import java.util.*; public class CatsAndDogs public static void main(String args) Vecto
25、r cats = new Vector(); for(int i = 0; i 7; i+) cats.addElement(new Cat(i); / Not a problem to add a dog to cats: cats.addElement(new Dog(7); Enumeration e=cats.elements(); while(e.hasMoreElements() (Cat)e.nextElement().print(); / Dog is detected only at run-time /:,8、字符串,在Java中,存放字符串常量的對(duì)象用String類,對(duì)于
26、字符串變量,由于程序中經(jīng)常需要對(duì)它做添加,插入,修改等操作,一般存放在StringBuffer類的對(duì)象中。 課后通過(guò)JDK文檔自學(xué)String、StringBuffer類以及今天沒(méi)有擴(kuò)充的集合類。,8、字符串,Java與C和C+處理字符串的差別 1. C和C+的字符串只是簡(jiǎn)單的以零字符結(jié)尾的字符數(shù) 組,而Java中,字符串是一個(gè)封裝的對(duì)象,這種處理對(duì)于 編程者提供了許多有利之處。 2. C和C+中可以通過(guò)指針直接對(duì)字符串所在的內(nèi)存地 址進(jìn)行操作,并且不對(duì)越界情況進(jìn)行檢查,Java中只能通 過(guò)類String或StringBuffer所提供的接口對(duì)字符串進(jìn)行操作, 并且要對(duì)越界情況進(jìn)行檢查并報(bào)告,
27、這樣大大增加了安全性。 3. 由于類String和StringBuffer的接口都經(jīng)明確說(shuō)明,所以我們可以預(yù)知Java中字符串處理的功能;而在C和C+中, 只有通過(guò)庫(kù)函數(shù)或者自定義函數(shù)對(duì)字符串進(jìn)行處理。,9、運(yùn)行期類型鑒定(RTTI),RTTI:在運(yùn)行期間查找對(duì)象和類信息,主要以下包括三種。 經(jīng)典造型 Class對(duì)象 instanceof,9、運(yùn)行期類型鑒定(經(jīng)典造型),class Shape void draw() System.out.println(this + .draw(); class Circle extends Shape public String toString() re
28、turn Circle; class Square extends Shape public String toString() return Square; class Triangle extends Shape public String toString() return Triangle; ,9、運(yùn)行期類型鑒定(經(jīng)典造型),public class Shapes public static void main(String args) Vector s = new Vector(); s.addElement(new Circle(); s.addElement(new Square
29、(); s.addElement(new Triangle(); Enumeration e = s.elements(); while(e.hasMoreElements() (Shape)e.nextElement().draw(); /:,9、運(yùn)行期類型鑒定( Class對(duì)象),Class對(duì)象 每個(gè)類都對(duì)應(yīng)一個(gè)Class對(duì)象,該對(duì)象包含了與類有關(guān)的信息,保存在同名的.class文件中。 運(yùn)行時(shí)一旦想生成某個(gè)類的一個(gè)對(duì)象,JVM首先檢查那個(gè)類型的Class對(duì)象是否載入。若尚未載入,JVM就會(huì)查找同名的.class文件,并將其載入。 載入后,就用它創(chuàng)建那個(gè)類型的所有對(duì)象。,9、運(yùn)行期類型鑒定( Class對(duì)象),/ToyTest.java interface HasBatteries interface Waterproof interface ShootsThings class Toy
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高價(jià)產(chǎn)品說(shuō)服策略
- 化學(xué)品企業(yè)安全責(zé)任制實(shí)施
- 金融統(tǒng)計(jì)就業(yè)前景分析
- 二本國(guó)貿(mào)專業(yè)就業(yè)前景
- 中班消防安全說(shuō)課稿
- 美妝技巧話術(shù)
- 化學(xué)品應(yīng)急演練組織實(shí)施
- 冷鏈?zhǔn)鹿守?zé)任認(rèn)定管理規(guī)范
- 中樞神經(jīng)系統(tǒng)疾病護(hù)理要點(diǎn)
- 臨床矯形器護(hù)理指南
- 2025年可愛(ài)的中國(guó)測(cè)試題及答案
- 油費(fèi)補(bǔ)助管理辦法
- 新食品零售運(yùn)營(yíng)管理辦法
- 強(qiáng)制性產(chǎn)品認(rèn)證實(shí)施規(guī)則 低壓電器 低壓元器件(CNCA-C03-02:2024)
- 《實(shí)踐論》《矛盾論》導(dǎo)讀課件
- 農(nóng)村殺豬活動(dòng)方案
- 種子公司企業(yè)管理制度
- DB4201-T 617-2020 武漢市架空管線容貌管理技術(shù)規(guī)范
- 藥品追溯碼管理制度
- openEuler系統(tǒng)管理與服務(wù)器配置 課件 第9章DNS服務(wù)器
- 供銷集團(tuán)考試試題及答案
評(píng)論
0/150
提交評(píng)論