




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、數(shù)組類型靜態(tài)初始化Type arrayName =element1,element2.動態(tài)初始化arrayName =new type length類和對象定義類各成員之間可以相互調(diào)用,但static修飾的成員不能訪問沒有static修飾的成員.有static修飾的成員屬于類本身,沒有的成員屬于該類的實例調(diào)用static修飾的成員,用 類 作為主調(diào) (即前面用類開頭)調(diào)用非static修飾的成員,用 this 作為主調(diào)(即前面用this開頭)方法詳解成員變量和局部變量成員變量:類里定義的變量 (包括實例變量,類變量)局部變量:方法里定義的變量(包括形參,方法局部變量,代碼塊局部變量)如果方法里
2、的局部變量跟成員變量同名,局部變量會覆蓋成員變量如果需要這個方法里引用被覆蓋的成員變量,則可使用this(對于實例變量)或類(對于類變量)作為調(diào)用者來限定訪問成員變量。使用訪問控制符Private 修飾成員變量最合適Default 訪問控制的成員或外部類可以被相同包下的其他類訪問Protected 成員即可以被同一個包中的其他類訪問,也可以被不同包中的子類訪問。通常是希望其子類來重寫這個方法。Public 可以被所有類訪問。 (只有一些static修飾的,類似全局變量的成員變量,才可能考慮使用public修飾)Package,import和import staticPackage一組相關功能的
3、類放在同一個package下使用:在java源代碼的第一個非注釋行放置如下代碼 package packageName;-d用于設置編譯生成class文件的保存位置-d. 代表當前路徑(同一個包中的類不必位于相同的目錄下) 同一個包下的類可以自由訪問,無須加包前綴Import用于導入制定包層次下的某個類或全部類import package.subpackage.ClassName; 導入某個類import package.subpackage.*; 導入全部類import static靜態(tài)導入用于導入指定類的單個或全部 靜態(tài)成員變量,方法import static package.subpac
4、kage.ClassName.fieldName|methodName;import static package.subpackage.ClassName.*;*使用import可以省略寫包名 , 使用import static可以省略寫類名 深入構(gòu)造器構(gòu)造器里的this代表它進行初始化的對象構(gòu)造器必須與類名相同構(gòu)造器不能直接被調(diào)用,構(gòu)造器必須使用new關鍵字來調(diào)用在構(gòu)造器B中調(diào)用構(gòu)造器A中的初始代碼,可以使用this關鍵字來調(diào)用相應的構(gòu)造器使用this調(diào)用另一個重載的的構(gòu)造器只能在構(gòu)造器中使用,而且必須作為構(gòu)造器執(zhí)行體的第一條語句。類的繼承繼承的特點:子類不能獲得父類的構(gòu)造器重寫父類的方法
5、重寫即子類把父類同名的方法覆蓋在子類方法中調(diào)用父類被覆蓋的方法,則可以使用super或 父類類名如果父類方法具有private訪問權限,子類無法訪問,無法重寫(super可以與this對比)多態(tài)多態(tài)性編譯時類型是BaseClass,運行時類型是SubClass,就出現(xiàn)多態(tài)了。多態(tài)簡言之:BaseClass a = new SubClass() 編譯類型 運行類型 引用變量時只能調(diào)用編譯類型中具有的方法,但運行時執(zhí)行它運行時類型所具有的方法(父類有,子類有,方法用子類的 父類有,子類沒,方法用父類的 父類沒,子類有,編譯失?。ο蟮膶嵗兞坎痪邆涠鄳B(tài)性。因為通過引用變量來訪問其包含的實例變量時,
6、系統(tǒng)總是試圖訪問它編譯時類型所定義的成員變量,而不是它運行時類型所定義的成員變量。引用變量的強制類型轉(zhuǎn)換引用變量只能調(diào)用它編譯時類型的方法,而不能調(diào)用它運行時類型的方法。如果試圖把一個父類實例轉(zhuǎn)換成子類類型,則這個對象必須實際上是子類實例才行(即編譯時類型是父類類型,而運行時類型是子類類型)繼承與組合使用繼承的注意點不希望子類重寫該方法,用final修飾符希望父類某個方法被子類重寫,但不希望被其他類自由訪問,用protected來修飾。何時需要父類派生新的子類?1. 子類需要額外增加屬性,而不僅僅是屬性的改變。2. 子類需要增加自己的獨有的行為方式。利用組合實現(xiàn)復用詳見055.8Composi
7、teTest.java書P154繼承表達的是一種“是”的關系,組合表達的是一種“有”的關系初始化塊使用初始化塊初始化塊要么不帶任何修飾符,要帶修飾符只能帶static。 初始化順序:先執(zhí)行初始化塊或聲明實例變量時指定的初始值; 再執(zhí)行構(gòu)造器里指定的初始值初始化塊和構(gòu)造器與構(gòu)造器不同,初始化快是一段固定執(zhí)行的代碼,它不能接收任何參數(shù)。靜態(tài)初始化塊靜態(tài)初始化塊不能對實例變量進行初始化處理(普通初始化塊負責對對象執(zhí)行初始化,靜態(tài)初始化塊負責對類進行初始化)處理對象toString方法toString方法總是返回該對象實現(xiàn)類的“類名+hashCode”值,但這個描述不能真正實現(xiàn)自我描述,因此如果用戶需
8、要自定義類能實現(xiàn)自我描述,就必須重寫Object類的toString方法。=和equals方法當使用=來判斷兩個變量是否相等時,如果 兩個變量是基本類型變量,且都是數(shù)值型,只要兩個變量的值相等 ,就返回true;但如果是兩個引用類型變量,只要它們指向同一個對象,=判斷才會返回true。(Object類中equals與=沒區(qū)別,所以需要重寫)String重寫了Object的equals方法,只要兩個字符串所包含的字符序列相同,就返回true。詳見P170final修飾符final成員變量 Final修飾的成員變量必須由程序員顯示的指定初始值Final修飾的實例變量,在普通初始化塊或構(gòu)造器中指定初
9、始值;Final修飾的類變量,在定義靜態(tài)初始塊或定義該類變量時指定初始值。final方法和類 Final修飾的方法不能被重寫,但可以被重載;Final修飾的類不可以有子類;抽象類抽象方法和抽象類有抽象方法的類只能被定義成抽象類,抽象類里可以沒有抽象方法;抽象類不能被實例化;抽象類的構(gòu)造器不能用于創(chuàng)建實例,主要用于被其子類調(diào)用;Abstract修飾類,表明該類只能被繼承Abstract修飾方法,表明該方法必須由子類重寫Abstract不能修飾成員變量,局部變量,構(gòu)造器接口接口的定義接口定義的基本語法修飾符interface 接口名 extends 父接口1,父接口2.零個到多個常量定義.零個到多
10、個抽象方法定義.零個到多個內(nèi)部類,接口,枚舉定義.零個到多個默認方法或類方法定義.接口里的方法都是抽象方法一個接口可以有多個直接父接口,但接口只能繼承接口,不能繼承類接口里可以包含 成員變量:只能是靜態(tài)常量 方法:實例方法,類方法,默認方法 內(nèi)部類:內(nèi)部接口,枚舉定義接口成員時,可以省略訪問控制修飾符,如果要指定,只能是public常量默認 public static final修飾方法默認 public abstract修飾使用接口實現(xiàn)接口的語法格式修飾符class 類名 extends 父類 implements 接口1,接口2.類體部分一個類實現(xiàn)了一個或多個接口后,這個類必須完全實現(xiàn)這些
11、接口里定義的全部抽象方法;否則,該類將保留從父類接口哪里繼承到的抽象方法,該類也必須定義成抽象類;一個類實現(xiàn)某個接口時,會獲得接口中定義的常量,方法等注:實現(xiàn)接口方法時,必須使用public修飾,因為接口里的方法都是public的,而子類重寫父類方法時訪問權限只能更大或相等接口和抽象類接口和抽象類都不能被實例化;接口和抽象類都可以包含抽象方法;接口與抽象類的差別詳見P195內(nèi)部類內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù)內(nèi)部類比外部類多三個修飾符 private ,protected,static非靜態(tài)內(nèi)部類不能擁有靜態(tài)成員非靜態(tài)內(nèi)部類public class Outerprivate int o
12、utProp = 9;class Innerprivate int inProp = 5;public void acessOuterProp()/內(nèi)部類可以直接訪問外部類的成員System.out.println(外部類的outProp屬性值: + outProp);public void accessInnerProp()/外部類不能直接訪問內(nèi)部類屬性,下面代碼出現(xiàn)編譯錯誤/System.out.println(內(nèi)部類的inProp屬性值: + inProp);/如需訪問內(nèi)部類成員,必須顯式創(chuàng)建內(nèi)部類對象System.out.println(內(nèi)部類的inProp屬性值: + new Inn
13、er().inProp);public static void main(String args)/執(zhí)行下面代碼,只創(chuàng)建了外部類對象,還未創(chuàng)建內(nèi)部類對象Outer out = new Outer();Inner in =new Inner();System.out.println(內(nèi)部類的inProp屬性值: +out.this.inProp);靜態(tài)內(nèi)部類用static修飾后,內(nèi)部類就屬于外部類本身,而不是外部類的某個對象了。使用內(nèi)部類1在外部類使用內(nèi)部類直接通過內(nèi)部類的類名來定義變量通過new調(diào)用內(nèi)部類構(gòu)造器來創(chuàng)建實例2在外部類以外來使用非靜態(tài)內(nèi)部類在外部類以外的地方定義內(nèi)部類OuterCl
14、ass.InnerClass varName在外部類以外的地方創(chuàng)建非靜態(tài)內(nèi)部類實例OuterInstance.new InnerConstructor() 實例 構(gòu)造器3在外部類以外使用靜態(tài)內(nèi)部類因為靜態(tài)內(nèi)部類是外部類類相關的,所以創(chuàng)建靜態(tài)內(nèi)部類實例的語法如下new OuterClass.InnerConstrutor()匿名內(nèi)部類匿名內(nèi)部類適合創(chuàng)建那種只需要一次使用的類匿名內(nèi)部類必須也只能繼承一個父類,或?qū)崿F(xiàn)一個接口兩條規(guī)則1匿名內(nèi)部類不能使抽象類2匿名內(nèi)部類不能定義構(gòu)造器。因為匿名內(nèi)部類沒有類名,所以無法定義構(gòu)造器枚舉類繼承的是java.lang.Enum類非抽象的枚舉類默認使用final
15、修飾,所以不能派生子類構(gòu)造器默認private修飾單例模式單例模式的兩種寫法/*這個是先初始化對象。稱為:餓漢式。Single類一進內(nèi)存,就已經(jīng)創(chuàng)建好了對象。class Singleprivate static Single s = new Single();private Single()public static Single getInstance()return s;*/對象是方法被調(diào)用時,才初始化,也叫做對象的延時加載。成為:懶漢式。/Single類進內(nèi)存,對象還沒有存在,只有調(diào)用了getInstance方法時,才建立對象。class Singleprivate static Sin
16、gle s = null;private Single()public static Single getInstance()if(s=null)synchronized(Single.class)if(s=null)s = new Single();return s;/記錄原則:定義單例,建議使用餓漢式。異常異常體系:Throwable|-Error|-Exception|-RuntimeException異常體系的特點:異常體系中的所有類以及建立的對象都具備可拋性。也就是說可以被throw和throws關鍵字所操作。只有異常體系具備這個特點。-throw和throws的用法:throw定義
17、在函數(shù)內(nèi),用于拋出異常對象。throws定義在函數(shù)上,用于拋出異常類,可以拋出多個用逗號隔開。當函數(shù)內(nèi)容有throw拋出異常對象,并未進行try處理。必須要在函數(shù)上聲明,都在編譯失敗。注意,RuntimeException除外。也就說,函數(shù)內(nèi)如果拋出的RuntimeExcpetion異常,函數(shù)上可以不用聲明。-如果函數(shù)聲明了異常,調(diào)用者需要進行處理。處理方法可以throws可以try。異常有兩種:編譯時被檢測異常該異常在編譯時,如果沒有處理(沒有拋也沒有try),編譯失敗。該異常被標識,代表這可以被處理。運行時異常(編譯時不檢測)在編譯時,不需要處理,編譯器不檢查。該異常的發(fā)生,建議不處理,讓
18、程序停止。需要對代碼進行修正。-異常處理語句:try需要被檢測的代碼;catch ()處理異常的代碼;finally一定會執(zhí)行的代碼;有三個結(jié)合格式:1.trycatch ()2.tryfinally3.trycatch ()finally注意:1,finally中定義的通常是 關閉資源代碼。因為資源必須釋放。2,finally只有一種情況不會執(zhí)行。當執(zhí)行到System.exit(0);fianlly不會執(zhí)行。-自定義異常:定義類繼承Exception或者RuntimeException1,為了讓該自定義類具備可拋性。2,讓該類具備操作異常的共性方法。當要定義自定義異常的信息時,可以使用父類已
19、經(jīng)定義好的功能。異常異常信息傳遞給父類的構(gòu)造函數(shù)。class MyException extends ExceptionMyException(String message)super(message);自定義異常:按照java的面向?qū)ο笏枷?,將程序中出現(xiàn)的特有問題進行封裝。-異常的好處:1,將問題進行封裝。2,將正常流程代碼和問題處理代碼相分離,方便于閱讀。異常的處理原則:1,處理方式有兩種:try 或者 throws。2,調(diào)用到拋出異常的功能時,拋出幾個,就處理幾個。一個try對應多個catch。3,多個catch,父類的catch放到最下面。4,catch內(nèi),需要定義針對性的處理方式。不
20、要簡單的定義printStackTrace,輸出語句。也不要不寫。當捕獲到的異常,本功能處理不了時,可以繼續(xù)在catch中拋出。trythrow new AException();catch (AException e)throw e;如果該異常處理不了,但并不屬于該功能出現(xiàn)的異常??梢詫惓^D(zhuǎn)換后,再拋出和該功能相關的異常?;蛘弋惓?梢蕴幚?,當需要將異常產(chǎn)生的和本功能相關的問題提供出去,當調(diào)用者知道。并處理。也可以將捕獲異常處理后,轉(zhuǎn)換新的異常。trythrow new AException();catch (AException e)/ 對AException處理。throw new BE
21、xception();異常的注意事項:在子父類覆蓋時:1,子類拋出的異常必須是父類的異常的子類或者子集。2,如果父類或者接口沒有異常拋出時,子類覆蓋出現(xiàn)異常,只能try不能拋。StringString類適用于描述字符串事物。那么它就提供了多個方法對字符串進行操作。常見的操作有哪些?1,獲取。1.1 字符串中的包含的字符數(shù),也就是字符串的長度。int length():獲取長度。1.2 根據(jù)位置獲取位置上某個字符。char charAt(int index):1.3 根據(jù)字符獲取該字符在字符串中位置。int indexOf(int ch):返回的是ch在字符串中第一次出現(xiàn)的位置。int inde
22、xOf(int ch, int fromIndex) :從fromIndex指定位置開始,獲取ch在字符串中出現(xiàn)的位置。int indexOf(String str):返回的是str在字符串中第一次出現(xiàn)的位置。int indexOf(String str, int fromIndex) :從fromIndex指定位置開始,獲取str在字符串中出現(xiàn)的位置。int lastIndexOf(int ch) :2,判斷。2.1 字符串中是否包含某一個子串。boolean contains(str):特殊之處:indexOf(str):可以索引str第一次出現(xiàn)位置,如果返回-1.表示該str不在字符串中
23、存在。所以,也可以用于對指定判斷是否包含。if(str.indexOf(aa)!=-1)而且該方法即可以判斷,有可以獲取出現(xiàn)的位置。2.2 字符中是否有內(nèi)容。boolean isEmpty(): 原理就是判斷長度是否為0. 2.3 字符串是否是以指定內(nèi)容開頭。boolean startsWith(str);2.4 字符串是否是以指定內(nèi)容結(jié)尾。boolean endsWith(str);2.5 判斷字符串內(nèi)容是否相同。復寫了Object類中的equals方法。boolean equals(str);2.6 判斷內(nèi)容是否相同,并忽略大小寫。boolean equalsIgnoreCase();3,
24、轉(zhuǎn)換。3.1 將字符數(shù)組轉(zhuǎn)成字符串。構(gòu)造函數(shù):String(char) String(char,offset,count):將字符數(shù)組中的一部分轉(zhuǎn)成字符串。靜態(tài)方法:static String copyValueOf(char);static String copyValueOf(char data, int offset, int count) static String valueOf(char):3.2 將字符串轉(zhuǎn)成字符數(shù)組。*char toCharArray():3.3 將字節(jié)數(shù)組轉(zhuǎn)成字符串。String(byte)String(byte,offset,count):將字節(jié)數(shù)組中的一部
25、分轉(zhuǎn)成字符串。3.4 將字符串轉(zhuǎn)成字節(jié)數(shù)組。byte getBytes():3.5 將基本數(shù)據(jù)類型轉(zhuǎn)成字符串。static String valueOf(int)static String valueOf(double)/3+;/String.valueOf(3);特殊:字符串和字節(jié)數(shù)組在轉(zhuǎn)換過程中,是可以指定編碼表的。4,替換String replace(oldchar,newchar);5,切割String split(regex);6,子串。獲取字符串中的一部分。String substring(begin);String substring(begin,end);7,轉(zhuǎn)換,去除空格,比
26、較。7.1 將字符串轉(zhuǎn)成大寫或則小寫。 String toUpperCase(); String toLowerCase();7.2 將字符串兩端的多個空格去除。String trim();7.3 對兩個字符串進行自然順序的比較。int compareTo(string);StringBufferStringBuffer是字符串緩沖區(qū)。是一個容器。特點:1,長度是可變化的。2,可以字節(jié)操作多個數(shù)據(jù)類型。3,最終會通過toString方法變成字符串。C create U update R read D delete1,存儲。StringBuffer append():將指定數(shù)據(jù)作為參數(shù)添加到已有
27、數(shù)據(jù)結(jié)尾處。StringBuffer insert(index,數(shù)據(jù)):可以將數(shù)據(jù)插入到指定index位置。2,刪除。StringBuffer delete(start,end):刪除緩沖區(qū)中的數(shù)據(jù),包含start,不包含end。StringBuffer deleteCharAt(index):刪除指定位置的字符。3,獲取。char charAt(int index) int indexOf(String str) int lastIndexOf(String str) int length() String substring(int start, int end) 4,修改。StringB
28、uffer replace(start,end,string);void setCharAt(int index, char ch) ;5,反轉(zhuǎn)。StringBuffer reverse(); 6,將緩沖區(qū)中指定數(shù)據(jù)存儲到指定字符數(shù)組中。void getChars(int srcBegin, int srcEnd, char dst, int dstBegin) JDK1.5 版本之后出現(xiàn)了StringBuilder.StringBuffer是線程同步。StringBuilder是線程不同步。以后開發(fā),建議使用StringBuilder升級三個因素:1,提高效率。2,簡化書寫。3,提高安全性。
29、基本數(shù)據(jù)類型對象包裝類。ByteByteShortshortintIntegerlongLongboolean BooleanFloatFloatdoubleDoublecharCharacter基本數(shù)據(jù)類型對象包裝類的最常見作用,就是用于基本數(shù)據(jù)類型和字符串類型之間做轉(zhuǎn)換基本數(shù)據(jù)類型轉(zhuǎn)成字符串?;緮?shù)據(jù)類型+基本數(shù)據(jù)類型.toString(基本數(shù)據(jù)類型值);如: Integer.toString(34);/將34整數(shù)變成34;字符串轉(zhuǎn)成基本數(shù)據(jù)類型。xxx a = Xxx.parseXxx(String);int a = Integer.parseInt(123);double b = Do
30、uble.parseDouble(12.23);boolean b = Boolean.parseBoolean(true);Integer i = new Integer(123);int num = Value();十進制轉(zhuǎn)成其他進制。toBinaryString();toHexString();toOctalString();其他進制轉(zhuǎn)成十進制。parseInt(string,radix);集合Collection|-List:元素是有序的,元素可以重復。因為該集合體系有索引。|-ArrayList:底層的數(shù)據(jù)結(jié)構(gòu)使用的是數(shù)組結(jié)構(gòu)。特點:查詢速度很快。但是增刪稍慢。線程不同步。
31、|-LinkedList:底層使用的鏈表數(shù)據(jù)結(jié)構(gòu)。特點:增刪速度很快,查詢稍慢。線程不同步。|-Vector:底層是數(shù)組數(shù)據(jù)結(jié)構(gòu)。線程同步。被ArrayList替代了。因為效率低。|-Set:元素是無序,元素不可以重復Collection定義了集合框架的共性功能。1,添加add(e);addAll(collection);2,刪除remove(e);removeAll(collection);clear();3,判斷。contains(e);isEmpty();4,獲取iterator();size();5,獲取交集。retainAll();6,集合變數(shù)組。toArray();1,add方法的
32、參數(shù)類型是Object。以便于接收任意類型對象。2,集合中存儲的都是對象的引用(地址)什么是迭代器呢?其實就是集合的取出元素的方式。如同抓娃娃游戲機中的夾子。迭代器是取出方式,會直接訪問集合中的元素。所以將迭代器通過內(nèi)部類的形式來進行描述。通過容器的iterator()方法獲取該內(nèi)部類的對象。List:特有方法。凡是可以操作角標的方法都是該體系特有的方法。增add(index,element);addAll(index,Collection);刪remove(index);改set(index,element);查get(index):subList(from,to);/包含頭元素,不包含尾元
33、素listIterator();int indexOf(obj):獲取指定元素的位置。ListIterator listIterator();List集合特有的迭代器。ListIterator是Iterator的子接口。在迭代時,不可以通過集合對象的方法操作集合中的元素。因為會發(fā)生ConcurrentModificationException異常。所以,在迭代器時,只能用迭代器的放過操作元素,可是Iterator方法是有限的,只能對元素進行判斷,取出,刪除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。該接口只能通過List集合的listIterator
34、方法獲取。LinkedList:特有方法:addFirst();addLast();getFirst();getLast();獲取元素,但不刪除元素。如果集合中沒有元素,會出現(xiàn)NoSuchElementExceptionremoveFirst();removeLast();獲取元素,但是元素被刪除。如果集合中沒有元素,會出現(xiàn)NoSuchElementException在JDK1.6出現(xiàn)了替代方法。/以后用這個offerFirst();offerLast();添加元素peekFirst();peekLast();獲取元素,但不刪除元素。如果集合中沒有元素,會返回null。pollFirst();
35、pollLast();獲取元素,但是元素被刪除。如果集合中沒有元素,會返回null。List集合判斷元素是否相同,依據(jù)是元素的equals方法。SetSet集合的功能和Collection是一致的。|-Set:元素是無序(存入和取出的順序不一定一致),元素不可以重復。、HashSet底層數(shù)據(jù)結(jié)構(gòu)是哈希表。是線程不安全的。不同步。HashSet是如何保證元素唯一性的呢?是通過元素的兩個方法,hashCode和equals來完成。如果元素的HashCode值相同,才會判斷equals是否為true。如果元素的hashcode值不同,不會調(diào)用equals。注意,對于判斷元素是否存在,以及刪除等操作,
36、依賴的方法是元素的hashcode和equals方法。TreeSet可以對Set集合中的元素進行排序。記住,排序時,當主要條件相同時,一定判斷一下次要條件底層數(shù)據(jù)結(jié)構(gòu)是二叉樹。保證元素唯一性的依據(jù):compareTo方法return 0.TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實現(xiàn)Comparable接口,覆蓋compareTo方法。也種方式也成為元素的自然順序,或者叫做默認順序。TreeSet的第二種排序方式。當元素自身不具備比較性時,或者具備的比較性不是所需要的。這時就需要讓集合自身具備比較性。在集合初始化時,就有了比較方式。當元素自身不具備比較性,或者具備的比較性不
37、是所需要的。這時需要讓容器自身具備比較性。定義了比較器,將比較器對象作為參數(shù)傳遞給TreeSet集合的構(gòu)造函數(shù)。當兩種排序都存在時,以比較器為主。定義一個類,實現(xiàn)Comparator接口,覆蓋compare方法。MapMap集合:該集合存儲鍵值對。一對一對往里存。而且要保證鍵的唯一性。1,添加。put(K key, V value) /第一次賦值,第二次如果鍵相同,則覆蓋putAll(Map m) 2,刪除。clear() remove(Object key) 3,判斷。containsValue(Object value) containsKey(Object key) isEmpty()
38、4,獲取。get(Object key) size() values() entrySet() keySet() Map|-Hashtable:底層是哈希表數(shù)據(jù)結(jié)構(gòu),不可以存入null鍵null值。該集合是線程同步的。jdk1.0.效率低。|-HashMap:底層是哈希表數(shù)據(jù)結(jié)構(gòu),允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。|-TreeMap:底層是二叉樹數(shù)據(jù)結(jié)構(gòu)。線程不同步??梢杂糜诮omap集合中的鍵進行排序。和Set很像。其實Set底層就是使用了Map集合。map集合取出的兩種方式代碼示例見day16 MapDemo21,Set
39、 keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。所有可以迭代方式取出所有的鍵,在根據(jù)get方法。獲取每一個鍵對應的值。Map集合的取出原理:將map集合轉(zhuǎn)成set集合。在通過迭代器取出。2,SetMap.Entry entrySet:將map集合中的映射關系存入到了set集合中,而這個關系的數(shù)據(jù)類型就是:Map.EntryEntry其實就是Map中的一個static內(nèi)部接口。為什么要定義在內(nèi)部呢?因為只有有了Map集合,有了鍵值對,才會有鍵值的映射關系。關系屬于Map集合中的一個內(nèi)部事物。而且該事物在直接訪問Map集合中的元素。Map.Entry 其實Entry也是一
40、個接口,它是Map接口中的一個內(nèi)部接口。CollectionsCollections:集合框架的工具類。里面定義的都是靜態(tài)方法。Collections和Collection有什么區(qū)別?Collection是集合框架中的一個頂層接口,它里面定義了單列集合的共性方法。它有兩個常用的子接口,List:對元素都有定義索引。有序的。可以重復元素。Set:不可以重復元素。無序。Collections是集合框架中的一個工具類。該類中的方法都是靜態(tài)的提供的方法中有可以對list集合進行排序,二分查找等方法。通常常用的集合都是線程不安全的。因為要提高效率。如果多線程操作這些集合時,可以通過該工具類中的同步方法,
41、將線程不安全的集合,轉(zhuǎn)換成安全的。集合變數(shù)組。Collection接口中的toArray方法。1,指定類型的數(shù)組到底要定義多長呢?當指定類型的數(shù)組長度小于了集合的size,那么該方法內(nèi)部會創(chuàng)建一個新的數(shù)組。長度為集合的size。當指定類型的數(shù)組長度大于了集合的size,就不會新創(chuàng)建了數(shù)組。而是使用傳遞進來的數(shù)組。所以創(chuàng)建一個剛剛好的數(shù)組最優(yōu)。String arr = al.toArray(new Stringal.size();2,為什么要將集合變數(shù)組?為了限定對元素的操作。不需要進行增刪了。Arrays:用于操作數(shù)組的工具類。里面都是靜態(tài)方法。asList:將數(shù)組變成list集合把數(shù)組變成l
42、ist集合有什么好處?可以使用集合的思想和方法來操作數(shù)組中的元素。注意:將數(shù)組變成集合,不可以使用集合的增刪方法。因為數(shù)組的長度是固定。如果數(shù)組中的元素都是對象。那么變成集合時,數(shù)組中的元素就直接轉(zhuǎn)成集合中的元素。如果數(shù)組中的元素都是基本數(shù)據(jù)類型,那么會將該數(shù)組作為集合中的元素存在。高級for循環(huán)格式:for(數(shù)據(jù)類型 變量名 : 被遍歷的集合(Collection)或者數(shù)組)對集合進行遍歷。只能獲取集合元素。但是不能對集合進行操作。迭代器除了遍歷,還可以進行remove集合中元素的動作。如果是用ListIterator,還可以在遍歷過程中對集合進行增刪改查的動作。傳統(tǒng)for和高級for有什么
43、區(qū)別呢?高級for有一個局限性。必須有被遍歷的目標。建議在遍歷數(shù)組的時候,還是希望是用傳統(tǒng)for。因為傳統(tǒng)for可以定義腳標。方法的可變參數(shù)。在使用時注意:可變參數(shù)一定要定義在參數(shù)列表最后面??勺儏?shù)。其實就是上一種數(shù)組參數(shù)的簡寫形式。不用每一次都手動的建立數(shù)組對象。只要將要操作的元素作為參數(shù)傳遞即可。隱式將這些參數(shù)封裝成了數(shù)組class ParamMethodDemopublic static void main(String args) show(haha,2,3,4,5,6);show(2,3,4,5,6,4,2,35,9,heh);show(); /參數(shù)可變public static
44、void show(String str,int. arr)System.out.println(arr.length); /黃色加粗部分就是可變參數(shù)的形式靜態(tài)導入StaticImport 。當類名重名時,需要指定具體的包名。當方法重名是,指定具備所屬的對象或者類。示例 import static java.util.Arrays.*;/導入的是Arrays這個類中的所有靜態(tài)成員。泛型泛型:用于解決安全問題,是一個類型安全機制。好處1.將運行時期出現(xiàn)問題ClassCastException,轉(zhuǎn)移到了編譯時期。,方便于程序員解決問題。讓運行時問題減少,安全。,2,避免了強制轉(zhuǎn)換麻煩。泛型格式:通
45、過來定義要操作的引用數(shù)據(jù)類型。放在返回值類型前面在使用java提供的對象時,什么時候?qū)懛盒湍??通常在集合框架中很常見,只要見到就要定義泛型。其實 就是用來接收類型的。當使用集合時,將集合中要存儲的數(shù)據(jù)類型作為參數(shù)傳遞到中即可。什么時候定義泛型類?當類中要操作的引用數(shù)據(jù)類型不確定的時候,早期定義Object來完成擴展。現(xiàn)在定義泛型來完成擴展。泛型類定義的泛型,在整個類中有效。如果被方法使用,那么泛型類的對象明確要操作的具體類型后,所有要操作的類型就已經(jīng)固定了。為了讓不同方法可以操作不同類型,而且類型還不確定。那么可以將泛型定義在方法上。特殊之處:靜態(tài)方法不可以訪問類上定義的泛型。如果靜態(tài)方法操作
46、的應用數(shù)據(jù)類型不確定,可以將泛型定義在方法上。通配符。也可以理解為占位符。泛型的限定;? extends E: 可以接收E類型或者E的子類型。上限。? super E: 可以接收E類型或者E的父類型。下限多線程進程:是一個正在執(zhí)行中的程序。每一個進程執(zhí)行都有一個執(zhí)行順序。該順序是一個執(zhí)行路徑,或者叫一個控制單元。線程:就是進程中的一個獨立的控制單元。線程在控制著進程的執(zhí)行。一個進程中至少有一個線程。Java VM 啟動的時候會有一個進程java.exe.該進程中至少一個線程負責java程序的執(zhí)行。而且這個線程運行的代碼存在于main方法中。該線程稱之為主線程。擴展:其實更細節(jié)說明jvm,jvm
47、啟動不止一個線程,還有負責垃圾回收機制的線程。1,如何在自定義的代碼中,自定義一個線程呢?通過對api的查找,java已經(jīng)提供了對線程這類事物的描述。就Thread類。線程都有自己默認的名稱。Thread-編號 該編號從0開始。static Thread currentThread():獲取當前線程對象。getName(): 獲取線程名稱。設置線程名稱:setName或者構(gòu)造函數(shù)。創(chuàng)建線程的第一種方式:繼承Thread類。步驟:1,定義類繼承Thread。2,復寫Thread類中的run方法。目的:將自定義代碼存儲在run方法。讓線程運行。3,調(diào)用線程的start方法,該方法兩個作用:啟動線程
48、,調(diào)用run方法。發(fā)現(xiàn)運行結(jié)果每一次都不同。因為多個線程都獲取cpu的執(zhí)行權。cpu執(zhí)行到誰,誰就運行。明確一點,在某一個時刻,只能有一個程序在運行。(多核除外)cpu在做著快速的切換,以達到看上去是同時運行的效果。我們可以形象把多線程的運行行為在互相搶奪cpu的執(zhí)行權。這就是多線程的一個特性:隨機性。誰搶到誰執(zhí)行,至于執(zhí)行多長,cpu說的算。為什么要覆蓋run方法呢?Thread類用于描述線程。該類就定義了一個功能,用于存儲線程要運行的代碼。該存儲功能就是run方法。也就是說Thread類中的run方法,用于存儲線程要運行的代碼。創(chuàng)建線程的第二種方式:實現(xiàn)Runable接口步驟:1,定義類實
49、現(xiàn)Runnable接口2,覆蓋Runnable接口中的run方法。將線程要運行的代碼存放在該run方法中。3,通過Thread類建立線程對象。4,將Runnable接口的子類對象作為實際參數(shù)傳遞給Thread類的構(gòu)造函數(shù)。為什么要將Runnable接口的子類對象傳遞給Thread的構(gòu)造函數(shù)?因為線程要運行的代碼都在Runnable子類的run方法中存儲。所以要將該run方法所屬的對象傳遞給Thread。讓Thread線程去使用該對象調(diào)用其run方法。或者說:Runnable實現(xiàn)類里包含的run()方法僅作為線程執(zhí)行體。而實際的線程對象依然是Thread實例。5,調(diào)用Thread類的start方法開啟線程并調(diào)用Runnable接口子類的run方法。實現(xiàn)方式和繼承方式有什么區(qū)別呢?實現(xiàn)方式好處:避免了單繼承的局限性。在定義線程時,建立使用實現(xiàn)方式。兩種方式區(qū)別:繼承Thread 線程代碼存放Thread子類run方法中。通過繼承Thread類來獲得當
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 腱鞘炎個人護理
- 企業(yè)安全三級教育
- 新生兒常見病癥護理診斷與措施
- 全生命周期健康管理
- 進出無塵室的管理制度
- 2025年珠寶首飾及有關物品項目提案報告模板
- 2025年CVD法制備的ZNS、ZNSE材料項目提案報告
- 2025年丁炔二醇項目立項申請報告
- 2025年殺螨隆項目提案報告
- 2025年高柔性不銹鋼金屬軟管項目規(guī)劃申請報告模板
- 港口裝卸作業(yè)培訓
- 鉗工考試試題及答案
- 2025年廣東省佛山市順德區(qū)中考二模物理試題(含答案)
- 研發(fā)項目變更管理制度
- 2024-2025學年下學期小學數(shù)學人教版三年級期末必刷常考題之復式統(tǒng)計表
- 2025至2030中國復印機行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 暑假安全家長會4
- 瑞幸大學題目及答案
- 消防監(jiān)督檢查員崗位技能考核題庫
- 2024年安徽省泗縣衛(wèi)生局公開招聘試題帶答案
- 2025年云南省中考生物試卷真題(含標準答案)
評論
0/150
提交評論