java完整學習筆記_第1頁
java完整學習筆記_第2頁
java完整學習筆記_第3頁
java完整學習筆記_第4頁
java完整學習筆記_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

一、java的常量1.常量的定義:在程序執(zhí)行過程中,其值不可以發(fā)生改變的量。2.常量的分類:(1)字符串常量被雙引號包裹起來的字符串,如"helloworld",""(這是空字符串)(2)整數(shù)常量如12(3)小數(shù)常量如12.34(4)字符常量被單引號包裹起來的單個字符,如'a'(5)布爾常量true,false打印出來也是true,false(6)空常量null3.常量數(shù)據(jù)在轉(zhuǎn)換時,按int型轉(zhuǎn)換二、java變量的數(shù)據(jù)類型1.java是一種強類型語言,針對每一個數(shù)據(jù)都給出了明確的數(shù)據(jù)類型。2.java變量數(shù)據(jù)類型的分類:分為基本數(shù)據(jù)類型、引用數(shù)據(jù)類型(類、接口、數(shù)組)。String屬于類,不屬于數(shù)據(jù)類型。3.java變量基本數(shù)據(jù)類型的分類:四類八種(1)整型:byte1個字節(jié),short2,int4,long8。默認是int型。(2)浮點型:float4,double8。默認是double型。注意:double,float類型的變量在做算數(shù)運算時,要注意有精度丟失的問題,如果做關(guān)系運算,就不需要考慮精度丟失的問題。(3)字符型:char2,如'a'(4)布爾型:boolean14.變量的定義格式:數(shù)據(jù)類型變量名稱=初始化值;5.注意事項:定義long型的數(shù)據(jù),末尾加L或l,建議加L;定義float型的數(shù)據(jù),末尾加F或f,建議加F。6.基本數(shù)據(jù)類型在類中的默認值byte,short,intlong的默認值為0零float,double的默認值為0.0char的默認值為'\u0000'優(yōu)零boolean的默認值為false引用類型的默認值為null三、標識符identifier1.定義:就是用來給包、類、變量、方法等起名字的符號2.組成規(guī)則(1)unicode字符、數(shù)字字符、英文大小寫字符、漢字(不建議使用漢字)(2)下劃線_(3)美元符號$3.注意事項:(1)不能以數(shù)字開頭(2)不能是java的關(guān)鍵字4.命名規(guī)范:(1)見名知意,最好用英文、漢語拼音(2)給類、接口命名,每個單詞的首字母要大寫,如MaxAge(3)給方法、變量命名,從第二個單詞開始,首字母要大寫,如maxAge(4)給常量命名,每個字母都大寫,多個單詞之間用下劃線隔開,如MAX_AGE(5)給包命名,全部字母小寫,多級包之間用"."隔開,一般用公司域名倒過來,如的包名可以寫成com.cctv(6)給項目命名:和類或者和方法的名稱一致即可。四、類型轉(zhuǎn)換TypeConversion1.分類:隱式轉(zhuǎn)換、強制轉(zhuǎn)換2.隱式轉(zhuǎn)換(1)byte,short,char--->int--->long--->float--->double(2)boolean類型不參與這樣的運算(3)注意:byte,short,char在做運算時,無論遇沒遇到int,都會首先提升為int,再參與運算。(4)byteb=3+4;//這里3和4都是常量,而常量會優(yōu)先做運算,按int型計算編程7,再參與運算。3.強制轉(zhuǎn)換(1)格式:目標類型變量名稱=(目標類型)(被轉(zhuǎn)換的數(shù)據(jù));(2)注意:雖然可以做強制轉(zhuǎn)換,但是不建議,因為強制轉(zhuǎn)換可能有數(shù)據(jù)的丟失。只有不得不轉(zhuǎn)換,而且你確定不會出現(xiàn)問題的時候,才可以使用強制轉(zhuǎn)換,否則不要強用。五、寫程序時,做數(shù)據(jù)測試,應該考慮這幾種情況:(1)正確數(shù)據(jù);(2)邊界數(shù)據(jù);(3)錯誤數(shù)據(jù)。六、數(shù)組1.定義:數(shù)組是存儲同一種數(shù)據(jù)類型的多個變量的容器。其中每一個變量叫做元素,元素的編號叫做索引。2.格式:(1)數(shù)據(jù)類型[]數(shù)組名;//推薦用這個(2)數(shù)據(jù)類型數(shù)組名[];3.int[]arr;//定義了一個int類型的數(shù)據(jù),數(shù)組名是arr。--推薦用這個intarr[];//定義了一個int類型的變量,變量名是arr數(shù)組。4.數(shù)組的初始化(1)數(shù)組的初始化,就是為數(shù)組開辟內(nèi)存空間,并為數(shù)組中的每一個元素賦予初始值。(2)數(shù)組初始化的分類:動態(tài)初始化、靜態(tài)初始化(3)動態(tài)初始化:只給出長度,由系統(tǒng)給出初始化值。格式:數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[數(shù)組長度];舉例:int[]arr=newint[3];左邊:int:說明數(shù)組中的元素類型是int類型[]:說明這是數(shù)組arr:這是數(shù)據(jù)的名稱右邊:new:為數(shù)組分配內(nèi)存空間int:說明數(shù)組中中的元素是int類型[]:說明這是數(shù)組3:數(shù)組長度,就是數(shù)組中的元素個數(shù)賦值:數(shù)組名[索引]=數(shù)據(jù);獲取元素的格式:數(shù)組名[索引](4)靜態(tài)初始化:給出初始值,由系統(tǒng)決定長度。格式:數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[]{元素1,元素2,...};簡化格式:數(shù)據(jù)類型[]數(shù)組名={元素1,元素2,...};5.如果兩個數(shù)組拿的是同一個堆內(nèi)存的地址,那么任何一個數(shù)組對堆內(nèi)存數(shù)據(jù)進行了修改,另一個訪問到的也是修改過的。例子:夫妻-娃int[]arr_1=newint[3];int[]arr_2=arr_1;//把arr_1數(shù)組的地址賦值給arr_2數(shù)組,這樣兩個數(shù)組都指向了同一個堆內(nèi)存空間。6.數(shù)組操作的常見問題(1)ArrayIndexOutOfBoundsException數(shù)組索引越界異常,因為訪問了不存在的索引。(2)NullPointerException空指針異常,因為null是指不再指向堆內(nèi)存的數(shù)據(jù),而程序還要訪問它。空常量null是可以復制給引用數(shù)據(jù)類型的,表示該引用不再指向堆內(nèi)存的數(shù)據(jù)。(3)代碼示例:int[]arr={1,2,3};System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsExceptionarr=null;System.out.println(arr[0]);//java.lang.NullPointerException7.用數(shù)據(jù)的length屬性獲取數(shù)組元素個數(shù),格式:數(shù)組名.length例子:遍歷數(shù)組for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}例子:獲取數(shù)組最值解題思路:1.找一個參照物,但是這個參照物只能是該數(shù)組中的元素,不能是外部的。2.拿數(shù)組中第一個元素作為參照物。max=arr[0];min=arr[0];3.遍歷數(shù)組,從第二個元素開始,依次與參照物比較,如果元素比max大,那么久留下來做參照物。if(max<arr[i])max=arr[i];if(min>arr[i])min=arr[i];4.再比較下一個元素。最后輸出結(jié)果。例子:不死神兔有一對兔子,從出生后第三個月起,每個月都生一對兔子,小兔子長到第三個月后,每個月又生一對兔子。假如兔子都不死,問第20個月,兔子對數(shù)是多少?解題思路:先找規(guī)律規(guī)律對數(shù)第一個月1二1三2四3五5……找出的規(guī)律為:從第三個月開始,每個月的兔子對數(shù)都是前兩個月兔子對數(shù)相加之和,第一個月和第二個月的兔子對數(shù)都是1。分析:1.由于數(shù)據(jù)比較多,所以我們定義數(shù)組實現(xiàn)。int[]arr=newint[20];2.給數(shù)據(jù)元素賦值。arr[0]=1;arr[1]=1;3.從第三個月開始,根據(jù)規(guī)律賦值。for(inti=2;i<length;i++)arr[i]=arr[i-1]+arr[i-2];8.數(shù)組常用的方法importjava.util.Arrays;Arrays.sort(arr);//可以對數(shù)組從小到大排序,只能對一維數(shù)組進行排序。System.out.println(Arrays.toString(arr));//可以把數(shù)組元素拼接成一個好看的字符串,輸出:[16,13,28,56]9.二維數(shù)組(1)數(shù)組是引用數(shù)據(jù)類型,所以里面可以再放數(shù)組,叫做二維數(shù)組。(2)定義:int[][]arr;//推薦intarr[][];(3)初始化int[][]arr=newint[3][5];//3代表這個二維數(shù)組中有3個一維數(shù)組,每個一維數(shù)組里有5個元素int[][]arr={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};(4)遍歷二維數(shù)組for(inti=0;i<arr.length;i++){//遍歷的是二維數(shù)組里所有的一維數(shù)組for(intj=0;j<arr[i].length;j++){//遍歷的是一維數(shù)組里的每一個元素System.out.print(arr[i][j]+"");}System.out.println();}10.數(shù)組的缺點:數(shù)組的長度是固定的。以后工作中用集合。面向?qū)ο?.OOP的特點:封裝encapsulation,繼承inheritance,多態(tài)polymorphism2.類的成員:成員變量、成員方法(1)成員變量:定義在類中、方法外的局部變量。(2)成員變量與局部變量的相同點和區(qū)別:相同點:成員變量與局部變量的定義是相同的。區(qū)別:A.在類中的位置不同。成員變量的位置在類中方法外。局部變量在方法內(nèi)或者方法聲明上(形式參數(shù))。B.在內(nèi)存中的位置不同。成員變量在堆內(nèi)存。靜態(tài)成員變量隨著類的加載而加載,隨著程序的結(jié)束而消失。局部變量在棧內(nèi)存。C.生命周期不同。成員變量隨著對象的創(chuàng)建而存在,隨著對象的消失而消失。局部變量隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失。D.初始化值不同。成員變量有默認值,可以不用初始化就可以說使用。局部變量沒有默認值,必須先定義(即初始化)、賦值,最后使用。(3)成員方法:與方法的定義相同,區(qū)別是成員方法去掉了修飾符的static關(guān)鍵字。3.類的使用:就是使用該類的成員(成員變量和成員方法)。要想使用一個類的成員,就必須先擁有該類的對象,即創(chuàng)建對象。(1)格式:類名對象名=new類名();(2)對象訪問成員:A.訪問成員變量:對象名.成員變量B.訪問成員方法:對象名.成員方法(...)封裝1.基本概念(1)把成員變量都用private修飾,對外提供public修飾的getXxx()、setXxx()方法。(2)封裝的原則:A.將不需要對外提供的東東都隱藏起來。B.把屬性隱藏,提供公共方法對其訪問。(3)封裝的好處:增加了代碼的安全性和復用性。弊端:犧牲了一些效率。但是利大于弊,因為變量是不可控的,方法是可控的。(4)方法中成員變量訪問的原則:就近原則(5)訪問變量:局部變量.成員變量2.this:代表所在類的對象引用,即代表當前的那個對象。誰調(diào)用的,this就代表誰。(1)如果局部變量名和成員變量名稱一致,在方法中使用的時候采用的是就近原則,所以用this。(2)方法被那個對象調(diào)用,this就代表誰。(3)使用場景:就是用于解決成員變量被隱藏的問題。(用在局部變量隱藏成員變量的情況,即局部變量與成員變量重名)3.構(gòu)造方法Constructor:用于給對象的數(shù)據(jù)進行初始化(1)格式:A.方法名和類名相同B.沒有返回值類型,連void都不能寫C.沒有具體的返回值D.構(gòu)造方法可以重載類名對象名=new構(gòu)造方法名(...)(2)構(gòu)造方法的注意事項A.如果我們沒有給出構(gòu)造方法,系統(tǒng)將給出一個默認的無參構(gòu)造方法供我們使用。B.如果我們給出了構(gòu)造方法,系統(tǒng)將不再提供構(gòu)造方法供我們使用。C.構(gòu)造方法也是可以重載的,一般的時候我們寫構(gòu)造方法寫兩個:空參構(gòu)造方法、全參構(gòu)造方法。(3)給成員變量賦值的方法A.setXxx()B.構(gòu)造方法(4)構(gòu)造方法的使用給屬性初始化:構(gòu)造方法是在創(chuàng)建對象的時候給屬性進行初始化,只能用一次。用setXxx()方法進行初始化:當創(chuàng)建完對象后,再想修改屬性值就需要用到setXxx()方法了。繼承格式:publicclass類名extends父類{}1.構(gòu)造方法不能繼承。2.開發(fā)的原則:高內(nèi)聚,低耦合高內(nèi)聚:一個類或一個方法只完成一個功能,并且不依賴于其它的類或方法。就是自己完成某件事的能力。低耦合:修改完一個方法后,其它的方法基本不需要動代碼,維護起來很方便。類與類的關(guān)系盡量減少。3.java中類的繼承特點:(1)java中類只支持單繼承,不支持多繼承。(2)支持多層繼承。4.就近原則:成員變量名稱相同時,在子類方法中訪問變量,(1)在方法的局部范圍找,如果有就使用。(2)在子類的成員范圍找,如果有就使用。(3)在父類的成員范圍找,如果有就使用。(4)如果還找不到,就報錯。5.this和super(1)this代表本類對象的引用。super代表父類的存儲空間,也可以理解為代表父類對象的引用。(2)用法:A.訪問成員變量:this.成員變量。super.成員變量B.訪問構(gòu)造方法:this(...)調(diào)用本類的構(gòu)造方法。super(...)調(diào)用父類的構(gòu)造方法C.訪問成員方法:this.成員方法。super.成員方法6.java繼承中構(gòu)造方法的訪問特點(1)子類構(gòu)造方法執(zhí)行前,都會先執(zhí)行父類的無參構(gòu)造方法。因為子類會繼承父類的成員方法,父類必須先初始化好了,子類才能繼承。(2)在子類的構(gòu)造方法中,默認第一行有一條語句super(),即必須在構(gòu)造方法的第一行。如果子類沒有寫super(),系統(tǒng)會默認加上一條。如果我們寫了構(gòu)造方法,系統(tǒng)就不會給我們提供構(gòu)造方法了。問題:如果父類中沒有無參構(gòu)造方法,怎么辦呢?回答:A.在父類中添加一個無參構(gòu)造方法。(推薦)B.可以通過super去訪問父類的帶參構(gòu)造方法。我們在寫構(gòu)造方法的時候,最好寫上無參構(gòu)造方法和全參構(gòu)造方法。7.java繼承中成員方法的訪問特點:也是就近原則子類中方法和父類中方法的聲明相同時(這叫方法的覆蓋override),調(diào)用的是子類中的方法。8.重載overload:在同一個類中出現(xiàn)的方法名相同的情況覆蓋override:子類中出現(xiàn)了和父類中一模一樣的方法聲明的情況9.方法覆蓋的注意事項(1)@override注解標記一個方法,表名該方法是覆蓋父類的方法(2)父類私有的方法不能被覆蓋(3)子類覆蓋父類方法時,訪問權(quán)限不能更低private<默認修飾符friendly<protected<publicpublic:本類、別的包的類、本包的類protected:本包中的類、其他包子類中friendly:只能在本包中的類private:只能在本類中10.分析案例的時候是從子類分析到父類,寫代碼的時候是從父類寫到子類。多態(tài)1.java多態(tài)的前提(1)有繼承關(guān)系(2)有方法覆蓋(不是必須的)(3)有父類引用指向子類對象Fuf=newZi();Dogdog=newDog();//我說這只狗是狗Animalani=newDog();//我說這只狗是只小動物2.多態(tài)中成員訪問的特點(1)成員變量:編譯看左邊,運行看左邊(2)成員方法:編譯看左邊,運行看右邊3.為什么成員變量和成員方法的訪問不一樣呢?因為成員方法有覆蓋,而成員變量沒有覆蓋。4.多態(tài)的缺點:父類不能訪問子類特有的方法。解決辦法:向下轉(zhuǎn)型。多態(tài)的優(yōu)點:提高了程序的擴展性。具體體現(xiàn):定義方法的時候,使用父類型作為參數(shù),將來在使用的時候,使用具體的子類型參與操作。fun(Animala){...}Catc=newCat();調(diào)用:.fun(c);//等價于Animala=newCat();5.多態(tài)中的轉(zhuǎn)型問題(1)A.向上轉(zhuǎn)型:從子到父,父類引用指向子類對象。Animalani=newDog();B.向下轉(zhuǎn)型:從父到子,父類引用轉(zhuǎn)為子類對象。 注:強制轉(zhuǎn)換可能會發(fā)生ClassCastException類型轉(zhuǎn)換異常(2)在做向下轉(zhuǎn)型之前,要先做判斷if(aniinstanceofDog){Dogdog=(Dog)ani;dog.lookDoor();}instanceof左邊的對象應該是右邊類的父類或同類對象。6.靜態(tài)成員變量:隨著類的加載而加載,隨著程序的消失而消失。以后會學集合、數(shù)組,假如集合、數(shù)組被static修飾了,如果你的這個集合或數(shù)組比較龐大,占用內(nèi)存比較大,那么在程序結(jié)束之前,它始終會占據(jù)著內(nèi)存空間。如果內(nèi)存比較小的話,就會出現(xiàn)內(nèi)存溢出異常。解決的辦法:1.加內(nèi)存;2.不要用static來修飾這種比較占內(nèi)存的集合。final和static關(guān)鍵字1.final(1)final是一個關(guān)鍵字,表示最終的意思。可以用來修飾類、修飾變量、修飾方法。舉例:絕育手術(shù)(2)final修飾類的時候:表明該類是最終類,不能被繼承。(3)final修飾成員變量:表明該變量是常量,不能再次被賦值,只能賦值一次。(4)final修飾方法:表明該方法是最終方法,不能被覆蓋override。2.static(1)static是一個關(guān)鍵字,表示靜態(tài)的意思??梢杂脕硇揎棾蓡T變量和成員方法。(2)static修飾成員的特點:A.被類的所有對象共享。其實也是判斷一個成員是否應該用static修飾的條件。 B.可以通過類名直接訪問。類名.static成員。推薦使用。 C.優(yōu)先于對象存在。優(yōu)先于所有對象加載。 D.隨著類的加載而加載。(它在方法區(qū)中的靜態(tài)區(qū)里)3.使用場景及原因packagecom.mystudy.constants;publicclassConstants{/*放各種常量:地址、網(wǎng)址、硬盤上的地址*/publicstaticfinalStringADDRESS="中國北京";//調(diào)用:Constants.ADDRESS//static修飾:是為了用類名進行訪問,用到常量的時候。//final修飾:不讓外界進行修改//public修飾:可以在別的類中盡心訪問}4.訪問權(quán)限(1)非靜態(tài)的成員方法:A.能訪問靜態(tài)的成員變量 B.能訪問非靜態(tài)的成員變量 C.能訪問靜態(tài)的成員方法 D.能訪問非靜態(tài)的成員方法(2)靜態(tài)的成員方法:A.能訪問靜態(tài)的成員變量 B.能訪問靜態(tài)的成員方法(3)注意事項:靜態(tài)成員方法中不能出現(xiàn)this、super這樣的關(guān)鍵字。愿意你:靜態(tài)是隨著類的加載而加載,this、super這樣的關(guān)鍵字是隨著對象的創(chuàng)建而存在的。(開發(fā)的原則:先進內(nèi)存的東東不能訪問后進內(nèi)存的東東。)抽象類1.在java中,一個沒有方法體的方法應該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類。2.抽象類、抽象方法都必須用abstract修飾。publicabstractvoideat();publicabstractclassAnimal{}3.抽象類的特點:(1)抽象類和抽象方法都必須用abstract來修飾。(2)抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類。(3)抽象類不能實例化,不能直接創(chuàng)建對象,但可以通過多態(tài)來創(chuàng)建對象。抽象類如何實例化呢?參照多態(tài)的方式,通過子類實例化。Animalani=newCat();ani.ea();ani.sleep();(4)抽象類的子類:要么重寫抽象類中的所有抽象方法,要么也是抽象類。4.抽象類的成員特點:成員變量:有成員變量,成員變量可以是變量,也可以是常量。構(gòu)造方法:有構(gòu)造方法。抽象類中構(gòu)造方法的作用是用于子類訪問父類數(shù)據(jù)的初始化。成員方法:有成員方法,成員方法可以是抽象的,也可以是非抽象的。抽象方法:限定子類必須完成某些動作,起到一個規(guī)范和統(tǒng)一的作用。非抽象方法:提高代碼的復用性。5.思維的方式:分析:從具體到抽象實現(xiàn):從抽象到具體使用:使用的是具體的類的對象。舉例:老師、基礎(chǔ)班老師、畢業(yè)班老師接口1.類或抽象類:放一些共性的東西,大家都有的東西,即“你會我也會,你有我也有。”接口:定義的是額外的擴展性的東西,不是每個人都會的。2.接口的特點:(1)定義接口使用的是interface關(guān)鍵字。(2)類和接口之間是實現(xiàn)關(guān)系,用implements關(guān)鍵字。classimplementsinterface(3)接口不可以創(chuàng)建對象,可以使用多態(tài)的形式創(chuàng)建對象。它連構(gòu)造方法都沒有。接口有沒有其他的方式實例化呢?參照多態(tài)的形式使用類來實現(xiàn)實例化。Jumpingj=newCat();j.jump();多態(tài)的幾種形式:A.具體類多態(tài)(幾乎不用)B.抽象類多態(tài)C.接口多態(tài)(最常用)(4)接口的實現(xiàn)類一個類實現(xiàn)一個接口。要么重寫接口中的所有抽象方法,要么這個類就是抽象類。3.接口的成員特點:成員變量:有成員變量,而且只能是常量。有默認的publicstaticfinal修飾符,即是靜態(tài)常量。構(gòu)造方法:沒有構(gòu)造方法成員方法:有成員方法,而且都是抽象的。有默認的publicabstract修飾符,即是抽象方法。4.關(guān)系區(qū)別類與類:繼承關(guān)系。只能單繼承,可以多層繼承。類與接口:實現(xiàn)關(guān)系。可以單實現(xiàn),也可以多實現(xiàn),還可以在繼承一個類的同時實現(xiàn)多個接口。接口與接口:繼承關(guān)系,可以單繼承,也可以多繼承。5.抽象類和接口的區(qū)別(1)成員區(qū)別:抽象類:成員變量:可以是變量,也可以是常量。構(gòu)造方法:有。成員方法:可以是抽象方法,也可以是非抽象方法。接口:成員變量:只能是常量。成員方法:只能是抽象方法。(2)關(guān)系區(qū)別類與類:繼承關(guān)系。只能單繼承,可以多層繼承。類與接口:實現(xiàn)關(guān)系。可以單實現(xiàn),也可以多實現(xiàn),還可以在繼承一個類的同時實現(xiàn)多個接口。接口與接口:繼承關(guān)系,可以單繼承,也可以多繼承。(3)設(shè)計理念的區(qū)別抽象類:被繼承,體現(xiàn)的是isa。抽象類中定義的是繼承體系的共性功能。接口:被實現(xiàn),體現(xiàn)的是likea。抽象中定義的是該體系的擴展功能。四種權(quán)限修飾符1.本類2.同一個包下(子類和無關(guān)類)3.不同包下(子類和無關(guān)類)3.1子類3.2無關(guān)類private1.Y默認(friendly)1.Y2.Yprotected1.Y2.Y3.1Ypublic1.Y2.y3.1Y3.2Yequals方法1.功能:比較兩個對象是否相等。如果沒有重寫的話,比較的是兩個對象的地址值。重寫后,可以比較兩個對象的屬性值。2.==:(1)可以比較基本數(shù)據(jù)類型,比較基本數(shù)據(jù)類型的時候,比較的是基本數(shù)據(jù)類型的值是否相同。(2)可以比較引用數(shù)據(jù)類型,比較引用數(shù)據(jù)類型的時候,比較的是引用數(shù)據(jù)類型的地址是否相同。3.如果想比較引用對象的內(nèi)容是否相同,重寫publicbooleanequals(Objectobj){...}4.s1.equals(s2);//this=s1,哪個對象調(diào)用的equals,this就是誰。obj=s2,被調(diào)用時的參數(shù)是哪個對象,obj就是誰。5.重寫equals方法業(yè)務流程:(1)地址值(2)對象是否為空null(3)是否是同一個類的對象(4)obj向下轉(zhuǎn)型,開始比較各個屬性值。(5)比較基本數(shù)據(jù)類型(6)比較引用數(shù)據(jù)類型:a.對象是否為null。b.值。具體代碼:publicbooleanequals(Objectobj){//調(diào)用:cat.equals(cat2);//this:cat//obj:cat2if(this==obj)returntrue;//比較cat和cat2的地址是否相同。如果相同,說明它們是同一個對象,肯定相同。if(obj==null)returnfalse;//看cat2是否為null。cat肯定不為null。如果cat為null,會報NullPointerException,根本走不到這個方法里。if(getClass()!=obj.getClass())returnfalse;//看兩個對象cat和cat2是不是同一個類的對象。如果不是同一個類的對象,說明不是同一個物種,直接returnfalse,沒有比較的必要。Catother=(cat)obj;//把obj向下轉(zhuǎn)型,為什么呢?因為下面要比較cat和cat2的屬性值。如果不向下轉(zhuǎn)型,還是obj的話,是不能獲取cat2的屬性值的。if(age!=other.age)returnfalse;//由于age屬性是基本數(shù)據(jù)類型,可以直接用關(guān)系運算符比較。if(name==null){//看cat/this的name屬性是否為null。這里為什么要判斷name是否為null呢?如果name為null,兩邊比較name的屬性值的時候,會報NullPointerException。if(!=null)returnfalse;//如果為null,但是不為null,說明它們不相同,直接返回false。}elseif(!name.equals())returnfalse;//比較和的值是否相同,如果不同,直接返回false。returntrue;}//theendString類1.String:代表字符串類。字符串是由多個字符組成的一串數(shù)組。字符串的本質(zhì)就是一個字符數(shù)組。2.構(gòu)造方法String(Stringoriginal):把字符串數(shù)據(jù)封裝成字符串對象。Strings=newString("Hello");String(char[]value):把字符數(shù)組的數(shù)據(jù)封裝成字符串對象。char[]chs={'H','E','L','L','O'};Strings=newString(chs);String(char[]value,intindex,intcount):把字符數(shù)組的一部分數(shù)據(jù)封裝成字符串對象。Strings=newString(chs,1,2);3.最常用的方式-直接賦值:Strings="hello";4.String類創(chuàng)建對象的特點(1)通過構(gòu)造方法創(chuàng)建對象。通過構(gòu)造方法創(chuàng)建的字符串對象是在堆內(nèi)存中。(2)通過直接賦值的方式創(chuàng)建對象。通過直接賦值的方式創(chuàng)建的字符串對象,是在方法區(qū)的常量池中。(推薦用這個方式)字符串的內(nèi)容存儲在方法區(qū)的常量池。這樣做事為了方便字符串數(shù)據(jù)的復用。Strings1=newString("hello");Strings2=newString("hello");Strings3="hello";Strings4="hello";System.out.println(s1==s2);//falseSystem.out.println(s1==s3);//falseSystem.out.println(s3==s4);//true代碼1.遍歷字符串,即獲取字符串中的每一個字符Strings="16JKM13";for(inti=0;i<s.length();i++){charch=s.charAt(i);//獲取字符串s中的某個索引位置的字符串元素if(ch>='0'&&ch<='9'){//判斷字符是不是數(shù)字System.out.println(ch);//比較的是ASCII碼值}}//ch>='A'&&ch<='Z'大寫字母//ch>='a'&&ch<='z'大寫字母//ch-=('a'-'A');從小寫字母變成大寫字母'a'-'A'=32,'A'=65,'a'=972.字符串的拼接int[]arr={11,22,3,4,5};Strings="[";for(inti=0;i<arr.length;i++){if(i==arr.length-1){s+=arr[i];}else{s+=arr[i]+",";}}s+="]";System.out.println(s);//字符串拼接s+=...因為Stringconcat方法重載overload了3.字符串反轉(zhuǎn)abc-->cbaStrings="abc";Strings_new="";//空串for(inti=s.length-1;i>=0;i--){charch=s.charAt(i);s_new+=ch;}System.out.println(s_new);StringBuilder1.StringBuilder:是一個可變的字符串類,內(nèi)容是可變的,非常適合做字符串拼接操作。String:內(nèi)容是固定的,字符串都是常量。2.構(gòu)造方法publicStringBuilder();//創(chuàng)建一個空的字符串publicStringBuilder(Stringstr);//把str這個字符串轉(zhuǎn)成了StringBuilder對象3.一些功能(1)添加功能:publicStringBuilderappend(任意類型);//添加數(shù)據(jù),并返回對象本身鏈式編程:sb.append("hello").append("world");//反著看,這是一個方法,方法由對象調(diào)用;正著看,對象調(diào)方法,返回的是一個對象。(2)反轉(zhuǎn)功能:publicStringBuilderreverse();(3)刪除功能:publicStringBuilderdelete(intstart,intend);//移除此序列的子字符串中的字符4.StringBuilder和String的相互轉(zhuǎn)換StringBuilder-->String:publicStringtoString();//通過toString()就可以把StringBuilder轉(zhuǎn)換為StringString-->StringBuilder:publicStringBuilder(Strings);//通過構(gòu)造方法就可以把String轉(zhuǎn)換為StringBuilder5.練習:字符串反轉(zhuǎn)思路:String-->StringBuilder-->reverse-->StringScannersc=newScanner(System.in);Strings=sc.nextLine();StringBuildersb=newStringBuilder(s);sb.reverse();Strings2=sb.toString();StringBuffer和StringBuilder:StringBuilder:線程不安全,效率高。StringBuffer:線程安全,效率低一些。====字符串的一些常用方法----字符串方法需要接收返回結(jié)果。publiccharcharAt(intindex);//返回字符串中某個索引位置的字符元素publicbooleanendWith(Stringsmall);//判斷字符串是否已小字符結(jié)尾publicbooleanequals(ObjectanObject);//判斷兩個字符串是否相等publicbooleanequalsIgnoreCase(StringanotherString);//判斷兩個字符串是否相等,忽略大小寫publicintindexOf(intch);//獲取字符或小字符串在大字符串中的位置,不存在的話返回-1publicintlength();//返回字符中元素的個數(shù),字符串的長度publicStringreplace(CharSequencesmall,CharSequencereplace);//把大字符串中的小字符串替換成replace,替換所有例如:Strings="11,22,33,44";Stringreplace=s.replace(",","-");System.out.println(replace);//11-22-33-44publicStringreplaceFirst(Stringsmall,Stringreplace);//把大字符串中的小字符串替換成replace,只替換第一次出現(xiàn)的例如:Strings="11,22,33,44";Stringreplace=s.replaceFirst(",","-");System.out.println(replace);//11-22,33,44publicString[]split(Stringsmall);//用小字符串切割大字符串例如:Strings="11,22,33,44";String[]split=s.split(",");for(inti=0;i<split.length;i++){System.out.println(split[i]);}publicbooleanstartsWith(Stringprefix);//判斷大字符串是否以小字符串開頭publicStringsubString(intbeginIndex);//截取字符串,從索引beginIndex開始,截取到最后例如:Strings="abcdefg";StringsubString=s.subString(3);System.out.println(subString);//defgpublicStringsubString(intbeginIndex,intendIndex);//截取字符串,從beginIndex開始,到endIndex結(jié)束,包含beginIndex,不包含endIndex例如:Strings="abcedfg";StringsubString=s.subString(1,4);System.out.println(subString);//bcdpublicchar[]toCharArray();//把字符串編程字符數(shù)組例如:Strings="abcdefg";char[]chs=s.toCharArray();for(inti=0;i<chs.length;i++){System.out.println(chs[i]);}publicStringtoLowerCase();//把字符串中的大寫字母變成小寫字母例如:Strings="dfkdjALSJDLJF";s=s.toLowerCase();System.out.println(s);publicStringtoUpperCase();//把字符串中的小寫字母變成大寫字母例如:Strings="dfkdjALSJDLJF";s=s.toUpperCase();System.out.println(s);publicstaticStringvalueOf(booleanb);//把各種類型的數(shù)據(jù)轉(zhuǎn)成字符串例如:StringvalueOf=String.valueOf(234);System.out.println(valueOf);//234====Arrays類----1.Arrays類提供了對數(shù)組操作的各種方法2.常用方法publicstaticStringtoString(int[]arr);//把數(shù)組轉(zhuǎn)換成字符串publicstaticvoidsort(int[]arr);//對數(shù)組進行升序排序3.Arrays的構(gòu)造方法是私有的。私有構(gòu)造方法是為了不讓外界使用創(chuàng)建對象。成員都用static修飾,可以用類名直接訪問。4.常用工具類的設(shè)計思想:(1)構(gòu)造方法私有。(2)成員都用static修飾。Math.pow(base,n);//base的n次冪數(shù)學工具類Collections:關(guān)系集合的一些操作方法====基本類型的包裝類----1.為了對基本數(shù)據(jù)類型進行更多更方便的操作,java為每一種基本數(shù)據(jù)類型提供了一個對應的引用類型?;緮?shù)據(jù)類型的包裝類最常用的做法,就是做基本數(shù)據(jù)類型和字符串的相互轉(zhuǎn)換。基本類型包裝類byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBooleanString-->char:Strings="a";charc=s.charAt(0);2.Integer類構(gòu)造方法:Integer(intvalue);Integer(Strings);//s必須是數(shù)字字符串組成的,否則拋NumberFormatException直接調(diào)用對象時,調(diào)用的是對象的toString()方法。toString()方法不重寫,輸出的是地址值。把一個數(shù)字字符串轉(zhuǎn)成一個包裝類型,字符串里只能包含數(shù)字字符。3.int與String類型的相互轉(zhuǎn)換Integer類的publicintintValue();//ReturnsthevalueofthisIntegerasanint.Integer類的publicstaticIntegervalueOf(Strings);//ReturnsanIntegerobjectholdingthevalueofthespecifiedString.Integer類的publicstaticIntegervalueOf(inti);//ReturnsanIntegerinstancerepresentingthespecifiedintvalue.Integer類的publicstaticStringtoString(inti);//ReturnsaStringobjectrepresentingthespecifiedinteger.Integer類的publicstaticintparseInt(Strings);//Parsesthestringargumentasasigneddecimalinteger.String類的publicstaticStringvalueOf(inti);//Returnsthestringrepresentationoftheintargument.int-->String:方法一:intnumber=100;Strings1=""+number;//比較方便,但不專業(yè)方法二:Strings2=String.valueOf(number);String-->int:方法一:String-->Integer-->intStrings="100";Integeri=newInteger(s);intx=Value();方法二:inty=Integer.parseInt(s);總結(jié):int-->String:String::publicstaticStringvalueOf(inti);String-->int:Integer::publicstaticintparseInt(Strings);4.練習題:把字符串排序"9127463850"-->"2738465091"分析:(1)定義一個字符串對象。(2)把字符串中的數(shù)字數(shù)據(jù)存儲到一個int型的數(shù)組中。A.字符串拆分成字符串數(shù)組String::publicString[]split(Stringregex);B.字符串數(shù)組轉(zhuǎn)成整型數(shù)組Integer::publicstaticparseInt(Strings);(3)對int數(shù)組進行排序Arrays::publicstaticvoidsort(int[]arr);對指定的int型數(shù)組按數(shù)字升序進行排序(4)把排序后的數(shù)組中的元素進行拼接,得到一個字符串。StringBuilder-->String:StringBuilder.append(Strings);StringBuilder.toString();代碼:importjava.util.Arrays;Strings="9127463850";String[]sArr=s.split("");int[]numArr=newint[sArr.length];for(inti=0;i<numArr.length;i++){numArr[i]=Integer.parseInt(sArr[i]);}Arrays.sort(numArr);StringBuildersb=newStringBuilder();for(inti=0;i<numArr.length;i++){if(i==numArr.length-1)sb.append(numArr[i]);else{sb.append(numArr[i]).append("");}}Strings2=sb.toString();System.out.println(s2);5.自動裝箱和拆箱JDK5提供的(1)自動裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)換為對應的包裝類類型。Integer::publicstaticIntegervalueOf(inti);//ReturnsanIntegerinstancerepresentingthespecifiedintvalue.(2)自動拆箱:把包裝類類型轉(zhuǎn)換為對應的基本數(shù)據(jù)類型。Integer::publicintintValue();//ReturnsthevalueofthisIntegerasanint.Integeri=100;//自動裝箱,這行代碼等價于:Integeri=Integer.valueOf(100);i+=200;//i=i+200;自動拆箱,然后自動裝箱。這行代碼等價于:i=Integer.valueOf(Value()+200);Integeri3=null;i3+=300;//NullPointerException在使用包裝類類型的新特性的時候,如果做操作,最好先判斷是否是null。開發(fā)中的原則:只要是對象,在使用前就必須進行不為null的判斷。====Date類和SimpleDateFormat----1.Date類:表示特定的瞬間,精確到毫秒所屬的包:importjava.util.Date;構(gòu)造方法:Date();//根據(jù)當前時間創(chuàng)建的日期對象Date(longdate);//從1970-01-0100:00:00開始計算的時間,毫秒longdate=1000(毫秒)*60(分鐘)*60(小時),即1小時,因為是東八區(qū),最后給出的是9點。用long類型是因為int類型會出現(xiàn)溢出。longtime=(long)1000*60*60*24*30,即一個月Dated=newDate(time);//1970-01-3108:00:002.Date對象<-->毫秒值從Date對象得到一個毫秒值:publiclonggetTime();//獲取的是毫秒值,從1970-01-0100:00:00開始從一個毫秒值得到一個Date對象:方法一:publicvoidsetTime(longtime);//設(shè)置時間,給的是毫秒值方法二:構(gòu)造方法Date(longtime);3.SimpleDateFormat所屬的包:java.text.SimpleDateFormat功能:格式化和解析日期的具體類格式化日期-->文本,Date-->String:publicfinalStringformat(Datedate);解析文本-->日期,String-->Date:publicDateparse(Stringsource);//可能會有java.text.ParseException代碼://Date-->StringDated=newDate();SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");Strings=sdf.format(d);System.out.println(s);//2019年07月10日15:37:59可以自己定義pattern,比如:HH:mm:ssyyyy-MM-ddHH:mm:ssEEE(EEE表示星期幾)因為Date對象在創(chuàng)立時,已經(jīng)給每個字符設(shè)置了屬性//String-->Date把一個字符串解析為日期的時候,要注意模式字符串和給定的日期字符串的格式要匹配Stringstr="2080-08-0812:23:45";SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Dated=sdf.parse(str);//throwsParseExceptionSystem.out.println(d);//ThuAug0812:23:45CST20804.寫Date工具類DateUtil把日期轉(zhuǎn)換為指定格式的字符串把指定格式的字符串解析為日期importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassDateUtil{privateDateUtil(){}publicstaticStringdateToString(Datedate,Stringpattern){SimpleDateFormatsdf=newSimpleDateFormat(pattern);Strings=sdf.format(date);returns;}publicstaticDateStringToDate(Stringdata,Stringpattern)throwsParseException{SimpleDateFormatsdf=newSimpleDateFormat(pattern);Dated=sdf.parse(data);returnd;}}5.Calendar日歷類所在包:java.util.CalendarCalendarcal=Calendar.getInstance();//創(chuàng)建Calendar的對象,表示的是當前時間intyear=cal.get(Calendar.YEAR);intmonth=cal.get(Calendar.MONTH)+1;//第一個月是0,第二個月是1intday=cal.get(Calendar.DAY_OF_MONTH);intweek=cal.get(Calendar.DAY_OF_WEEK)-1;//星期日是1,星期一是2cal.set(Calendar.YEAR,2018);//設(shè)置年intyear2=cal.get(Calendar.YEAR);//獲取年//Calendar的轉(zhuǎn)換功能Datedate=newDate(1000);cal.setTime(date);//可以把date表示的時間設(shè)置給cal,Date-->CalendarDatetime=cal.getTime();//用cal的獲取時間的方法可以獲取到date對象,Calendar-->Date====對象也可以比較大小----如果想比較兩個對象的大小,可以通過實現(xiàn)Comparable接口,重寫compareTo方法。接口,比較器:java.lang.Comparable方法:publicintcompareTo(To);調(diào)用方法:inti=pareTo(stu2);//this:stu1;o:stu2如果大于,用1表示;如果小于,用-1表示;如果相等,用0表示。類聲明:publicclassStudentimplementsComparable<Student>{@OverridepublicintcompareTo(Studento){if(this.getAge()>o.getAge()){return1;}//大于elseif(this.getAge()<o.getAge()){return-1;}//小于else{return0;}//相等}}====集合----一、集合的體系結(jié)構(gòu):見截圖二、Collection集合的基礎(chǔ)知識1.所在包:java.util.Collection2.publicinterfaceCollection<E>extendsIterable<E>3.Collection是單列集合的頂層接口。它表示一組對象,這些對象也稱為Collection的元素JDK不提供此接口的任何直接實現(xiàn)。創(chuàng)建Collection集合對象采用的是多態(tài)的方式。4.<E>是一種特殊的數(shù)據(jù)類型,泛型使用:在出現(xiàn)E的地方使用引用數(shù)據(jù)類型替換即可,如Collection<String>importjava.util.ArrayList;Collection<String>c=newArrayList<>();//JDK7的新特性Collection<String>c=newArrayList<String>();//多態(tài)形式,推薦//booleanadd(Ee);添加元素c.add("Hello");c.add("World");5.輸出集合元素System.out.println(c);ArrayList重寫了toString()方法6.集合中不能存放基本數(shù)據(jù)類型,如果想放基本數(shù)據(jù),就用它對應的包裝類Collection<Integer>coll2=newArrayList<>();三、Collection的成員方法1.booleanadd(Ee);//添加元素booleanadd(intindex,Ee);//在指定位置添加元素通過查看源代碼,我們知道ArrayList集合的add方法返回值永遠都是true。2.booleanremove(Objecto);//根據(jù)對象從集合中刪除元素booleanremove(intindex);//根據(jù)索引從集合中刪除元素3.voidclear();//清除集合中的元素4.booleancontains(Objecto);//判斷集合中是否存在指定的元素5.booleanisEmpty();//判斷集合是否為空,空true,非空size();//集合的長度,也就是集合中的元素個數(shù)四、Collection集合的遍歷1.沒有索引,不能用普通for2.所在的包:java.util.Iterator3.Iterator<E>iterator();//返回此Collection的元素上進行迭代的迭代器Iterator<String>it=c.iterator();//返回的是迭代器接口的實現(xiàn)類的對象通過集合對象調(diào)用iterator()方法,得到迭代器對象。4.IteratorEnext();//返回迭代的下一個對象,獲取到下一個元素,并一道下一個,等待NoSuchElementException:沒有這樣的元素異常IteratorbooleanhasNext();//如果仍有元素可以迭代,則返回truewhile(it.hasNext()){Strings=xt();System.out.println(s);}5.代碼importjava.util.Collection;importjava.util.ArrayList;importjava.util.Iterator;Collection<String>c=newArrayList<String>();//創(chuàng)建集合對象c.add("小靜");//給集合中添加字符串元素c.add("大熊");c.add("康夫");Iterator<String>it=c.iterator();//通過集合對象獲取到迭代器對象while(it.hasNext()){//使用迭代器對象的方法獲取數(shù)據(jù)Strings=it.next();//在一次循環(huán)體中,只能調(diào)用一次it.next()System.out.println(s);}6.迭代器是集合遍歷的一種方式,依賴于集合而存在。五、集合的使用步驟1.創(chuàng)建集合對象2.創(chuàng)建元素對象3.把元素添加到集合4.遍歷集合(1)通過集合對象獲取迭代器對象(2)通過迭代器對象的hasNext()方法判斷是否有元素(3)通過迭代器對象的next()方法獲取元素,并指向下一個位置====List集合----1.所屬包名:java.util.List2.List有索引,可以用普通for循環(huán)。(沒有索引,就不可以用普通for循環(huán)。)3.List是有序的Collection,也稱為序列。4.List集合的特點:(1)有序(存儲和取出元素的順序一致)(2)存儲的元素可重復5.代碼importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;List<String>list=newArrayList<String>();list.add("hello");//...Iterator<String>it=list.iterator();while(it.hasNext()){Strings=it.next();System.out.println(s);}6.List集合特有的成員方法(完全是針對索引操作的)voidadd(intindex,Eelement);//在指定位置添加元素,后面的元素往后移Eremove(intindex);//刪除指定位置的元素,返回被刪除的元素Eget(intindex);//獲取指定位置的元素Eset(intindex,Eelement);//修改指定位置的元素,返回被修改的元素7.List集合的普通for遍歷(1)迭代器(2)普通for循環(huán)intsize()for(inti=0;i<list.size();i++){System.out.println(list.get(i));}8.List列表迭代器的特有功能ListIterator<E>listIterator();//返回此列表元素的列表迭代器,允許程序員按任意方向遍歷列表。正向遍歷方式與Iterator相同。publicinterfaceListIterator<E>extendsIterator<E>;ListIterator<String>list=list.listIterator();特有功能:Eprevious();//返回列表中的前一個元素booleanhasPrevious();//如果以逆向遍歷列表,列表迭代器有多個元素,則返回true注意事項:ListIterator可以實現(xiàn)逆向遍歷,但是要求先正向遍歷,才能逆向遍歷。9.ConcurrentModificationException并發(fā)修改異常的原因及解決方案產(chǎn)生的原因:迭代器依賴于集合而存在,在判斷成功后,集合中添加了新元素,而迭代器并不知道,所以就報錯了。即迭代器遍歷集合中的元素的時候,不要使用集合對象去修改集合中的元素。解決方案:方案一:用列表迭代器時,迭代器遍歷的時候,用迭代器修改集合中的元素。元素是跟在剛才迭代的元素后面的。方案二:用普通for循環(huán)時,集合遍歷的時候,可以通過集合對象修改集合中的元素。元素是在最后添加的。(推薦此方案)方案一的代碼:ListIterator<Student>it=list.listIterator();while(it.hasNext){Studentstu=it.next();if(stu.equals(stu2)){it.add(stu4);//用迭代器添加}}方案二的代碼:for(inti=0;i<list.size();i++){Studentstu=list.get(i);if(stu.equals(stu2)){list.add(stu4);//用集合添加}}10.正向刪除時,要調(diào)整i,i--逆向刪除時,不用調(diào)整i正向刪除的代碼:for(inti=0;i<list.size();i++){if(list.get(i).equals("5")){list.remove(i);i--;}}逆向刪除的代碼:for(inti=list.size();i>=0;i--){if(list.get(i).equals("5")){list.remove(i);}}11.增強for:是for循環(huán)的一種格式:for(元素的數(shù)據(jù)類型變量名:數(shù)組名或者Collection集合對象名){使用變量名即可,這個變量名代表的就是數(shù)組或者Collection集合中的元素}例如:for(intx:arr){System.out.println(x);}好處:簡化了數(shù)組和Collection集合的遍歷弊端:目標不能為null在遍歷前,對目標做不為null的判斷:if(list!=null){for(...:list){...}}增強for其實就是用來替代迭代器的。用哪種循環(huán)?只想打印集合時,用增強for;如果有增刪集合時,用普通for。====常見的數(shù)據(jù)結(jié)構(gòu)----1.棧:先進后出。例如子彈夾2.隊列:先進先出。例如:排毒買票3.數(shù)組:存儲同一個數(shù)據(jù)類型的多個元素的容器,有索引,方便我們獲取元素。特點:查詢快,增刪慢。在數(shù)組中添加一個元素的步驟:(1)定義一個新數(shù)組,長度是以前的數(shù)組的長度+1(2)遍歷以前的數(shù)組,得到每一個元素(3)數(shù)前面的:按照以前的索引存儲到新數(shù)組中。數(shù)本身:繼續(xù)存儲。數(shù)后面的:添加那個新元素,然后把索引+1存儲到新數(shù)組中。從數(shù)組中刪除一個元素的步驟:(1)定義一個新數(shù)組,長度是以前的數(shù)組的長度-1(2)遍歷以前的數(shù)組,得到每一個元素。數(shù)前面的:按照以前的索引存儲到新數(shù)組中。數(shù)本身:不存儲。數(shù)后面的:把索引-1存儲到新數(shù)組中。4.鏈表:由一個鏈子把多個節(jié)點連接起來的數(shù)據(jù)。節(jié)點:由數(shù)據(jù)和地址組成。特點:查詢慢,增刪快。獲取鏈表中的元素:從頭開始在鏈表中插入一個元素的步驟(最好自己畫一個圖):(1)新元素應該也是一個節(jié)點(2)把數(shù)本身的下一個元素地址用tmp存儲。(3)把新元素的地址付給數(shù)本身的下一個元素地址處(4)把tmp的值賦給新元素的下一個元素地址處從鏈表中刪除一個元素的步驟(最好自己畫一個圖):(1)把數(shù)本身的下一個元素地址用tmp存儲(2)把tmp的值賦給數(shù)本身的前一個元素的下一個元素地址處。底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu),用ArrayList,查詢快,增刪慢。底層數(shù)據(jù)結(jié)構(gòu)是鏈表結(jié)構(gòu),用LinkedList,查詢慢,增刪快。如果數(shù)據(jù)查詢多,就選ArrayList。如果數(shù)據(jù)增刪多,就選LinkedList。不知道時,選ArrayList,因為數(shù)據(jù)量少。LinkedList的使用與ArrayList的相似。====集合的工具類Collections----所屬包:java.util.CollectionsArrayList<Integer>list=newArrayList<Integer>();Collections.sort(list);//按正向排序Collections.reverse(list);//反轉(zhuǎn)Collections.sort(list,Collections.reverseOrder());//倒序Collection與Collections的區(qū)別:Collection是單列集合的頂層接口。Collections是集合的工具類。====Set----Set:無序、唯一、元素不可重復,使用方式與Collection一致在java.util包中,是一個接口,繼承了Collection1.不包含重復元素:HashSet不保證Set的迭代順序,特別是它不保證該順序恒久不變2.什么時候使用?(1)要對List集合進行去重。(2)要求生成不重復的元素。例子:在[1,10]生成10個不重復的數(shù)字。代碼:importjava.util.HashSet;importjava.util.Random;HashSet<Integer>set=newHashSet<Integer>();Randomrd=newRandom();while(set.size()<10){intnum=rd.nextInt(10)+1;//如果生成了相同的元素,這里是添加不了的。//只要添加不了,size是不會變的。set.add(num);}3.HashSet保證元素唯一性的原理:通過查看add方法的源代碼,我們知道了天價功能的執(zhí)行過程中,是進行了數(shù)據(jù)的判斷的,這個判斷的流程是:首先比較對象的哈希值是否相同。這個哈希值是根據(jù)對象的hashCode()計算出來的。如果哈希值不同,就直接添加到集合中。如果哈希值相同,繼續(xù)執(zhí)行equals()進行比較。返回的是true,說明元素重復,不添加。返回的是false,說明元素不重復,就添加。如果我們使用HashSet集合存儲對象,你要想保證元素的唯一性,就必須重寫(override)hashCode()和equals()方法。注:是元素重寫hashCode()和equals()方法。代碼:importjava.util.HashSet;//創(chuàng)建集合對象HashSet<String>hs=newHashSet<String>();//添加元素hs.add("Hello");//add調(diào)用的是Map.put()方法hs.add("world");//遍歷集合for(Strings:hs){System.out.println(s);}Map::publicVput(Kkey,Vvalue){if(table==EMPTY_TABLE){inflateTable(threshold);}if(key==null

溫馨提示

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

評論

0/150

提交評論