1? ? ? 數(shù)組No11
數(shù)組:存放一組相同類型數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
數(shù)組本身是引用數(shù)據(jù)類型勇凭,數(shù)組中的元素可以是基本數(shù)據(jù)類型露懒,也可以是引用數(shù)據(jù)類型
【
Java中的數(shù)組以對(duì)象的形式存在极谊,或者說數(shù)組本身是引用數(shù)據(jù)類型吐限,數(shù)組中的元素(數(shù)組中的每一個(gè)數(shù)據(jù))類型可以是基本數(shù)據(jù)類型澡为,也可以是引用數(shù)據(jù)類型
】
如何使用:
1.聲明:
元素類型[]引用名;或(引用聲明熬尺,并未產(chǎn)生數(shù)組摸屠,等價(jià))
元素類型引用名[];
元素類型變量名[10];不合法,不能在聲明時(shí)指定數(shù)組長(zhǎng)度
(因?yàn)橐弥兄皇谴娣帕藢?duì)象的首地址粱哼,不可能存放長(zhǎng)度信息)
2.創(chuàng)建:
數(shù)組的動(dòng)態(tài)初始化:
new元素類型[數(shù)組長(zhǎng)度];(創(chuàng)建數(shù)組對(duì)象時(shí)會(huì)為每個(gè)元素開辟空間季二,并且賦以初值,
int 0,double 0.0,? float0.0F,??? short? 0 ,??long? 0L??? Boolean false,
char 0,引用類型null)
(2)數(shù)組的靜態(tài)初始化胯舷,聲明刻蚯、創(chuàng)建、初始化在一句語句中完成
元素類型【】引用名= {值1,值2,值3………值n}桑嘶;
這種方式同時(shí)完成創(chuàng)建和初始化炊汹,創(chuàng)建的數(shù)組的長(zhǎng)度就是大括號(hào)中的值得個(gè)數(shù),
每一個(gè)值之間用逗號(hào)逃顶,分隔讨便,每個(gè)元素的值就是大括號(hào)中的值
《注意:靜態(tài)初始化聲明必須和初始化寫在一句語句中,否則會(huì)出錯(cuò)以政∑髦樱》
創(chuàng)建指定長(zhǎng)度,指定元素類型的數(shù)組妙蔗,創(chuàng)建好了的數(shù)組長(zhǎng)度不能改變傲霸,可通過數(shù)組對(duì)象的length屬性來獲得長(zhǎng)度,這種方式創(chuàng)建的數(shù)組眉反,其中的元素的值為默認(rèn)值(如:int為0昙啄,double為0.0,引用類型為null)
數(shù)組的靜態(tài)初始化:
元素類型[] 引用={元素1,元素2,元素3...};
雖然沒有new關(guān)鍵字,但是創(chuàng)建了一個(gè)數(shù)組對(duì)象寸五;創(chuàng)建后自動(dòng)初始化為{}中的值梳凛;數(shù)組長(zhǎng)度為大括號(hào)內(nèi)元素的個(gè)數(shù)
元素為引用數(shù)據(jù)類型的數(shù)組每個(gè)元素都是引用
3.訪問:
數(shù)組引用名[數(shù)字下標(biāo)](下標(biāo)范圍從0到length-1,超出范圍梳杏,會(huì)報(bào)越界異常<會(huì)報(bào)數(shù)組指針越界異常:java.lang.ArrayIndexOutOfBoundsException>)
可以通過這種方式訪問打印韧拒,也可以進(jìn)行對(duì)元素的初始化
訪問數(shù)組可以對(duì)元素進(jìn)行賦值:數(shù)組引用名【數(shù)組下標(biāo)】=元素值
數(shù)組的訪問和賦值可以用到循環(huán)賦值
數(shù)組的長(zhǎng)度可以用其length屬性來動(dòng)態(tài)獲得
數(shù)組的長(zhǎng)度在數(shù)組創(chuàng)建后不能更改,如果實(shí)在需要一個(gè)長(zhǎng)度不同的數(shù)組十性,
只能再創(chuàng)建一個(gè)
排序(升序:隨著下標(biāo)增加叛溢,元素越來越大;降序劲适,越來越锌簟):
1.冒泡排序
(排序,將原來沒有順序的雜亂數(shù)組霞势,變成從小到大(升序)或從大到小(降序)的順序烹植。)
《升序:將相鄰的元素進(jìn)行比較,如果左邊的大愕贡,則將它們互換位置草雕,如此不斷循環(huán)向右判斷,直到最大的數(shù)字冒到最右邊固以《蘸纾》
2.??????選擇排序
3.??????插入排序
【實(shí)際開發(fā)中,使用Arrays.sort(…..)進(jìn)行排序】
查找:告訴你某個(gè)值,在數(shù)組中查找出這個(gè)值對(duì)應(yīng)的下標(biāo)
查找:在數(shù)組中根據(jù)值查找元素败晴,返回找到的元素的下標(biāo)浓冒,如果一個(gè)都不符合返回-1.
1、順序查找
從頭到尾遍歷數(shù)組尖坤,如果符合這個(gè)值就返回下標(biāo)稳懒,如果一個(gè)都不符合返回-1.
2、二分法查找(必須是排過序的數(shù)據(jù))
找到數(shù)組中間位置的元素和目標(biāo)值比較慢味,如果目標(biāo)值大场梆,就扔掉小的那就扔掉小的那一半數(shù)據(jù)(中間位置左邊的),如果目標(biāo)值小纯路,就扔掉大的那一半(中間位置右邊的)或油;接下來對(duì)以上操作進(jìn)行循環(huán)執(zhí)行,直到中間位置元素等于目標(biāo)值驰唬,就將其下標(biāo)返回顶岸。
【】可變長(zhǎng)數(shù)組
元素類型………引用名
《表示在方法的形參中聲明一個(gè)可變長(zhǎng)的數(shù)組,實(shí)參是用逗號(hào)隔開的一個(gè)單個(gè)元素(元素類型是形參數(shù)組的元素類型叫编,)辖佣,而是這個(gè)可變長(zhǎng)數(shù)組形參使用時(shí)還是將其當(dāng)作數(shù)組用》
【
main方法的參數(shù)
在應(yīng)用程序啟動(dòng)時(shí)可以傳入?yún)?shù),這些參數(shù)會(huì)自動(dòng)轉(zhuǎn)換為字符串?dāng)?shù)組搓逾,
我們可以在main方法中通過main方法的形參數(shù)組訪問這些參數(shù)
】
數(shù)組的拷貝
【用=號(hào)進(jìn)行數(shù)組拷貝并不是真正的拷貝卷谈,只是將兩個(gè)引用指向同一個(gè)對(duì)象
】
二維數(shù)組:數(shù)組中的元素也是數(shù)組
1.聲明:
元素類型[][] 引用名; 或
元素類型 引用名[][];
在聲明時(shí)不能在中括號(hào)中指定長(zhǎng)度
2.初始化:
①靜態(tài)初始化:
元素類型[][]引用名={{元素1,元素2霞篡,元素3...},{...},{...}...};
(每個(gè)子數(shù)組的元素可以各不一樣)
靜態(tài)初始化必須和聲明在同一語句中
②動(dòng)態(tài)初始化:
(1)new元素類型[長(zhǎng)度1][長(zhǎng)度2];
【長(zhǎng)度1:表示這個(gè)二維數(shù)組中有幾個(gè)子數(shù)組
長(zhǎng)度2:表示每個(gè)子數(shù)組中有幾個(gè)元素(這樣的話每個(gè)子數(shù)組長(zhǎng)度一樣)
(這樣初始化出的每個(gè)元素的值為類型對(duì)應(yīng)的默認(rèn)值)】
【
New元素類型[長(zhǎng)度1][]
長(zhǎng)度1表示
長(zhǎng)度2沒有寫世蔗,表示這幾個(gè)子數(shù)組并未創(chuàng)建出來
】
(注意:不能寫成new[] [2])
二維數(shù)組的拷貝:
【
System.arraycopy是淺克隆,淺拷貝
深度克隆朗兵、深拷貝:將數(shù)組中的每個(gè)元素進(jìn)行逐一拷貝污淋。
】
長(zhǎng)度1表示子數(shù)組個(gè)數(shù),可以簡(jiǎn)單認(rèn)為是行數(shù)矛市,長(zhǎng)度2表示每個(gè)子數(shù)組的長(zhǎng)度芙沥,可以簡(jiǎn)單認(rèn)為是列數(shù)——————用這種方式初始化每個(gè)子數(shù)組的長(zhǎng)度都一樣
(2)new 元素類型[長(zhǎng)度1][]
長(zhǎng)度1表示子數(shù)組個(gè)數(shù),或者行數(shù)浊吏;長(zhǎng)度2不寫(不能只寫長(zhǎng)度2,不寫長(zhǎng)度1)
必須要手動(dòng)創(chuàng)建各個(gè)子數(shù)組對(duì)象救氯,并將各元素引用分別指向它們
每個(gè)子數(shù)組的長(zhǎng)度可以不一樣
3.訪問:
引用名[下標(biāo)1][下標(biāo)2]表示二維數(shù)組的下標(biāo)1的子數(shù)組的下標(biāo)2的元素找田,如arr[0][1]就是第一個(gè)子數(shù)組的第二個(gè)元素
引用名[下標(biāo)1]表示二維數(shù)組的下標(biāo)為1的元素、子數(shù)組的對(duì)象
可以通過循環(huán)訪問二維數(shù)組中的所有元素
Throwale(是Java中所有的異常着憨、錯(cuò)誤的父類墩衙,直接子類有:Error、Exception)
異常Exception(廣義、體系)
Throwable可拋的漆改,是所有異常和錯(cuò)誤的父類
Error嚴(yán)重的問題心铃,不需要程序去處理(錯(cuò)誤)
Exception(狹義)是Throwable的子類,我們的應(yīng)用程序需要去處理可能需要程序去處理
RuntimeException運(yùn)行時(shí)異常挫剑,它和它的子類都是《非受檢異常:unchecked exception》去扣,它以及它的子類異常可以通過編寫代碼時(shí)嚴(yán)密的邏輯避免掉樊破,不一定要通過要通過異常處理機(jī)制去處理
非受檢異常:可以不對(duì)其進(jìn)行異常處理愉棱,通過嚴(yán)謹(jǐn)?shù)木幋a邏輯就可以避免的異常
如:ArrayIndexOutofBoundsException數(shù)組指針越界、NullPointerException:空指針哲戚、ClassCastException:類型轉(zhuǎn)換奔滑、AarithmaticException:數(shù)學(xué)...:
受檢異常:只要是Exception的子類但不是RuntimeException的子類《支系》,都是受檢異常顺少,受檢異常必須要進(jìn)行異常處理<受檢異常只能用異常處理機(jī)制來處理朋其,否則編譯不能通過>
如:FileFoundException、IOException脆炎、MalformedURLException梅猿、ClassNotFoundException...
【受檢就是一定要檢查要處理異常處理,非受檢就是不一定要檢查腕窥,這是辨別受檢還是非受檢的最直接途徑】
異常處理:try??? catch?finally
如何處理異常:try,catch,finally
try:嘗試運(yùn)行可能出現(xiàn)異常的代碼
catch:捕捉某一類型的異常對(duì)其進(jìn)行處理
try{
代碼1
}catch(異常類型異常引用名){??????? //catch片段可以有多個(gè)
代碼2
}finally{
代碼3
}
【嘗試運(yùn)行語句1粒没,如果語句1執(zhí)行中鋪?zhàn)搅薱atch小括號(hào)中所聲明的類型的異常,
那么就中斷try中語句的執(zhí)行簇爆,而去執(zhí)行語句2】
《
注意:
1:catch小括號(hào)中的異常類型可以是鋪?zhàn)降降漠惓n愋偷母割?/p>
2:try后可跟多個(gè)catch
3:多個(gè)catch層級(jí)處理癞松,異常層級(jí)要從想到大進(jìn)行處理
》
Finally最終
Try{
語句1
}catch(異常類型引用){
語句2
}finally{
語句3
}? //無論任何情況,語句3都會(huì)執(zhí)行入蛆,一般在finally中進(jìn)行釋放資源的操作响蓉,因?yàn)閒inally
可以保證執(zhí)行。
throws:將方法定義中哨毁,將方法中產(chǎn)生的異常拋給方法的調(diào)用者去解決(對(duì)外拋出)
【[修飾符]返回類型方法名(參數(shù)列表)? throws異常類型{
}】
throw:產(chǎn)生一個(gè)(創(chuàng)建好了的)異常
異撤慵祝可以自定義,定義一個(gè)類繼承Exception(受檢異常)扼褪、RuntimeException(非受檢異常)
代碼1是要嘗試運(yùn)行的可能出現(xiàn)異常的代碼
代碼2是捕捉到某種類型(小括號(hào)里的類型)異常要執(zhí)行的處理邏輯
代碼3是無論任何情況都會(huì)被最終執(zhí)行的代碼想幻,用于收尾工作
1.catch()的異常類型可以是實(shí)際異常類型的父類
2.一個(gè)try可以對(duì)應(yīng)多個(gè)并列的catch,表示出現(xiàn)某種類型異常要進(jìn)行的對(duì)應(yīng)的異常處理
3.如果多個(gè)catch中的異常類型有繼承關(guān)系话浇,那么父類必須寫在后面
4.異常出現(xiàn)后同一層級(jí)的代碼不會(huì)被運(yùn)行
5.即使遇到不能處理的異常脏毯,finally中的代碼也會(huì)被執(zhí)行
throws:將方法或構(gòu)造方法出現(xiàn)的異常向上拋到調(diào)用者那里,讓它去處理
throw:產(chǎn)生異常的源頭(和創(chuàng)建異常(newException())不一樣,throw是產(chǎn)生一個(gè)創(chuàng)建好了的異常幔崖,讓其出現(xiàn)在運(yùn)行的程序中)
數(shù)組元素深度克隆食店、拷貝(循環(huán)拷貝數(shù)組中的每個(gè)元素)
1:【
int[]array={1,2,5,25,4,5};
int[]array2=newint[array.length];//創(chuàng)建一個(gè)相同長(zhǎng)度的數(shù)組
for(inti=0;i
//將數(shù)組的每個(gè)元素賦值為舊數(shù)組對(duì)應(yīng)的值
array2[i] =array[i];
}
array[0]=458;
】
2:【
int[]array={1,2,5,25,4,5};
int[]array2=newint[array.length];
//參數(shù)說明:
//一:原數(shù)組
//三:目標(biāo)數(shù)組
//2:原數(shù)組起始位置4:目標(biāo)數(shù)組起始位置
//拷貝的長(zhǎng)度
System.arraycopy(array, 0,array2, 0,array.length);
array[0]=458;
】
3:二維數(shù)組拷貝
【
int[][]array={{1,2,3},{4,5,6}};
int[][]array2=newint[array.length][array[0].length];
//??? System.arraycopy(array, 0, array2, 0, array.length);
for(inti=0;i
System.arraycopy(array[i], 0,array2[i], 0,array[i].length);
}
array[0][0] = 7;
】
4:可變長(zhǎng)數(shù)組
【
publicstaticvoidmain(String[]args) {
//TODOAuto-generatedmethod stub
int[]array={4,5,8,7,5,4,4,4,4,1,5,4};//可任意變
test(array);
}
//這個(gè)方法的形參就是一個(gè)可變長(zhǎng)數(shù)組
publicstatic voidtest(int... arr){
System.out.println("arr的長(zhǎng)度是:"+arr.length);
for(inti=0;i
System.out.println(i);
}
}
】
動(dòng)態(tài)創(chuàng)建數(shù)組:
1:【
int[][] array = new int[3][4];
】
2:【
int[][]array=newint[4][];
intni=1;
intk=1;
for(inti=0;i
//每次都手動(dòng)創(chuàng)建長(zhǎng)度為4的子數(shù)組對(duì)象渣淤,并用二維數(shù)組的元素去指向
array[i] =newint[ni];
ni++;
}
】
異常處理機(jī)制
1:【
publicclassTestExample {
publicstaticvoidmain(String[]args) {
county();
}
publicstaticvoidcounty(){
try{
town();
}catch(Exceptione){
System.out.println("給錢");
}
}
publicstaticvoidtown()throwsException{
village();
}
publicstaticvoidvillage()throwsException{
thrownewException();
}
}
】
2:【
publicclassTestThrow2 {
publicstaticvoidmain(String[]args) {
try{
test();//調(diào)用者遇到異常則進(jìn)行trycatch處理
}catch(Exceptione){
e.printStackTrace();
}
}
//讓test的調(diào)用者處理,向上拋出
publicstaticvoidtest()throwsException{
//產(chǎn)生一個(gè)異常
thrownewException();
}
}
】
3:【
publicclassIllegalArrayLengthExceptionextendsRuntimeException {
publicIllegalArrayLengthException(Stringmsg){
super(msg);
}
}
publicstaticvoidmain(String[]args) {
int[]array= {};
System.out.println(getMin(array));
}
publicstaticintgetMin(int[]array)throwsIllegalArrayLengthException{
if(array.length== 0){
thrownewIllegalArrayLengthException(
"數(shù)組長(zhǎng)度不能為0");
}
intminIndex= 0;
for(inti=0;i
if(array[i]
minIndex=i;
}
}
returnarray[minIndex];
}
】
4:自定義異常與綜合應(yīng)用
【
publicclassViolentExceptionextendsException {
privateStringname;
privateStringaddress;
publicViolentException(Stringmessage){
super(message);
}
publicString getName() {
returnname;
}
publicvoidsetName(Stringname) {
this.name=name;
}
publicString getAddress() {
returnaddress;
}
publicvoidsetAddress(Stringaddress) {
this.address=address;
}
}
publicclassTestViolent {
publicstaticvoidmain(String[]args) {
county();
}
publicstaticvoidcounty(){
try{
town();
}catch(ViolentExceptione){
System.out.println("打聽名字:"+e.getName());
System.out.println("打聽地址:"+e.getAddress());
System.out.println("給錢");
}
}
publicstaticvoidtown()throwsViolentException{
village();
}
publicstaticvoidvillage()throwsViolentException{
ViolentExceptione=newViolentException("暴力抗拆");
e.setName("張小龍");
e.setAddress("北濱");
throwe;
}
}
】