Java 之 一維陣列
一、宣告與初始化一維陣列
1、宣告(兩種方式)
陣列元素型別 陣列名稱[];
陣列元素型別[] 陣列名字;
陣列元素型別:決定了陣列的資料型別,即陣列要存放什麼型別的資料,可以是基本資料型別和引用資料型別;
Java語言中宣告陣列時不能指定其長度(陣列中元素的數), 例如: int a[5]; //非法
Demo:
int a[];
int[] a1;
double b[];
String[] c; //引用型別變數陣列
2、初始化(兩種方式)
陣列的初始化:在記憶體當中建立一個數組,並且向其中賦予一些預設值,再用 new 運算子進行記憶體分配。
兩種初始化方式:
(1)動態初始化(指定長度):陣列宣告且為陣列元素分配空間與賦值的操作分開進行
陣列名稱 = new 資料型別[陣列長度];
資料型別:也就是陣列當中儲存的資料,全都是統一的什麼型別,與宣告時要一致;
陣列長度:也就是陣列當中,到底可以儲存多少個數據,是一個int數字;
注意:陣列有定長特性,陣列一旦初始化完成,其長度就確定了,不可更改。
(2)靜態初始化(指定內容):在定義陣列的同時就為陣列元素分配空間並賦值。
陣列名稱 = new 資料型別[]{元素1,元素2,……};
注意:雖然靜態初始化沒有直接告訴長度,但是根據大括號裡面的元素具體內容,也可以自動推算出來長度。
Demo:
int[] ids;//宣告
//1.1 靜態初始化:陣列的初始化和陣列元素的賦值操作同時進行
ids = new int[]{1001,1002,1003,1004};
//1.2動態初始化:陣列的初始化和陣列元素的賦值操作分開進行
String[] names = new String[5];
3、宣告並初始化陣列
宣告的同時使用 new 關鍵字為陣列分配記憶體空間:
資料型別 陣列名字 = new 陣列元素的型別[陣列元素的個數]資料型別 陣列名字 = new 陣列元素的型別[元素1,元素2,……]
注意:使用 new 關鍵字分配陣列時,必須指定陣列元素的型別和陣列元素的個數或陣列元素。
4、省略new的方式(型別推斷)
資料型別[] 陣列名稱 = { 元素1, 元素2, ... };
使用這種方式,會根據元素型別推斷中所建立的陣列中的資料型別,此時宣告和初始化必須在同一行!
Demo:
int[] arr = {1,2,3,4,5};//型別推斷
int[] arr2;
arr2 = {1,2,3,4,5}; //編譯不通過,這樣必須寫在同一行
二、一維陣列的訪問與陣列長度
1、列印陣列名稱
當使用 System.out.println 列印陣列的名稱時,得到的陣列對應的:陣列物件的型別@記憶體地址雜湊值。(十六進位制的地址值)
Demo:
int[] arr2 = new int[3];
System.out.println(arr2); //結果是:[I@6d06d69c
2、陣列的長度
每個陣列都具有長度,而且是固定的,Java中賦予了陣列的一個屬性,可以獲取到陣列的 長度,語句為:陣列名.length,屬性length的執行結果是陣列的長度,int型別結果。
由次可以推斷出,陣列 的最大索引值為陣列名.length-1。
注意:陣列一旦初始化,其長度是不可變的。
3、訪問陣列中的元素
定義並用運算子new為之分配空間後,才可以引用陣列中的每個元素
索引(下標):每一個儲存到陣列的元素,都會自動的擁有一個編號,從0開始,這個自動編號稱為陣列索引 (index),可以通過陣列的索引訪問到陣列中的元素;
陣列元素下標可以是整型常量或整型表示式。如a[3] , b[i] , c[6*i];
陣列元素下標從0開始;長度為n的數組合法下標取值範圍: 0 —>n-1; 如int a[]=newint[3]; 可引用的陣列元素為a[0]、 a[1]、 a[2]
格式:
陣列名[索引] = 數值, //為陣列中的元素賦值
變數 = 陣列名[索引] //獲取出陣列中的元素
三、遍歷陣列
陣列遍歷:就是將陣列中的每個元素分別獲取出來,就是遍歷。遍歷也是陣列操作中的基石。
方式一:使用索引下標方式
1 int[] array = { 15, 25, 30, 40, 50, 60, 75 };
2 System.out.println(array[0]); // 15
3 System.out.println(array[1]); // 25
4 System.out.println(array[2]); // 30
5 System.out.println(array[3]); // 40
6 System.out.println(array[4]); // 50
7 System.out.println(array[5]); // 50
這種方式需要依次根據索引進行頻繁重複的操作,不推薦使用,只做瞭解。
方式二:使用for
int[] arr = new int[5];
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
對於一個數組,每次對每個元素的操作都是相同的,用迴圈是最好的方法。而且就算陣列的長度傳送了改變程式碼也不需要改動。
方式三:使用 foreach 迴圈
1 for (int i: array){
2 System.out.println(array[i]);
3 }
這種迴圈是增強形式的 for 迴圈,其中 i 即代表陣列中的每一個元素。
四、陣列元素的預設初始化值
陣列是引用型別,它的元素相當於類的成員變數,因此陣列一經分配空間,其中的每個元素也被按照成員變數同樣的方式被隱式
初始化。
對於基本資料型別而言,預設初始化值各有不同;
對於引用資料型別而言,預設初始化值為null(注意與0不同!)
整數型別:預設是 0;
浮點型別:預設是 0.0;
字元型別:預設為 '\u0000',字元編碼為0的空字元;
布林型別:預設是 false;
引用型別:預設是 null。
注意:靜態初始化其實也有預設值的過程,只不過系統自動馬上將預設值替換成為了大括號當中的具體數值。
五、一維陣列的記憶體解析
1、記憶體概述
記憶體是計算機中的重要原件,臨時儲存區域,作用是執行程式。我們編寫的程式是存放在硬碟中的,在硬碟中的程 序是不會執行的,必須放進記憶體中才能執行,執行完畢後會清空記憶體。
Java虛擬機器要執行程式,必須要對記憶體進行空間的分配和管理。
2、Java 虛擬機器的記憶體劃分
為了提高運算效率,就對空間進行了不同區域的劃分,因為每一片區域都有特定的處理資料方式和記憶體管理方式。
JVM 的記憶體劃分:
3、陣列在記憶體中的儲存
(1)一個數組與記憶體關係
程式執行流程:
a、main 方法進入方法棧執行;
b、建立陣列,JVM會在堆記憶體中開闢空間,儲存陣列;
c、陣列在記憶體中會有自己的記憶體地址,以十六進位制數表示;
d、陣列中有3個元素,預設值為 0
e、JVM 將陣列的記憶體地址賦值給引用變數 array;
f、變數 array 儲存的是陣列記憶體中的地址,而不是一個具體是數值,因此稱為引用資料型別;
(2)兩個陣列與記憶體關係
(3)兩個變數指向一個數組
4、陣列記憶體圖
(1)宣告陣列型別
(2)陣列的預設值
(3)陣列的動態初始化
5、陣列記憶體案例
(1)案例一
(2)案例二
(3)案例三