柚子快報(bào)邀請碼778899分享:數(shù)組(Java)
柚子快報(bào)邀請碼778899分享:數(shù)組(Java)
一維數(shù)組
數(shù)組是相同類型元素的集合。
數(shù)組的定義和使用
數(shù)組的創(chuàng)建
數(shù)組名又叫引用變量,簡稱引用 下面代碼段中new表示創(chuàng)建新的對象
T[ ] 數(shù)組名 = new T[ N ];//數(shù)組名又叫引用變量,簡稱變量
//T:表示數(shù)組中存放元素的類型
//T[]:表示數(shù)組的類型
//N:表示數(shù)組的長度
與C語言不同的是,數(shù)組在創(chuàng)建時(shí)數(shù)組類型 T[ ] 寫的清楚明了, 而不像C語言中的創(chuàng)建為 :T 數(shù)組名 [ ],數(shù)組類型為T [ ],難以分辨
數(shù)組的初始化
數(shù)組的初始化主要分為動態(tài)初始化以及靜態(tài)初始化。
動態(tài)初始化:在創(chuàng)建數(shù)組時(shí),直接指定數(shù)組中元素的個(gè)數(shù)
int[] array = new int[10];//元素個(gè)數(shù)為10
靜態(tài)初始化:在創(chuàng)建數(shù)組時(shí)不指定數(shù)據(jù)元素個(gè)數(shù),直接將內(nèi)容進(jìn)行指定 靜態(tài)初始化可以簡寫,省去后面的new T [ ] 。( 注意:雖然省去了new T [ ] , 但是編譯器編譯代碼時(shí)還是會還原)
T[] 數(shù)組名稱 = {data1, data2, data3, ..., datan};
數(shù)組也可以按照如下C語言個(gè)數(shù)創(chuàng)建,不推薦 該種定義方式不太友好,容易造成數(shù)組的類型就是int的誤解 [ ] 如果在類型之后,就表示數(shù)組類型,因此int[]結(jié)合在一塊寫意思更清晰
int arr[] = {1, 2, 3};
靜態(tài)和動態(tài)初始化也可以分為兩步,但是省略格式(省去了 new T [ ] )不可以
int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
// 注意省略格式不可以拆分, 否則編譯失敗,以下為省略格式
// int[] array3;
// array3 = {1, 2, 3};
如果沒有對數(shù)組進(jìn)行初始化,數(shù)組中元素有其默認(rèn)值
如果數(shù)組中存儲元素類型為基類類型,默認(rèn)值為基類類型對應(yīng)的默認(rèn)值
如果數(shù)組中存儲元素類型為引用類型,默認(rèn)值為null
數(shù)組中元素訪問
數(shù)組可以通過下標(biāo)訪問其任意位置的元素 數(shù)組越界異常
java.lang.ArrayIndexOutOfBoundsException
遍歷數(shù)組
與C語言不同的是Java中在數(shù)組中可以通過 數(shù)組對象.length 來獲取數(shù)組的長度
for 遍歷數(shù)組
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
for-each 遍歷數(shù)組(可以避免循環(huán)條件和更新語句寫錯(cuò))
for (int x : array) {
System.out.println(x);//將array的值放到x中打印出來
}
數(shù)組是引用類型
初始JVM的內(nèi)存分布
//# 程序計(jì)數(shù)器 (PC Register): 只是一個(gè)很小的空間, 保存下一條執(zhí)行的指令的地址
//# 虛擬機(jī)棧(JVM Stack): 與方法調(diào)用相關(guān)的一些信息,每個(gè)方法在執(zhí)行時(shí),都會先創(chuàng)建一個(gè)棧幀,棧幀中包含有:局部變量表、操作數(shù)棧、動態(tài)鏈接、返回地址以及其他的一些信息,保存的都是與方法執(zhí)行時(shí)相關(guān)的一些信息。比如:局部變量。當(dāng)方法運(yùn)行結(jié)束后,棧幀就被銷毀了,即棧幀中保存的數(shù)據(jù)也被銷毀了。
//# 本地方法棧(Native Method Stack): 本地方法棧與虛擬機(jī)棧的作用類似. 只不過保存的內(nèi)容是Native方法的局部變量. 在有些版本的 JVM 實(shí)現(xiàn)中(例如HotSpot), 本地方法棧和虛擬機(jī)棧是一起的
//# 堆(Heap): JVM所管理的最大內(nèi)存區(qū)域. 使用 new 創(chuàng)建的對象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是隨著程序開始運(yùn)行時(shí)而創(chuàng)建,隨著程序的退出而銷毀,堆中的數(shù)據(jù)只要還有在使用,就不會被銷毀。
//# 方法區(qū)(Method Area): 用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù). 方法編譯出的的字節(jié)碼就是保存在這個(gè)區(qū)域
基本類型變量與引用類型變量的區(qū)別
基本數(shù)據(jù)類型創(chuàng)建的變量,稱為基本變量,存放的是其所對應(yīng)的值; 而引用數(shù)據(jù)類型創(chuàng)建的變量,一般稱為對象的引用,存儲的是對象所在空間的地址。 引用變量并不直接存儲對象本身,可以簡單理解成存儲的是對象在堆中空間的起始地址。通過該地址,引用變量便可以去操作對象。(類似于C語言中的變量)
認(rèn)識 null
null 在 Java 中表示 “空引用” , 沒有指向?qū)ο蟮囊?null 的作用類似于 C 語言中的 NULL (空指針), 都是表示一個(gè)無效的內(nèi)存位置. 因此不能對這個(gè)內(nèi)存進(jìn)行任何讀寫操 作
一旦嘗試讀寫, 就會拋出 NullPointerException 異常
注意: Java 中并沒有約定 null 和 0 號地址的內(nèi)存有任何關(guān)聯(lián)
數(shù)組的應(yīng)用場景
所謂的 “引用” 本質(zhì)上只是存了一個(gè)地址. Java 將數(shù)組設(shè)定成引用類型, 這樣的話后續(xù)進(jìn)行數(shù)組參數(shù)傳參, 其實(shí) 只是將數(shù)組的地址傳入到函數(shù)形參中. 這樣可以避免對整個(gè)數(shù)組的拷貝(數(shù)組可能比較長, 那么拷貝開銷就會很大)
注意:數(shù)組當(dāng)中存儲的是基本類型數(shù)據(jù)時(shí),不論怎么拷貝基本都不會出現(xiàn)什么問題,但如果存儲的是引用數(shù)據(jù)類 型,拷貝時(shí)需要考慮深淺拷貝的問題
二維數(shù)組
(注意二維數(shù)組在定義時(shí)初始化時(shí)不同行需要加上括號{ })
數(shù)據(jù)類型[ ][ ] 數(shù)組名 = {};
int[][] array1= {{1,2,3},{4,5,6}};
for (int i = 0; i < array1.length; i++) {//array1.length是多少個(gè)一維數(shù)組,相當(dāng)于是多少行
for (int j = 0; j < array1[i].length; j++) {//array1[i].length是一行一維數(shù)組有多少個(gè)元素
System.out.print(array1[i][j]+" ");
}
}
與C語言相似,上述代碼中二維數(shù)組相當(dāng)于多個(gè)一維數(shù)組,在上述代碼中,array1.length 是有多少個(gè)一維數(shù)組的意思(也就是有多少行的意思),array1[i].length 是這個(gè)一維數(shù)組中有多少個(gè)元素(相當(dāng)于列)
int[][] array2 = new int[2][];//Java中可以省略列,不可以省略行,省略后會使得列的值為NULL,所以要賦值后才可以運(yùn)行,否則報(bào)錯(cuò)
array2[0] = new int[]{1,2};//必須完整地寫上new int才可以對已經(jīng)動態(tài)初始化的數(shù)組初始化
array2[1] = new int[]{3,4};
上述代碼中Java中可以省略列,不可以省略行,省略后會使得列的值為NULL,所以要賦值后才可以運(yùn)行,否則報(bào)錯(cuò) 給二位數(shù)組中的每一行賦值時(shí)必須完整地寫上new int才可以對已經(jīng)動態(tài)初始化的數(shù)組初始化
其中還有不規(guī)則二維數(shù)組如下
int[][] array3 = new int[2][];//不規(guī)則二維數(shù)組
array3[0] = new int[3];
array3[1] = new int[5];//動態(tài)初始化二維數(shù)組會使得列的值為NULL,會報(bào)錯(cuò),但是在確定列后就NULL變?yōu)?了
打印數(shù)組
用 Arrays.toString 輸出的其實(shí)是字符串(把傳入的參數(shù)array表示的數(shù)組以字符串方式進(jìn)行輸出)
柚子快報(bào)邀請碼778899分享:數(shù)組(Java)
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。