Java高級語言特征_第1頁
Java高級語言特征_第2頁
Java高級語言特征_第3頁
Java高級語言特征_第4頁
Java高級語言特征_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java高級特征西安電子科技大學(xué)孫聰suncong@課程內(nèi)容高級語言程序設(shè)計概述面向?qū)ο蟪绦蛟O(shè)計概念Java語言基礎(chǔ)Java面向?qū)ο筇匦訨ava高級特征常用預(yù)定義類的使用異常處理輸入輸出Java正則表達(dá)式線程GUI程序設(shè)計Java網(wǎng)絡(luò)程序設(shè)計靜態(tài)變量、方法與初始化程序塊final關(guān)鍵字抽象類與接口集合類枚舉類型Wrapper類靜態(tài)變量(類變量)靜態(tài)變量:在類的成員變量聲明中帶有static關(guān)鍵字的變量classEmployee{privateintid;publicstaticintserialNum=1;Employee(){id=serialNum++;}publicstaticvoidmain(String[]args){Employeee1=newEmployee();Employeee2=newEmployee();Employeee3=newEmployee();}}靜態(tài)變量(類變量)該類的所有的對象實例之間共享方法區(qū)中的靜態(tài)變量classEmployee{privateintid;publicstaticintserialNum=1;Employee(){id=serialNum++;}publicstaticvoidmain(String[]args){Employeee1=newEmployee();Employeee2=newEmployee();Employeee3=newEmployee();}}id:1sNsN:1id:2sNid:3sNe1e2e3sN:2sN:3sN:4靜態(tài)變量的創(chuàng)建靜態(tài)變量的創(chuàng)建與實例對象無關(guān)只在系統(tǒng)加載其所在類時分配空間并初始化,且在創(chuàng)建該類的實例對象時不再分配空間什么時候加載其所在類?運(yùn)行到不得不加載該類的時候什么是“不得不加載該類的時候”?即將創(chuàng)建該類的第一個對象時首次使用該類的靜態(tài)方法或靜態(tài)變量時加載一個類的子類之前要先加載其父類classBowl{Bowl(inti){print("Bowl("+i+")");}voidf1(inti){print("f1("+i+")");}}classTable{staticBowlbowl1=newBowl(1);Table(){print("Table()");bowl2.f1(1);}voidf2(inti){print("f2("+i+")");}staticBowlbowl2=newBowl(2);}classCupboard{Bowlbowl3=newBowl(3);staticBowlbowl4=newBowl(4);Cupboard(){print("Cupboard()");bowl4.f1(2);}voidf3(inti){print("f3("+i+")");}staticBowlbowl5=newBowl(5);}publicclassStaticInitialization{publicstaticvoidmain(String[]args){print("newCupboard()inmain");newCupboard();print("newCupboard()inmain");newCupboard();table.f2(1);cupboard.f3(1);}staticTabletable=newTable();staticCupboardcupboard=newCupboard();}靜態(tài)變量的訪問非private的靜態(tài)變量,可在類外用類名訪問classEmployee{privateintid;publicstaticintserialNum=1;Employee(){id=serialNum++;}}classOtherClass{publicstaticvoidmain(String[]args){System.out.println(Employee.serialNum);}}靜態(tài)變量的訪問非private的靜態(tài)變量,可在類外用類名訪問classEmployee{privateintid;publicstaticintserialNum=1;Employee(){id=serialNum++;}}classOtherClass{publicstaticvoidmain(String[]args){Employeee=newEmployee();System.out.println(e.serialNum);}}靜態(tài)方法(類方法)靜態(tài)方法:在類的成員方法聲明中帶有static關(guān)鍵字的方法main方法是靜態(tài)方法、程序入口點,JVM不創(chuàng)建實例對象就可以運(yùn)行該方法任何類的構(gòu)造方法實際上都是靜態(tài)方法,當(dāng)首次創(chuàng)建一個類的對象實例時,如果類還沒有被裝載,就會首先裝載該類,然后再進(jìn)行對象的實例化靜態(tài)方法一般通過類名訪問,但特殊情況下也可通過實例對象訪問classGeneralFunction{ publicstaticintadd(intx,inty){ returnx+y; }}publicclassUseGeneral{ publicstaticvoidmain(String[]args){ intc=GeneralFunction.add(9,10); System.out.println("9+10="+c); }}靜態(tài)方法(類方法)靜態(tài)方法中沒有this引用,因此,靜態(tài)方法不能直接調(diào)用實例方法,也不能直接訪問所屬類的實例成員變量publicclassTestStaticMethod{ publicstaticvoidmain(String[]args){ StaticMethodobj=newStaticMethod(); StaticMethod.sPrintXAndY(obj); }}classStaticMethod{ intx=0; staticinty=1; publicvoidiPrintAndIncreaseY(){ sPrintY(); y++; } publicstaticvoidsPrintY(){ //System.out.println(this.x); //不能訪問實例成員變量

//iPrintAndIncreaseY(); //不能訪問實例方法

System.out.println(StaticMethod.y); //可以訪問靜態(tài)變量

} publicstaticvoidsPrintXAndY(StaticMethodo){ System.out.println(o.x); //可以通過o引用訪問實例成員變量

o.iPrintAndIncreaseY(); //可以通過o引用調(diào)用實例方法

sPrintY(); //可以直接調(diào)用靜態(tài)方法

}}靜態(tài)方法的重寫回顧方法重寫的規(guī)則:不改變方法的名稱、參數(shù)列表和返回值,改變方法的內(nèi)部實現(xiàn)子類中重寫方法的訪問權(quán)限不能縮小子類中重寫方法不能拋出新的異常父類中private的成員,在子類中不能被覆蓋(重寫)靜態(tài)方法的重寫本節(jié)加入以下重寫規(guī)則:子類不能把父類的靜態(tài)方法重寫為非靜態(tài)子類不能把父類的非靜態(tài)方法重寫為靜態(tài)子類可以聲明與父類靜態(tài)方法相同的方法靜態(tài)方法的重寫不會導(dǎo)致多態(tài)性構(gòu)造方法本質(zhì)上是static方法,不具有多態(tài)性靜態(tài)方法的重寫classClassA{publicvoidmtdOne(inti){}publicvoidmtdTwo(inti){}publicstaticvoidmtdThree(inti){}publicstaticvoidmtdFour(inti){}}classClassBextendsClassA{publicstaticvoidmtdOne(inti){}//錯誤!將ClassA中的mtdOne()變成靜態(tài)的publicvoidmtdTwo(inti){}publicvoidmtdThree(inti){}//錯誤!將ClassA中的mtdThree()變?yōu)榉庆o態(tài)publicstaticvoidmtdFour(inti){}//正確!兩個靜態(tài)方法mtdFour()獨立}靜態(tài)方法的重寫本節(jié)加入以下重寫規(guī)則:子類不能把父類的靜態(tài)方法重寫為非靜態(tài)子類不能把父類的非靜態(tài)方法重寫為靜態(tài)子類可以聲明與父類靜態(tài)方法相同的方法靜態(tài)方法的重寫不會導(dǎo)致多態(tài)性構(gòu)造方法本質(zhì)上是static方法,不具有多態(tài)性/*static方法的行為不具有多態(tài)性*/classStaticSuper{ publicstaticStringstaticGet(){return"BasestaticGet()";} publicStringdynamicGet(){return"BasedynamicGet()";}}classStaticSubextendsStaticSuper{ publicstaticStringstaticGet(){return"DerivedstaticGet()";} publicStringdynamicGet(){return"DeriveddynamicGet()";}}publicclassStaticPoly{ publicstaticvoidmain(String[]args){ StaticSupersup=newStaticSub();//向上轉(zhuǎn)型 System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); }}靜態(tài)初始化程序塊類定義中不屬于任何方法體且以static關(guān)鍵字修飾的語句塊 static{…}在加載該類時執(zhí)行且只執(zhí)行一次如果類中定義了多個靜態(tài)語句塊,則這些語句塊按照在類中出現(xiàn)的次序運(yùn)行classStaticInitDemo{ staticinti; static{ i=5; System.out.println("Staticcode:i="+i++); }}publicclassTestStaticInit{ publicstaticvoidmain(Stringargs[]){ System.out.println("Maincode:i="+StaticInitDemo.i); }}寫出以下程序的輸出classT1{ staticints1=1; static{System.out.println("staticblockofT1:"+T2.s2);} T1(){System.out.println("T1():"+s1);}}classT2extendsT1{ staticints2=2; static{System.out.println("staticblockofT2:"+T2.s2);} T2(){System.out.println("T2():"+s2);}}publicclassInheritStaticInit{ publicstaticvoidmain(String[]args){ newT2(); }}靜態(tài)變量、方法與初始化程序塊final關(guān)鍵字抽象類與接口集合類枚舉類型Wrapper類final關(guān)鍵字final的使用位置在類聲明中使用:表示類不能被繼承在成員方法聲明及方法參數(shù)中使用:成員方法不能被重寫,參數(shù)變量值不能更改在成員變量和局部變量聲明中使用:表示變量的值不能更改在類聲明中使用final關(guān)鍵字被定義成final的類不能再派生子類例: finalclassEmployee{…} classManagerextendsEmployee{…}在成員方法聲明中使用final關(guān)鍵字被定義成final的方法不能被重寫將方法定義為final可使運(yùn)行時的效率優(yōu)化對于final方法,編譯器直接產(chǎn)生調(diào)用方法的代碼,而阻止運(yùn)行時刻對方法調(diào)用的動態(tài)綁定private的方法都隱含指定為是final的,對子類不可見就無所謂被重寫在方法參數(shù)中使用final關(guān)鍵字將方法參數(shù)指明為final,則無法在方法中更改參數(shù)的值classGizmo{ publicvoidspin(){}}publicclassFinalArg{ voidwith(finalGizmog){ //g=newGizmo(); //錯誤,g是final的 } voidwithout(Gizmog){ g=newGizmo(); g.spin(); } intg(finalinti){returni+1;} publicstaticvoidmain(String[]args){ FinalArgbf=newFinalArg(); bf.without(null); bf.with(null); }}在成員變量中使用final關(guān)鍵字被定義成final的成員變量不能改變對于基本類型的成員變量:數(shù)值不變用來定義常量:聲明final變量并同時賦初值對于引用類型的成員變量:引用不變,但被引用對象可被修改這一約定同樣適用于數(shù)組classValue{inti; publicValue(inti){this.i=i;}}publicclassFinalData{ privatestaticRandomrand=newRandom(47);

privatefinalintvalueOne=9; //基本類型編譯時常量

privatefinalinti4=rand.nextInt(20);//運(yùn)行時不可變,但非編譯時常量

privateValuev1=newValue(11); privatefinalValuev2=newValue(22); //引用類型常量 privatefinalint[]a={1,2,3,4,5,6}; //數(shù)組類型常量 publicstaticvoidmain(String[]args){ FinalDatafd1=newFinalData(); //fd1.valueOne++;fd1.i4++; //valueOne,i4不能更改

fd1.v1=newValue(9); //v1不是final的,可引用到新的對象

//fd1.v2=newValue(0); //v2是final的,不能引用到新的對象

fd1.v2.i++; //v2引用不能更改,但對象本身可更改

//fd1.a=newint[3]; //數(shù)組a為final,不能引用到新的數(shù)組

for(inti=0;i<fd1.a.length;i++){ fd1.a[i]++;//數(shù)組a是final的,但數(shù)組元素不是final的

} }}在成員變量中使用final關(guān)鍵字空白final:若final成員變量聲明時未賦初值,則在所屬類的每個構(gòu)造方法中都必須對該變量賦值classPoppet{ privateinti; Poppet(intii){i=ii;}}publicclassBlankFinal{ privatefinalinti=0; //被初始化的final privatefinalintj; //空白final privatefinalPoppetp; //空白final引用 publicBlankFinal(){ j=1; //初始化空白final p=newPoppet(1); //初始化空白final引用 } publicBlankFinal(intx){ j=x; //初始化空白final p=newPoppet(x); //初始化空白final引用 } publicstaticvoidmain(String[]args){ newBlankFinal(); newBlankFinal(47); }} //又例:Customer.java在局部變量中使用final關(guān)鍵字被定義成final的局部變量可以在所屬方法的任何位置被賦值,但只能賦一次靜態(tài)變量、方法與初始化程序塊final關(guān)鍵字抽象類與接口集合類枚舉類型Wrapper類抽象方法抽象方法:Java允許在類中只聲明方法而不提供方法的實現(xiàn),這種只有聲明而沒有方法體的方法稱為抽象方法抽象方法的聲明中需加關(guān)鍵字abstract抽象類由關(guān)鍵字abstract聲明的類稱為抽象類包含抽象方法的類必須是抽象類抽象類可以不包含抽象方法,但一般會包括抽象類可以有構(gòu)造方法、普通成員變量和方法抽象類的構(gòu)造方法通常聲明為protected(只給子類用)不能創(chuàng)建抽象類的實例,若抽象類的子類實現(xiàn)了所有抽象方法,則可以創(chuàng)建子類的實例對象,否則該子類也是抽象類抽象類抽象類的作用:為一類對象建立抽象的模型abstractclassEmployee{ abstractvoidraiseSalary(inti);}classManagerextendsEmployee{ voidraiseSalary(inti){…}}…Employeee=newManager();//創(chuàng)建Employee子類Manager的對象Employeee=newEmployee();

//錯誤!Employee為抽象類接口接口(Interface):確定了對特定對象所能發(fā)出的請求,或者對象接收消息的方式接口中只聲明方法(“做什么”,抽象方法)但不定義方法體(“怎么做”)將“做什么”與“怎么做”分離只規(guī)定了類的基本形式,不涉及任何實現(xiàn)細(xì)節(jié),實現(xiàn)一個接口的類具有接口規(guī)定的行為接口可看作使用類的“客戶”代碼與提供服務(wù)的類之間的契約或協(xié)議抽象類是介于普通類與接口之間的中間狀態(tài)接口的定義接口定義=接口聲明+接口體接口聲明[public]interface接口名[extends父接口列表]{接口體}public/default:任意類均可使用/與該接口在同一個包中的類可使用一個接口可以有多個父接口,子接口繼承父接口的所有常量和方法接口體接口體=常量定義+方法定義常量默認(rèn)具有public,final,static屬性類型

常量名=常量值;方法默認(rèn)具有public,abstract屬性返回類型

方法名([參數(shù)列表]);接口體接口體=常量定義+方法定義例:接口體常量不能為空白final的父接口中的常量可被子接口中的同名常量隱藏,父接口中的方法可被子接口中的方法重寫接口中成員不能使用的修飾符:transient,volatile,synchronized,private,protected接口的使用——用類實現(xiàn)接口類聲明中的implements關(guān)鍵字類可以使用接口定義的常量類必須實現(xiàn)接口定義的所有方法一個類可以實現(xiàn)多個接口,例: interfaceI1{…} interfaceI2{…} classSup{…} classCextendsSupimplementsI1,I2{…}接口的使用——作為數(shù)據(jù)類型,支持多態(tài)實現(xiàn)該接口的類可看作該接口的“子類”,接口類型的變量可指向該“子類”的實例InterfaceHuman{voidshowNameInNativeLanguage();}classChineseimplementsHuman{…}classJapaneseimplementsHuman{…}...Humane=newChinese();Humane=newJapanese();e.showNameInNativeLanguage();…例:NewShapes.java接口與多重繼承Java的類繼承只支持單繼承(子類從單個父類繼承),不支持多重繼承(子類從多個父類繼承)extends后的類名只能有一個類的繼承關(guān)系形成樹型層次結(jié)構(gòu)接口的繼承支持多重繼承接口與多重繼承類可以通過實現(xiàn)多個接口達(dá)到多重繼承的效果在進(jìn)行單個父類與多個接口合并時,只有單個父類具有實現(xiàn)細(xì)節(jié),從而避免代碼沖突publicclassSportsmanextendsPersonimplementsRunner,Swimmer,Jumper{publicvoidrun(){print("Sportsmanrunning");}publicvoidswim(){print("Sportsmanswimming");}publicvoidjump(){print("Sportsmanjumping");}publicstaticvoidtoRun(Runnerr){r.run();}publicstaticvoidtoSwim(Swimmers){s.swim();}publicstaticvoidtoJump(Jumperj){j.jump();}publicstaticvoidtoEatAndDrink(Personp){p.eat();p.drink();}publicstaticvoidmain(String[]args){Sportsmans=newSportsman();toRun(s);toSwim(s);toJump(s);toEatAndDrink(s);}}classPerson{publicvoideat(){print("Personeating");}voiddrink(){print("Persondrinking");}}interfaceRunner{voidrun();voideat();}interfaceSwimmer{voidswim();}interfaceJumper{voidjump();}Interface示例48interfaceFlyerVehicleinterfaceSailerdock()cruise()Airplanetakeoff()land()fly()RiverBargedock()cruise()takeoff()land()fly()SeaPlanedock()cruise()HelicopterInterface示例49interfaceFlyerVehicleinterfaceSailerdock()cruise()Airplanetakeoff()land()fly()RiverBargedock()cruise()takeoff()land()fly()SeaPlanedock()cruise()HelicopterInterface示例50interfaceFlyerVehicleinterfaceSailerdock()cruise()Airplanetakeoff()land()fly()RiverBargedock()cruise()takeoff()land()fly()SeaPlanedock()cruise()HelicopterInterface示例51interfaceFlyerVehicleinterfaceSailerdock()cruise()Airplanetakeoff()land()fly()RiverBargedock()cruise()takeoff()land()fly()SeaPlanedock()cruise()Helicopter接口與抽象類的區(qū)別接口中的所有方法都是抽象的,而抽象類可以定義非抽象方法一個類可以實現(xiàn)多個接口,但只能繼承一個抽象父類接口與實現(xiàn)它的類不構(gòu)成類的繼承體系,即接口不是類體系的一部分,不相關(guān)的類也可以實現(xiàn)相同的接口;抽象類屬于類的繼承體系,且一般位于類體系的較高層通過繼承擴(kuò)展接口直接向接口中擴(kuò)展方法可能帶來問題:所有實現(xiàn)原來接口的類將因為接口的改變而不能正常工作不能向interface定義中隨意增加方法,需要通過繼承擴(kuò)展接口publicinterfaceStockWatcher{ finalStringsunTicker="SUNW"; finalStringoracleTicker="ORCL"; voidvalueChanged(StringtickerSymbol,doublenewValue);

voidcurrentValue(StringtickerSymbol,doublenewValue);

}publicinterfaceStockTrackerextendsStockWatcher{voidcurrentValue(StringtickerSymbol,doublenewValue);}習(xí)題5.5.下列接口的定義中,哪些是正確的?(1) interfacePrintable{ voidprint(){}; }(2) abstractinterfacePrintable{ voidprint(); }(3) abstractinterfacePrintableextendsInterface1,Interface2{ voidprint(){}; }(4) interfacePrintable{ voidprint(); }靜態(tài)變量、方法與初始化程序塊final關(guān)鍵字抽象類與接口集合類枚舉類型Wrapper類泛型的基本概念泛型:又稱為參數(shù)化類型,通過定義含有一個或多個類型參數(shù)的類或接口,對具有類似特征與行為的類進(jìn)行抽象類型參數(shù):可以指代任何具體類型例:JDK中java.util.ArrayList<E>的定義,ArrayList<E>定義了一個泛型,E為類型參數(shù),它代表了能夠放入ArrayList中的對象的類型如何使用一個預(yù)定義的泛型?對泛型中的類型參數(shù)進(jìn)行具體化,即可得到具體的類例:如果希望創(chuàng)建一個能夠存放String對象的ArrayList,應(yīng)使用ArrayList<String>進(jìn)行聲明。ArrayList<String>總是可以被看作一個具體的類,該類的實例作為容器可以存放String類型的對象。集合類一個集合類的實例(集合對象)表示了一組對象,相當(dāng)于一個容器,集合對象存放指向其他對象的引用集合接口樹的簡要結(jié)構(gòu):Collection<E>Queue<E>List<E>Set<E>SortedSet<E>Map<E>SortedMap<E>集合類Collection:集合接口樹的根,定義通用的集合操作APISet:集合。無序,不能包含重復(fù)元素List:列表。有序,可包含重復(fù)元素,可通過索引序號訪問元素Queue:隊列。必須按照排隊規(guī)則來確定元素順序Map:實現(xiàn)鍵到值的映射,允許通過鍵查找值不能包含重復(fù)的鍵每個鍵至多只映射到一個值SortedSet,SortedMap:具有排序功能的Set和Map完整的容器分類集合類Abstract*方便創(chuàng)建自己的容器類多數(shù)情況下,已有容器類庫足夠用,可忽略Abstract*legacy:Java1.0/1.1容器:不應(yīng)使用,但須了解(讀JDK文檔)Java1.0/1.1的容器(legacy)JavaSE5VectorArrayListEnumerationIteratorHashtableHashMapStackLinkedListBitSetEnumSet簡化的容器分類去除Abstract*,legacy類,中間接口等,得到簡化的容器分類Set接口三種接口實現(xiàn):HashSet,TreeSet,LinkedHashSetSet接口三種接口實現(xiàn):HashSet,TreeSet,LinkedHashSetHashSet:采用Hash表實現(xiàn)了Set接口,元素?zé)o固定順序,對元素的訪問效率高TreeSet:實現(xiàn)了SortedSet接口,采用有序樹結(jié)構(gòu)存儲集合元素,元素按照比較結(jié)果的升序排列LinkedHashSet:實現(xiàn)了Set接口,采用Hash表和鏈表結(jié)合的結(jié)構(gòu)存儲集合元素,元素按照被添加的先后順序保存Set與Collection的主要接口方法booleanadd(Ee)如果給定元素不存在于當(dāng)前Set中,則將其加入當(dāng)前SetbooleanaddAll(Collection<?extendsE>c)對于一個容器中的所有元素,如果它不存在于當(dāng)前Set中,則將其加入當(dāng)前Set。只要添加了任意元素就返回true,否則返回falsevoidclear()移除當(dāng)前Set中的所有元素booleancontains(Objecto)如果指定元素在當(dāng)前Set中,則返回true;否則返回falsebooleancontainsAll(Collection<?>c)對于一個容器c,如果當(dāng)前Set包含該容器中的所有元素,則返回true;否則返回falsebooleanisEmpty()如果當(dāng)前Set不包含任何元素,則返回true;否則返回falsebooleanremove(Objecto)如果指定元素在當(dāng)前Set中,則移除該元素booleanremoveAll(Collection<?>c)從當(dāng)前Set中將指定容器中包含的所有元素都移除。只要有移除動作發(fā)生就返回true;否則返回falsebooleanretainAll(Collection<?>c)只保留當(dāng)前Set中同時也包含于指定容器中的元素。集合發(fā)生了改變就返回true;否則返回falseintsize()返回當(dāng)前Set中元素的數(shù)量Object[]toArray()返回一個數(shù)組,該數(shù)組由當(dāng)前Set中所有元素組成<T>T[]toArray(T[]a)返回一個數(shù)組,該數(shù)組由當(dāng)前Set中所有元素組成,返回數(shù)組的運(yùn)行時類型由參數(shù)指定publicclassFindDups{ publicstaticvoidmain(Stringargs[]){ //創(chuàng)建一個HashSet對象,缺省的初始容量是16 Set<String>s=newHashSet<String>(); //將命令行中的每個字符串加入到集合s中, //其中重復(fù)的字符串將不能加入,并被打印輸出

for(inti=0;i<args.length;i++){ if(!s.add(args[i])) System.out.println("Duplicatedetected:"+args[i]); } //輸出集合s的元素個數(shù)以及集合中的所有元素: System.out.println(s.size()+"distinctwordsdetected:"+s);

}}Set接口注意如果要將T類型的實例放入HashSet或TreeSet中,需要為T定義equals()方法如果要將T的實例放入HashSet或LinkedHashSet中,需要為T定義hashCode()方法List接口兩種接口實現(xiàn):ArrayList,LinkedListList接口兩種接口實現(xiàn):ArrayList,LinkedListArrayList:采用可變大小的數(shù)組實現(xiàn)List接口無需聲明上限,隨著元素的增加,長度自動增加對元素的隨機(jī)訪問速度快,插入/移除元素較慢該類是非同步的,相對于Vector(legacy)效率高LinkedList:采用鏈表結(jié)構(gòu)實現(xiàn)List接口實際上實現(xiàn)了List接口、Queue接口和雙端隊列Deque接口,因此可用來實現(xiàn)堆棧、隊列或雙端隊列插入/移除元素快,對元素的隨機(jī)訪問較慢該類是非同步的List接口方法voidadd(intindex,Eelement)向當(dāng)前List的指定位置插入特定元素booleanaddAll(intindex,Collection<?extendsE>c)向當(dāng)前List的指定位置插入一個容器中的所有元素Eget(intindex)返回當(dāng)前List中指定位置的元素intindexOf(Objecto)返回指定元素在當(dāng)前List中第一次出現(xiàn)時的索引值,如果指定元素在當(dāng)前List中不存在,則返回-1intlastIndexOf(Objecto)返回指定元素在當(dāng)前List中最后一次出現(xiàn)時的索引值,如果指定元素在當(dāng)前List中不存在,則返回-1Eremove(intindex)移除當(dāng)前List中指定位置的元素,后續(xù)對象依次前提Eset(intindex,Eelement)用指定的元素替換當(dāng)前List中指定位置的元素List<E>subList(intfromIndex,inttoIndex)返回一個作為當(dāng)前List一部分的子List的視圖,子List的索引范圍是[fromIndex,toIndex)。子視圖不是一個新的List,對子List的更改和刪除將能反映到原ListArrayList的用法構(gòu)造方法publicArrayList():創(chuàng)建一個空ArrayList,初始長度為10publicArrayList(intinitialCapacity):創(chuàng)建一個空ArrayList,初始長度為initialCapacitypublicArrayList(Collection<E>

c):由指定集合的元素創(chuàng)建ArrayList,順序由集合的迭代器決定publicclassUseArrayList{ publicstaticvoidmain(String[]args){ List<String>scores=newArrayList<String>(); scores.add("86"); //添加元素

scores.add("98"); //添加元素

scores.add(1,"99"); //插入元素

for(inti=0;i<scores.size();i++){ System.out.print(scores.get(i)+"");//輸出結(jié)果

} scores.set(1,"77"); //修改第二個元素

scores.remove(0); //刪除第一個元素

System.out.println("\n修改并刪除之后"); for(inti=0;i<scores.size();i++){ System.out.print(scores.get(i)+""); } System.out.println(“\n按字符串輸出\n"+scores.toString()); }} //又例:Deal.javaQueue接口兩種接口實現(xiàn):LinkedList,PriorityQueueQueue接口方法booleanoffer(Ee)向隊列末尾加入指定元素,如果成功則返回true,否則返回falsebooleanadd(Ee)向隊列末尾加入指定元素,如果加入失敗則拋出異常Epeek()獲取但不刪除隊首元素(LinkedList的第一個元素),如果隊列為空,則返回nullEelement()獲取但不刪除隊首元素(LinkedList的第一個元素),如果隊列為空,則拋出異常Epoll()獲取并刪除隊首元素(LinkedList的第一個元素),如果隊列為空,則返回nullEremove()獲取并刪除隊首元素(LinkedList的第一個元素),如果隊列為空,則拋出異常Queue接口方法Queue提供兩種形式的插入、刪除和元素檢查:操作功能說明異常情況拋出異常的方法返回特定值的方法插入向隊尾加入一個元素有界隊列滿add(e)offer(e),返回false刪除從隊首移去一個元素隊列空remove()poll(),返回null元素檢查返回隊首元素但不刪除隊列空element()peek(),返回nullpublicclassQueueDemo{ publicstaticvoidprintQ(Queuequeue){ while(queue.peek()!=null) System.out.print(queue.remove()+""); System.out.println(); } publicstaticvoidmain(String[]args){ Queue<Integer>queue=newLinkedList<Integer>(); Randomrand=newRandom(47); for(inti=0;i<10;i++) queue.offer(rand.nextInt(i+10)); printQ(queue); Queue<Character>qc=newLinkedList<Character>(); for(charc:"Brontosaurus".toCharArray()) qc.offer(c); printQ(qc); }} //又例:Counter.java優(yōu)先隊列(PriorityQueue)隊列規(guī)則:給定一組隊列中的元素的情況下,確定下一個彈出隊列的元素的規(guī)則一般隊列:FIFO優(yōu)先隊列:選擇優(yōu)先級最高的元素當(dāng)調(diào)用offer()插入對象時,對象在隊列中排序Integer、String、Character等類型的默認(rèn)排序采用“自然順序”可通過提供自己的Comparator修改排序順序例:PriorityQueueDemo.javaMap接口接口實現(xiàn):HashMap,TreeMap,LinkedHashMapMap接口接口實現(xiàn):HashMap,TreeMap,LinkedHashMap把鍵映射到某個值一個鍵最多只能映射一個值一個值可對應(yīng)多個鍵最常用:HashMap(無序)和TreeMap(有序)HashMap:使用Hash表實現(xiàn)Map接口無序,非同步且允許空的鍵與值相比Hashtable(legacy)效率高TreeMap:與TreeSet類似,實現(xiàn)了SortedMap接口Map接口方法Vput(Kkey,Vvalue)將指定的值value關(guān)聯(lián)到當(dāng)前Map中的指定的鍵keyvoidputAll(Map<?extendsK,?extendsV>m)將參數(shù)Map中的所有鍵值對都添加到當(dāng)前Map中Vget(Objectkey)返回當(dāng)前Map中指定的鍵所映射到的值,如果沒有與該鍵相對應(yīng)的映射,就返回nullVremove(Objectkey)移除當(dāng)前Map中指定的鍵所對應(yīng)的鍵值對voidclear()從當(dāng)前Map中移除所有鍵值對booleancontainsKey(Objectkey)如果當(dāng)前Map中存在從指定的鍵所發(fā)出的映射,則返回true;否則返回falsebooleancontainsValue(Objectvalue)如果當(dāng)前Map中存在一個或多個鍵,能夠映射到指定的值,那么返回true;否則返回falsebooleanisEmpty()如果當(dāng)前Map中不含任何鍵值對,則返回true;否則返回falseSet<Map.Entry<K,V>>entrySet()返回一個由當(dāng)前Map中所有鍵值對所組成的SetSet<K>keySet()返回一個Set,其中包含了當(dāng)前Map中的所有鍵Collection<V>values()返回一個Collection,其中包含了當(dāng)前Map中的所有值intsize()返回當(dāng)前Map中的鍵值對的數(shù)量publicclassFreq{ publicstaticvoidmain(Stringargs[]){ String[]words={"if","it","is","to","be","it", "is","up","to","me","to","delegate"}; Integerfreq; Map<String,Integer>m=newTreeMap<String,Integer>();

for(Stringa:words){//以(單詞,詞頻)為鍵值對,構(gòu)造頻率表 freq

=m.get(a);//獲取指定單詞的詞頻。 if(freq==null){//詞頻遞增 freq=newInteger(1); }else{ freq=newInteger(freq+1);//.intValue() } m.put(a,freq);//在Map中更改詞頻 } System.out.println(m.size()+"distinctwordsdetected:"); System.out.println(m); }}HashMap的用法構(gòu)造方法publicHashMap():構(gòu)造空HashMap,默認(rèn)初始容量為16,默認(rèn)load因子為0.75publicHashMap(int

initialCapacity):構(gòu)造空HashMap,指定初始容量為initialCapacity,默認(rèn)load因子為0.75publicHashMap(int

initialCapacity,float

loadFactor):構(gòu)造空HashMap,指定初始容量為initialCapacity,指定load因子為loadFactorpublicclassUseHashMap{publicstaticvoidmain(Stringargs[]){ HashMap<String,String>hScore=newHashMap<String,String>(); hScore.put("張一","86"); hScore.put("李二","98"); hScore.put("海飛","99"); System.out.println(“按字符串輸出:"+hScore.toString()); hScore.put("李二","77"); hScore.remove("張一"); System.out.println("修改并刪除之后"); System.out.println(“按字符串輸出:"+hScore.toString());}} //又例:Statistics.java迭代器(Iterator)Iterator是一個輕量級對象,用于遍歷并選擇序列中的對象用法:使用容器的iterator()方法返回容器的迭代器,該迭代器準(zhǔn)備返回容器的第一個元素Java的迭代器只能單向移動next():獲得序列的下一個元素hasNext():檢查序列中是否還有元素remove():將迭代器新近返回的元素(即由next()產(chǎn)生的最后一個元素)刪除,因此在調(diào)用remove()之前必須先調(diào)用next()publicclassTestIterator{publicstaticvoidmain(String[]args){ Stringsentence="IbelieveIcanfly,IbelieveIcantouchthesky."; String[]strs=sentence.split(""); List<String>list=newArrayList<String>(Arrays.asList(strs)); Iterator<String>it=list.iterator(); while(it.hasNext()) System.out.print(it.next()+"_"); System.out.println();

it=list.iterator(); while(it.hasNext()){ if(it.next().equals("I")) it.remove(); } it=list.iterator(); while(it.hasNext()) System.out.print(it.next()+""); System.out.println();}}ListIteratorIterator的子類,只能用于各種List類的訪問可以雙向移動用法List容器的listIterator()方法產(chǎn)生一個指向List開始處的ListIterator對象例:ListIteratorDemo.java定義一個類Student,屬性為學(xué)號、姓名和成績;方法為增加記錄SetRecord和得到記錄GetRecord。SetRecord給出學(xué)號、姓名和成績的賦值,GetRecord通過學(xué)號得到考生的成績假設(shè)一個學(xué)生所選課程為語文、數(shù)學(xué)、英語、政治、物理、化學(xué),給出此學(xué)生所選課程的ArrayList列表,并訪問物理存放在ArrayList中的位置對于右圖中的Shebei表,將設(shè)備編碼和設(shè)備名稱作為HashMap中的鍵和值進(jìn)行存儲,然后訪問此HashMap,找到鍵0008和0016并輸出設(shè)備編碼為0008、0016的設(shè)備名稱靜態(tài)變量、方法與初始化程序塊final關(guān)鍵字抽象類與接口集合類枚舉類型Wrapper類枚舉類型通過關(guān)鍵字enum將一組具名值的有限集合創(chuàng)建為一種類型這些具名值又稱為枚舉常量一個枚舉類型實際定義了一個類,該類可以包含方法和其他屬性,以支持對枚舉值的操作,還可以實現(xiàn)任意的接口枚舉類型變量屬于引用變量,變量取值范圍為所有可能的枚舉常量例,對于枚舉類型publicenumGrade{ FRESHMAN,SOPHOMORE,JUNIOR,SENIOR}枚舉變量的定義 Gradegrade=Grade.JUNIOR;枚舉類型枚舉類型的定義:[public]enum枚舉類型名[implements接口名表]

{

枚舉常量定義 [枚舉體定義]}枚舉類型枚舉類型的定義:[public]enum枚舉類型名[implements接口名表]

{

枚舉常量定義 [枚舉體定義]}枚舉聲明:public/default:可被包外類訪問/只能在同一包中訪問所有枚舉類型都隱含繼承java.lang.Enum類,故不能再繼承其他任何類枚舉類型枚舉類型的定義:[public]enum枚舉類型名[implements接口名表]{

枚舉常量定義 [枚舉體定義]}枚舉常量定義:常量1[,常量2[,…常量n]][;]如果沒有枚舉體部分,則“;”可省略枚舉常量實際上是枚舉類型的static和final的實例,加載枚舉類型時,調(diào)用枚舉類型的構(gòu)造方法創(chuàng)建這些實例如果在枚舉體中定義了構(gòu)造方法,則在定義枚舉常量時可采用“常量(參數(shù)1,參數(shù)2,…)”的形式枚舉類型枚舉類型的定義:

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論