@
- 一、建立陣列的四種方式
- 二、詳解
- 三、陣列儲存的弊端
一、建立陣列的四種方式
以int資料型別為例
@Test
public void testNewArray() {
//建立陣列
//法一
int[] arr1 = new int[]{1,2,3,4,5};
System.out.println(arr1.length + " " + arr1[2]); //5 3
//Arrays.toString(Object[]) 將陣列的元素生成字串,陣列的各個元素使用方括號括著 [ ]
System.out.println(Arrays.toString(arr1)); //[1, 2, 3, 4, 5]
//法二 宣告、分配空間並賦值
int[] arr2 = {1,2,3,4};
System.out.println(arr2.length + " " + arr2[2]); //4 3
//法三 宣告陣列時指定元素個數,然後賦值。此時所有的元素值均為0
int[] arr3 = new int[4];
System.out.println(arr3.length + " " + arr3[3]); //4 0
//法四 宣告陣列名、開闢空間、賦值
int[] arr4;
arr4 = new int[]{0,1,2,3};
System.out.println(arr4.length + " " + arr4[2]); //4 2
//建立多維陣列
int[][] doubleArr1 = {{1,2,3},{4,5,6},{7,8,9}};
int m = 3, n = 4, q = 5;
int[][] doubleArr2 = new int[m][n]; //其中n可以省略
int[][][] tArr = new int[m][n][q]; //其中n、q可以省略
}
注意:
- new 資料型別[]{},其中花括號可以省去,但要在[ ]中填寫陣列的個數;
- 建立多維陣列時 new後面第一個方括號中的元素數量不能省略
二、詳解
1、一維陣列的宣告方式:
type[] arrayName; 或 type arrayName[];
推薦使用第一種格式,因為第一種格式具有更好的可讀性,表示type[]是一種引用型別(陣列)而不是type型別。建議不要使用第二種方式
int[] intArr;
注:Java語言中宣告陣列時不能指定其長度(陣列中元素的個數),這是因為陣列是一種引用型別的變數,因此使用它定義一個變數時,僅僅表示定義了一個引用變數(也就是定一個了一個指標),這個引用變數還未指向任何有效的記憶體,所以定義陣列時不能指定陣列的長度。而且由於定義陣列僅僅只是定一個引用變數,並未指向任何有效的記憶體空間,所以還沒有記憶體空間來儲存陣列元素,因此這個陣列也不能使用,只有在陣列進行初始化後才可以使用。
2、一維陣列的建立
Java中使用關鍵字new建立陣列物件,格式為:陣列名 = new 陣列元素的型別 [陣列元素的個數]
// 建立陣列,如果在建立的同時不初始化陣列則必須指定其大小
intArr = new int[5];
// 建立陣列時,不指定陣列大小則必須在建立的同時初始化陣列
intArray1 = new int[]{0,1,2};
- 一旦使用new關鍵字為陣列分配了記憶體空間,每個記憶體空間儲存的內容就是陣列元素的值,也就是陣列元素就有了初始值,即使這個記憶體空間儲存的內容是空,這個空也是一個值null。也就是說不可能只分配內容空間而不賦初始值,即使自己在建立陣列物件(分配內容空間)時沒有指定初始值,系統也會自動為其分配
- 基礎資料型別的包裝類,其預設的初始化值均為null,因為基礎資料型別的包裝類建立的陣列屬於引用陣列(物件陣列),物件陣列預設的初始化值都是null。
3、一維陣列的初始化
陣列的初始化分為靜態初始化、動態初始化和預設初始化:
- 靜態初始化是陣列在初始化時由程式設計師顯式指定每個陣列元素的初始值而陣列長度由系統決定。
- 動態初始化是陣列在初始化時只指定陣列長度,由系統為陣列元素分配初始值。
//a、陣列靜態初始化的語法格式:
arrayName = new type[]{element1,element2,element3...};
// 或者使用簡化的語法格式:
arrayName = {element1,element2,element3...}
//b、陣列動態初始化的語法格式:
arrayName = new type[length];
附:靜態初始化時不能指定元素個數,而動態初始化時則必須指定元素個數。靜態初始化時陣列能夠知道元素的個數所以不需要指定,而動態初始化時陣列元素個數未知 因此必須指定。
// 靜態初始化
int intArray2 [] = new int []{20,21,22};
// 靜態初始化簡化方式
int intArray3 [] = {30,31,32};
// 動態初始化
int [] intArray4 = new int [3];
// 錯誤寫法:靜態初始化不能指定元素個數
// int intErrorArray5[] = new int[3]{50,51,52};
// 錯誤寫法:動態初始化必須指定元素個數
// int intErrorArray6[] = new int[];
注:一維陣列這一塊記住兩點,陣列宣告的時候是不能指定大小的,也就是說等號左邊的中括號中不能包含數字。另外一旦使用new關鍵字那麼肯定在記憶體中為陣列分配了空間,則必然陣列有預設值。陣列是物件資料型別
注:不要靜態初始化和動態初始化同時使用,也就是說不要再進行陣列初始化時,既指定陣列長度,也為每個陣列元素分配初始值。
4、陣列進行動態初始化時系統分配初始值的規則
- 陣列元素型別是基本型別中的整數型別(byte、short、int、long),則陣列元素的初始化預設值是0
- 陣列元素型別是基本型別中的浮點型別(float、double),則陣列元素的值是0.0
- 陣列元素型別是基本型別中的字元型別(char),則陣列元素的值是'\u0000'
- 陣列元素型別是基本型別中的布林型別(boolean),則陣列元素的值是false
- 陣列元素型別是基本型別中的引用型別(類、介面、陣列),則陣列元素的值是null
詳情見https://blog.csdn.net/qq_44700578/article/details/136323990
三、陣列儲存的弊端
- 一旦初始化,其長度就不可修改,長度不夠用、開闢很大的長度會導致空間浪費
- 陣列中提供的方法非常有限。新增、刪除、插入等操作 效率很低【為了保證元素的記憶體地址連續,新增或刪除元素時,涉及到前移或者後移】
- 擴容麻煩,只能新建一個更大的陣列,將元素一個一個移進去,效率低
- 獲取陣列中實際元素的個數的需求,陣列沒有現成的屬性或方法可用
- 陣列儲存資料的特點:有序、可重複。對於無序、不可重複的需求,不能滿足
為解決以上問題、靈活運用,提出Java容器的概念
參考https://blog.csdn.net/u014199097/article/details/50551731