版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java高級特征西安電子科技大學(xué)孫聰suncong@課程內(nèi)容高級語言程序設(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概念Java語言基礎(chǔ)Java面向?qū)ο筇匦訨ava高級特征常用預(yù)定義類的使用異常處理輸入輸出Java正則表達(dá)式線程GUI程序設(shè)計(jì)Java網(wǎng)絡(luò)程序設(shè)計(jì)靜態(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)變量(類變量)該類的所有的對象實(shí)例之間共享方法區(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)建與實(shí)例對象無關(guān)只在系統(tǒng)加載其所在類時(shí)分配空間并初始化,且在創(chuàng)建該類的實(shí)例對象時(shí)不再分配空間什么時(shí)候加載其所在類?運(yùn)行到不得不加載該類的時(shí)候什么是“不得不加載該類的時(shí)候”?即將創(chuàng)建該類的第一個(gè)對象時(shí)首次使用該類的靜態(tài)方法或靜態(tài)變量時(shí)加載一個(gè)類的子類之前要先加載其父類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)方法、程序入口點(diǎn),JVM不創(chuàng)建實(shí)例對象就可以運(yùn)行該方法任何類的構(gòu)造方法實(shí)際上都是靜態(tài)方法,當(dāng)首次創(chuàng)建一個(gè)類的對象實(shí)例時(shí),如果類還沒有被裝載,就會首先裝載該類,然后再進(jìn)行對象的實(shí)例化靜態(tài)方法一般通過類名訪問,但特殊情況下也可通過實(shí)例對象訪問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)用實(shí)例方法,也不能直接訪問所屬類的實(shí)例成員變量publicclassTestStaticMethod{ publicstaticvoidmain(String[]args){ StaticMethodobj=newStaticMethod(); StaticMethod.sPrintXAndY(obj); }}classStaticMethod{ intx=0; staticinty=1; publicvoidiPrintAndIncreaseY(){ sPrintY(); y++; } publicstaticvoidsPrintY(){ //System.out.println(this.x); //不能訪問實(shí)例成員變量
//iPrintAndIncreaseY(); //不能訪問實(shí)例方法
System.out.println(StaticMethod.y); //可以訪問靜態(tài)變量
} publicstaticvoidsPrintXAndY(StaticMethodo){ System.out.println(o.x); //可以通過o引用訪問實(shí)例成員變量
o.iPrintAndIncreaseY(); //可以通過o引用調(diào)用實(shí)例方法
sPrintY(); //可以直接調(diào)用靜態(tài)方法
}}靜態(tài)方法的重寫回顧方法重寫的規(guī)則:不改變方法的名稱、參數(shù)列表和返回值,改變方法的內(nèi)部實(shí)現(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){}//錯(cuò)誤!將ClassA中的mtdOne()變成靜態(tài)的publicvoidmtdTwo(inti){}publicvoidmtdThree(inti){}//錯(cuò)誤!將ClassA中的mtdThree()變?yōu)榉庆o態(tài)publicstaticvoidmtdFour(inti){}//正確!兩個(gè)靜態(tài)方法mtdFour()獨(dú)立}靜態(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{…}在加載該類時(shí)執(zhí)行且只執(zhí)行一次如果類中定義了多個(gè)靜態(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)行時(shí)的效率優(yōu)化對于final方法,編譯器直接產(chǎn)生調(diào)用方法的代碼,而阻止運(yùn)行時(shí)刻對方法調(diào)用的動態(tài)綁定private的方法都隱含指定為是final的,對子類不可見就無所謂被重寫在方法參數(shù)中使用final關(guān)鍵字將方法參數(shù)指明為final,則無法在方法中更改參數(shù)的值classGizmo{ publicvoidspin(){}}publicclassFinalArg{ voidwith(finalGizmog){ //g=newGizmo(); //錯(cuò)誤,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í)賦初值對于引用類型的成員變量:引用不變,但被引用對象可被修改這一約定同樣適用于數(shù)組classValue{inti; publicValue(inti){this.i=i;}}publicclassFinalData{ privatestaticRandomrand=newRandom(47);
privatefinalintvalueOne=9; //基本類型編譯時(shí)常量
privatefinalinti4=rand.nextInt(20);//運(yùn)行時(shí)不可變,但非編譯時(shí)常量
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成員變量聲明時(shí)未賦初值,則在所屬類的每個(gè)構(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允許在類中只聲明方法而不提供方法的實(shí)現(xiàn),這種只有聲明而沒有方法體的方法稱為抽象方法抽象方法的聲明中需加關(guān)鍵字abstract抽象類由關(guān)鍵字abstract聲明的類稱為抽象類包含抽象方法的類必須是抽象類抽象類可以不包含抽象方法,但一般會包括抽象類可以有構(gòu)造方法、普通成員變量和方法抽象類的構(gòu)造方法通常聲明為protected(只給子類用)不能創(chuàng)建抽象類的實(shí)例,若抽象類的子類實(shí)現(xiàn)了所有抽象方法,則可以創(chuàng)建子類的實(shí)例對象,否則該子類也是抽象類抽象類抽象類的作用:為一類對象建立抽象的模型abstractclassEmployee{ abstractvoidraiseSalary(inti);}classManagerextendsEmployee{ voidraiseSalary(inti){…}}…Employeee=newManager();//創(chuàng)建Employee子類Manager的對象Employeee=newEmployee();
//錯(cuò)誤!Employee為抽象類接口接口(Interface):確定了對特定對象所能發(fā)出的請求,或者對象接收消息的方式接口中只聲明方法(“做什么”,抽象方法)但不定義方法體(“怎么做”)將“做什么”與“怎么做”分離只規(guī)定了類的基本形式,不涉及任何實(shí)現(xiàn)細(xì)節(jié),實(shí)現(xiàn)一個(gè)接口的類具有接口規(guī)定的行為接口可看作使用類的“客戶”代碼與提供服務(wù)的類之間的契約或協(xié)議抽象類是介于普通類與接口之間的中間狀態(tài)接口的定義接口定義=接口聲明+接口體接口聲明[public]interface接口名[extends父接口列表]{接口體}public/default:任意類均可使用/與該接口在同一個(gè)包中的類可使用一個(gè)接口可以有多個(gè)父接口,子接口繼承父接口的所有常量和方法接口體接口體=常量定義+方法定義常量默認(rèn)具有public,final,static屬性類型
常量名=常量值;方法默認(rèn)具有public,abstract屬性返回類型
方法名([參數(shù)列表]);接口體接口體=常量定義+方法定義例:接口體常量不能為空白final的父接口中的常量可被子接口中的同名常量隱藏,父接口中的方法可被子接口中的方法重寫接口中成員不能使用的修飾符:transient,volatile,synchronized,private,protected接口的使用——用類實(shí)現(xiàn)接口類聲明中的implements關(guān)鍵字類可以使用接口定義的常量類必須實(shí)現(xiàn)接口定義的所有方法一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,例: interfaceI1{…} interfaceI2{…} classSup{…} classCextendsSupimplementsI1,I2{…}接口的使用——作為數(shù)據(jù)類型,支持多態(tài)實(shí)現(xiàn)該接口的類可看作該接口的“子類”,接口類型的變量可指向該“子類”的實(shí)例InterfaceHuman{voidshowNameInNativeLanguage();}classChineseimplementsHuman{…}classJapaneseimplementsHuman{…}...Humane=newChinese();Humane=newJapanese();e.showNameInNativeLanguage();…例:NewShapes.java接口與多重繼承Java的類繼承只支持單繼承(子類從單個(gè)父類繼承),不支持多重繼承(子類從多個(gè)父類繼承)extends后的類名只能有一個(gè)類的繼承關(guān)系形成樹型層次結(jié)構(gòu)接口的繼承支持多重繼承接口與多重繼承類可以通過實(shí)現(xiàn)多個(gè)接口達(dá)到多重繼承的效果在進(jìn)行單個(gè)父類與多個(gè)接口合并時(shí),只有單個(gè)父類具有實(shí)現(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ū)別接口中的所有方法都是抽象的,而抽象類可以定義非抽象方法一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象父類接口與實(shí)現(xiàn)它的類不構(gòu)成類的繼承體系,即接口不是類體系的一部分,不相關(guān)的類也可以實(shí)現(xiàn)相同的接口;抽象類屬于類的繼承體系,且一般位于類體系的較高層通過繼承擴(kuò)展接口直接向接口中擴(kuò)展方法可能帶來問題:所有實(shí)現(xiàn)原來接口的類將因?yàn)榻涌诘母淖兌荒苷9ぷ鞑荒芟騣nterface定義中隨意增加方法,需要通過繼承擴(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ù)化類型,通過定義含有一個(gè)或多個(gè)類型參數(shù)的類或接口,對具有類似特征與行為的類進(jìn)行抽象類型參數(shù):可以指代任何具體類型例:JDK中java.util.ArrayList<E>的定義,ArrayList<E>定義了一個(gè)泛型,E為類型參數(shù),它代表了能夠放入ArrayList中的對象的類型如何使用一個(gè)預(yù)定義的泛型?對泛型中的類型參數(shù)進(jìn)行具體化,即可得到具體的類例:如果希望創(chuàng)建一個(gè)能夠存放String對象的ArrayList,應(yīng)使用ArrayList<String>進(jìn)行聲明。ArrayList<String>總是可以被看作一個(gè)具體的類,該類的實(shí)例作為容器可以存放String類型的對象。集合類一個(gè)集合類的實(shí)例(集合對象)表示了一組對象,相當(dāng)于一個(gè)容器,集合對象存放指向其他對象的引用集合接口樹的簡要結(jié)構(gòu):Collection<E>Queue<E>List<E>Set<E>SortedSet<E>Map<E>SortedMap<E>集合類Collection:集合接口樹的根,定義通用的集合操作APISet:集合。無序,不能包含重復(fù)元素List:列表。有序,可包含重復(fù)元素,可通過索引序號訪問元素Queue:隊(duì)列。必須按照排隊(duì)規(guī)則來確定元素順序Map:實(shí)現(xiàn)鍵到值的映射,允許通過鍵查找值不能包含重復(fù)的鍵每個(gè)鍵至多只映射到一個(gè)值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接口三種接口實(shí)現(xiàn):HashSet,TreeSet,LinkedHashSetSet接口三種接口實(shí)現(xiàn):HashSet,TreeSet,LinkedHashSetHashSet:采用Hash表實(shí)現(xiàn)了Set接口,元素?zé)o固定順序,對元素的訪問效率高TreeSet:實(shí)現(xiàn)了SortedSet接口,采用有序樹結(jié)構(gòu)存儲集合元素,元素按照比較結(jié)果的升序排列LinkedHashSet:實(shí)現(xiàn)了Set接口,采用Hash表和鏈表結(jié)合的結(jié)構(gòu)存儲集合元素,元素按照被添加的先后順序保存Set與Collection的主要接口方法booleanadd(Ee)如果給定元素不存在于當(dāng)前Set中,則將其加入當(dāng)前SetbooleanaddAll(Collection<?extendsE>c)對于一個(gè)容器中的所有元素,如果它不存在于當(dāng)前Set中,則將其加入當(dāng)前Set。只要添加了任意元素就返回true,否則返回falsevoidclear()移除當(dāng)前Set中的所有元素booleancontains(Objecto)如果指定元素在當(dāng)前Set中,則返回true;否則返回falsebooleancontainsAll(Collection<?>c)對于一個(gè)容器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中同時(shí)也包含于指定容器中的元素。集合發(fā)生了改變就返回true;否則返回falseintsize()返回當(dāng)前Set中元素的數(shù)量Object[]toArray()返回一個(gè)數(shù)組,該數(shù)組由當(dāng)前Set中所有元素組成<T>T[]toArray(T[]a)返回一個(gè)數(shù)組,該數(shù)組由當(dāng)前Set中所有元素組成,返回?cái)?shù)組的運(yùn)行時(shí)類型由參數(shù)指定publicclassFindDups{ publicstaticvoidmain(Stringargs[]){ //創(chuàng)建一個(gè)HashSet對象,缺省的初始容量是16 Set<String>s=newHashSet<String>(); //將命令行中的每個(gè)字符串加入到集合s中, //其中重復(fù)的字符串將不能加入,并被打印輸出
for(inti=0;i<args.length;i++){ if(!s.add(args[i])) System.out.println("Duplicatedetected:"+args[i]); } //輸出集合s的元素個(gè)數(shù)以及集合中的所有元素: System.out.println(s.size()+"distinctwordsdetected:"+s);
}}Set接口注意如果要將T類型的實(shí)例放入HashSet或TreeSet中,需要為T定義equals()方法如果要將T的實(shí)例放入HashSet或LinkedHashSet中,需要為T定義hashCode()方法List接口兩種接口實(shí)現(xiàn):ArrayList,LinkedListList接口兩種接口實(shí)現(xiàn):ArrayList,LinkedListArrayList:采用可變大小的數(shù)組實(shí)現(xiàn)List接口無需聲明上限,隨著元素的增加,長度自動增加對元素的隨機(jī)訪問速度快,插入/移除元素較慢該類是非同步的,相對于Vector(legacy)效率高LinkedList:采用鏈表結(jié)構(gòu)實(shí)現(xiàn)List接口實(shí)際上實(shí)現(xiàn)了List接口、Queue接口和雙端隊(duì)列Deque接口,因此可用來實(shí)現(xiàn)堆棧、隊(duì)列或雙端隊(duì)列插入/移除元素快,對元素的隨機(jī)訪問較慢該類是非同步的List接口方法voidadd(intindex,Eelement)向當(dāng)前List的指定位置插入特定元素booleanaddAll(intindex,Collection<?extendsE>c)向當(dāng)前List的指定位置插入一個(gè)容器中的所有元素Eget(intindex)返回當(dāng)前List中指定位置的元素intindexOf(Objecto)返回指定元素在當(dāng)前List中第一次出現(xiàn)時(shí)的索引值,如果指定元素在當(dāng)前List中不存在,則返回-1intlastIndexOf(Objecto)返回指定元素在當(dāng)前List中最后一次出現(xiàn)時(shí)的索引值,如果指定元素在當(dāng)前List中不存在,則返回-1Eremove(intindex)移除當(dāng)前List中指定位置的元素,后續(xù)對象依次前提Eset(intindex,Eelement)用指定的元素替換當(dāng)前List中指定位置的元素List<E>subList(intfromIndex,inttoIndex)返回一個(gè)作為當(dāng)前List一部分的子List的視圖,子List的索引范圍是[fromIndex,toIndex)。子視圖不是一個(gè)新的List,對子List的更改和刪除將能反映到原ListArrayList的用法構(gòu)造方法publicArrayList():創(chuàng)建一個(gè)空ArrayList,初始長度為10publicArrayList(intinitialCapacity):創(chuàng)建一個(gè)空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"); //修改第二個(gè)元素
scores.remove(0); //刪除第一個(gè)元素
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接口兩種接口實(shí)現(xiàn):LinkedList,PriorityQueueQueue接口方法booleanoffer(Ee)向隊(duì)列末尾加入指定元素,如果成功則返回true,否則返回falsebooleanadd(Ee)向隊(duì)列末尾加入指定元素,如果加入失敗則拋出異常Epeek()獲取但不刪除隊(duì)首元素(LinkedList的第一個(gè)元素),如果隊(duì)列為空,則返回nullEelement()獲取但不刪除隊(duì)首元素(LinkedList的第一個(gè)元素),如果隊(duì)列為空,則拋出異常Epoll()獲取并刪除隊(duì)首元素(LinkedList的第一個(gè)元素),如果隊(duì)列為空,則返回nullEremove()獲取并刪除隊(duì)首元素(LinkedList的第一個(gè)元素),如果隊(duì)列為空,則拋出異常Queue接口方法Queue提供兩種形式的插入、刪除和元素檢查:操作功能說明異常情況拋出異常的方法返回特定值的方法插入向隊(duì)尾加入一個(gè)元素有界隊(duì)列滿add(e)offer(e),返回false刪除從隊(duì)首移去一個(gè)元素隊(duì)列空remove()poll(),返回null元素檢查返回隊(duì)首元素但不刪除隊(duì)列空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)先隊(duì)列(PriorityQueue)隊(duì)列規(guī)則:給定一組隊(duì)列中的元素的情況下,確定下一個(gè)彈出隊(duì)列的元素的規(guī)則一般隊(duì)列:FIFO優(yōu)先隊(duì)列:選擇優(yōu)先級最高的元素當(dāng)調(diào)用offer()插入對象時(shí),對象在隊(duì)列中排序Integer、String、Character等類型的默認(rèn)排序采用“自然順序”可通過提供自己的Comparator修改排序順序例:PriorityQueueDemo.javaMap接口接口實(shí)現(xiàn):HashMap,TreeMap,LinkedHashMapMap接口接口實(shí)現(xiàn):HashMap,TreeMap,LinkedHashMap把鍵映射到某個(gè)值一個(gè)鍵最多只能映射一個(gè)值一個(gè)值可對應(yīng)多個(gè)鍵最常用:HashMap(無序)和TreeMap(有序)HashMap:使用Hash表實(shí)現(xiàn)Map接口無序,非同步且允許空的鍵與值相比Hashtable(legacy)效率高TreeMap:與TreeSet類似,實(shí)現(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中存在一個(gè)或多個(gè)鍵,能夠映射到指定的值,那么返回true;否則返回falsebooleanisEmpty()如果當(dāng)前Map中不含任何鍵值對,則返回true;否則返回falseSet<Map.Entry<K,V>>entrySet()返回一個(gè)由當(dāng)前Map中所有鍵值對所組成的SetSet<K>keySet()返回一個(gè)Set,其中包含了當(dāng)前Map中的所有鍵Collection<V>values()返回一個(gè)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是一個(gè)輕量級對象,用于遍歷并選擇序列中的對象用法:使用容器的iterator()方法返回容器的迭代器,該迭代器準(zhǔn)備返回容器的第一個(gè)元素Java的迭代器只能單向移動next():獲得序列的下一個(gè)元素hasNext():檢查序列中是否還有元素remove():將迭代器新近返回的元素(即由next()產(chǎn)生的最后一個(gè)元素)刪除,因此在調(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)生一個(gè)指向List開始處的ListIterator對象例:ListIteratorDemo.java定義一個(gè)類Student,屬性為學(xué)號、姓名和成績;方法為增加記錄SetRecord和得到記錄GetRecord。SetRecord給出學(xué)號、姓名和成績的賦值,GetRecord通過學(xué)號得到考生的成績假設(shè)一個(gè)學(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)建為一種類型這些具名值又稱為枚舉常量一個(gè)枚舉類型實(shí)際定義了一個(gè)類,該類可以包含方法和其他屬性,以支持對枚舉值的操作,還可以實(shí)現(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]][;]如果沒有枚舉體部分,則“;”可省略枚舉常量實(shí)際上是枚舉類型的static和final的實(shí)例,加載枚舉類型時(shí),調(diào)用枚舉類型的構(gòu)造方法創(chuàng)建這些實(shí)例如果在枚舉體中定義了構(gòu)造方法,則在定義枚舉常量時(shí)可采用“常量(參數(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貨幣資金報(bào)表范例
- Windows Server網(wǎng)絡(luò)管理項(xiàng)目教程(Windows Server 2022)(微課版)10.3 任務(wù)2 DNS中繼代理
- 大型機(jī)械設(shè)備管理制度與安全操作規(guī)程(修改版1)
- 煤化工藝學(xué)煤低溫干餾
- 幼兒園安全教育教案18篇
- 小學(xué)安全教育主題班會教案
- 高三烴含氧衍生物歸納
- 全省小學(xué)數(shù)學(xué)教師賽課一等獎數(shù)學(xué)一年級上冊(人教2024年新編)《10的認(rèn)識 》課件
- 生命在你手中主題班會
- 病歷書寫規(guī)范
- 企業(yè)國有資產(chǎn)法解讀課件講義
- 大眾標(biāo)準(zhǔn)目錄(中文)
- 善于休息增進(jìn)健康
- 全國中學(xué)生英語能力測試高三初評英語試題
- 《汽車專業(yè)英語》課程教學(xué)大綱
- 自己設(shè)計(jì)的花鍵跨棒距的計(jì)算-2
- 雷電的監(jiān)測和預(yù)警
- 年金險(xiǎn)專項(xiàng)早會理念篇之養(yǎng)老專業(yè)知識專家講座
- 中職英語基礎(chǔ)模塊2(高教版)教案:Unit4 Volunteer Work(全6課時(shí))
- 凍干制劑工藝研究
- 2023年湖北省武漢市江漢區(qū)八年級上學(xué)期物理期中考試試卷附答案
評論
0/150
提交評論