1? ? ? 數組No11
數組:存放一組相同類型數據的數據結構
數組本身是引用數據類型,數組中的元素可以是基本數據類型,也可以是引用數據類型
【
Java中的數組以對象的形式存在,或者說數組本身是引用數據類型,數組中的元素(數組中的每一個數據)類型可以是基本數據類型,也可以是引用數據類型
】
如何使用:
1.聲明:
元素類型[]引用名;或(引用聲明,并未產生數組,等價)
元素類型引用名[];
元素類型變量名[10];不合法,不能在聲明時指定數組長度
(因為引用中只是存放了對象的首地址,不可能存放長度信息)
2.創建:
數組的動態初始化:
new元素類型[數組長度];(創建數組對象時會為每個元素開辟空間,并且賦以初值,
int 0,double 0.0,? float0.0F,??? short? 0 ,??long? 0L??? Boolean false,
char 0,引用類型null)
(2)數組的靜態初始化,聲明、創建、初始化在一句語句中完成
元素類型【】引用名= {值1,值2,值3………值n};
這種方式同時完成創建和初始化,創建的數組的長度就是大括號中的值得個數,
每一個值之間用逗號,分隔,每個元素的值就是大括號中的值
《注意:靜態初始化聲明必須和初始化寫在一句語句中,否則會出錯?!?/p>
創建指定長度,指定元素類型的數組,創建好了的數組長度不能改變,可通過數組對象的length屬性來獲得長度,這種方式創建的數組,其中的元素的值為默認值(如:int為0,double為0.0,引用類型為null)
數組的靜態初始化:
元素類型[] 引用={元素1,元素2,元素3...};
雖然沒有new關鍵字,但是創建了一個數組對象;創建后自動初始化為{}中的值;數組長度為大括號內元素的個數
元素為引用數據類型的數組每個元素都是引用
3.訪問:
數組引用名[數字下標](下標范圍從0到length-1,超出范圍,會報越界異常<會報數組指針越界異常:java.lang.ArrayIndexOutOfBoundsException>)
可以通過這種方式訪問打印,也可以進行對元素的初始化
訪問數組可以對元素進行賦值:數組引用名【數組下標】=元素值
數組的訪問和賦值可以用到循環賦值
數組的長度可以用其length屬性來動態獲得
數組的長度在數組創建后不能更改,如果實在需要一個長度不同的數組,
只能再創建一個
排序(升序:隨著下標增加,元素越來越大;降序,越來越?。?/p>
1.冒泡排序
(排序,將原來沒有順序的雜亂數組,變成從小到大(升序)或從大到小(降序)的順序。)
《升序:將相鄰的元素進行比較,如果左邊的大,則將它們互換位置,如此不斷循環向右判斷,直到最大的數字冒到最右邊。》
2.??????選擇排序
3.??????插入排序
【實際開發中,使用Arrays.sort(…..)進行排序】
查找:告訴你某個值,在數組中查找出這個值對應的下標
查找:在數組中根據值查找元素,返回找到的元素的下標,如果一個都不符合返回-1.
1、順序查找
從頭到尾遍歷數組,如果符合這個值就返回下標,如果一個都不符合返回-1.
2、二分法查找(必須是排過序的數據)
找到數組中間位置的元素和目標值比較,如果目標值大,就扔掉小的那就扔掉小的那一半數據(中間位置左邊的),如果目標值小,就扔掉大的那一半(中間位置右邊的);接下來對以上操作進行循環執行,直到中間位置元素等于目標值,就將其下標返回。
【】可變長數組
元素類型………引用名
《表示在方法的形參中聲明一個可變長的數組,實參是用逗號隔開的一個單個元素(元素類型是形參數組的元素類型,),而是這個可變長數組形參使用時還是將其當作數組用》
【
main方法的參數
在應用程序啟動時可以傳入參數,這些參數會自動轉換為字符串數組,
我們可以在main方法中通過main方法的形參數組訪問這些參數
】
數組的拷貝
【用=號進行數組拷貝并不是真正的拷貝,只是將兩個引用指向同一個對象
】
二維數組:數組中的元素也是數組
1.聲明:
元素類型[][] 引用名; 或
元素類型 引用名[][];
在聲明時不能在中括號中指定長度
2.初始化:
①靜態初始化:
元素類型[][]引用名={{元素1,元素2,元素3...},{...},{...}...};
(每個子數組的元素可以各不一樣)
靜態初始化必須和聲明在同一語句中
②動態初始化:
(1)new元素類型[長度1][長度2];
【長度1:表示這個二維數組中有幾個子數組
長度2:表示每個子數組中有幾個元素(這樣的話每個子數組長度一樣)
(這樣初始化出的每個元素的值為類型對應的默認值)】
【
New元素類型[長度1][]
長度1表示
長度2沒有寫,表示這幾個子數組并未創建出來
】
(注意:不能寫成new[] [2])
二維數組的拷貝:
【
System.arraycopy是淺克隆,淺拷貝
深度克隆、深拷貝:將數組中的每個元素進行逐一拷貝。
】
長度1表示子數組個數,可以簡單認為是行數,長度2表示每個子數組的長度,可以簡單認為是列數——————用這種方式初始化每個子數組的長度都一樣
(2)new 元素類型[長度1][]
長度1表示子數組個數,或者行數;長度2不寫(不能只寫長度2,不寫長度1)
必須要手動創建各個子數組對象,并將各元素引用分別指向它們
每個子數組的長度可以不一樣
3.訪問:
引用名[下標1][下標2]表示二維數組的下標1的子數組的下標2的元素,如arr[0][1]就是第一個子數組的第二個元素
引用名[下標1]表示二維數組的下標為1的元素、子數組的對象
可以通過循環訪問二維數組中的所有元素
Throwale(是Java中所有的異常、錯誤的父類,直接子類有:Error、Exception)
異常Exception(廣義、體系)
Throwable可拋的,是所有異常和錯誤的父類
Error嚴重的問題,不需要程序去處理(錯誤)
Exception(狹義)是Throwable的子類,我們的應用程序需要去處理可能需要程序去處理
RuntimeException運行時異常,它和它的子類都是《非受檢異常:unchecked exception》,它以及它的子類異常可以通過編寫代碼時嚴密的邏輯避免掉,不一定要通過要通過異常處理機制去處理
非受檢異常:可以不對其進行異常處理,通過嚴謹的編碼邏輯就可以避免的異常
如:ArrayIndexOutofBoundsException數組指針越界、NullPointerException:空指針、ClassCastException:類型轉換、AarithmaticException:數學...:
受檢異常:只要是Exception的子類但不是RuntimeException的子類《支系》,都是受檢異常,受檢異常必須要進行異常處理<受檢異常只能用異常處理機制來處理,否則編譯不能通過>
如:FileFoundException、IOException、MalformedURLException、ClassNotFoundException...
【受檢就是一定要檢查要處理異常處理,非受檢就是不一定要檢查,這是辨別受檢還是非受檢的最直接途徑】
異常處理:try??? catch?finally
如何處理異常:try,catch,finally
try:嘗試運行可能出現異常的代碼
catch:捕捉某一類型的異常對其進行處理
try{
代碼1
}catch(異常類型異常引用名){??????? //catch片段可以有多個
代碼2
}finally{
代碼3
}
【嘗試運行語句1,如果語句1執行中鋪捉了catch小括號中所聲明的類型的異常,
那么就中斷try中語句的執行,而去執行語句2】
《
注意:
1:catch小括號中的異常類型可以是鋪捉到的異常類型的父類
2:try后可跟多個catch
3:多個catch層級處理,異常層級要從想到大進行處理
》
Finally最終
Try{
語句1
}catch(異常類型引用){
語句2
}finally{
語句3
}? //無論任何情況,語句3都會執行,一般在finally中進行釋放資源的操作,因為finally
可以保證執行。
throws:將方法定義中,將方法中產生的異常拋給方法的調用者去解決(對外拋出)
【[修飾符]返回類型方法名(參數列表)? throws異常類型{
}】
throw:產生一個(創建好了的)異常
異常可以自定義,定義一個類繼承Exception(受檢異常)、RuntimeException(非受檢異常)
代碼1是要嘗試運行的可能出現異常的代碼
代碼2是捕捉到某種類型(小括號里的類型)異常要執行的處理邏輯
代碼3是無論任何情況都會被最終執行的代碼,用于收尾工作
1.catch()的異常類型可以是實際異常類型的父類
2.一個try可以對應多個并列的catch,表示出現某種類型異常要進行的對應的異常處理
3.如果多個catch中的異常類型有繼承關系,那么父類必須寫在后面
4.異常出現后同一層級的代碼不會被運行
5.即使遇到不能處理的異常,finally中的代碼也會被執行
throws:將方法或構造方法出現的異常向上拋到調用者那里,讓它去處理
throw:產生異常的源頭(和創建異常(newException())不一樣,throw是產生一個創建好了的異常,讓其出現在運行的程序中)
數組元素深度克隆、拷貝(循環拷貝數組中的每個元素)
1:【
int[]array={1,2,5,25,4,5};
int[]array2=newint[array.length];//創建一個相同長度的數組
for(inti=0;i
//將數組的每個元素賦值為舊數組對應的值
array2[i] =array[i];
}
array[0]=458;
】
2:【
int[]array={1,2,5,25,4,5};
int[]array2=newint[array.length];
//參數說明:
//一:原數組
//三:目標數組
//2:原數組起始位置4:目標數組起始位置
//拷貝的長度
System.arraycopy(array, 0,array2, 0,array.length);
array[0]=458;
】
3:二維數組拷貝
【
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:可變長數組
【
publicstaticvoidmain(String[]args) {
//TODOAuto-generatedmethod stub
int[]array={4,5,8,7,5,4,4,4,4,1,5,4};//可任意變
test(array);
}
//這個方法的形參就是一個可變長數組
publicstatic voidtest(int... arr){
System.out.println("arr的長度是:"+arr.length);
for(inti=0;i
System.out.println(i);
}
}
】
動態創建數組:
1:【
int[][] array = new int[3][4];
】
2:【
int[][]array=newint[4][];
intni=1;
intk=1;
for(inti=0;i
//每次都手動創建長度為4的子數組對象,并用二維數組的元素去指向
array[i] =newint[ni];
ni++;
}
】
異常處理機制
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();//調用者遇到異常則進行trycatch處理
}catch(Exceptione){
e.printStackTrace();
}
}
//讓test的調用者處理,向上拋出
publicstaticvoidtest()throwsException{
//產生一個異常
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(
"數組長度不能為0");
}
intminIndex= 0;
for(inti=0;i
if(array[i]
minIndex=i;
}
}
returnarray[minIndex];
}
】
4:自定義異常與綜合應用
【
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;
}
}
】