數組的基本概念
什么是數組
數組是具有相同類型元素的集合,在內存中連續存儲。
1. 數組中存放的元素其類型相同
2. 數組的空間是連在一起的
3. 每個空間有自己的編號,起始位置的編號為0,即數組的下標
數組的創建及初始化
數組的創建
T[] 數組名 = new T[N];
T代表每個元素的類型
N代表元素的個數/數組長度
int[] array1 = new int[10]; // 創建一個可以容納10個int類型元素的數組
double[] array2 = new double[5]; // 創建一個可以容納5個double類型元素的數組
String[] array3 = new double[3]; // 創建一個可以容納3個字符串元素的數組
數組的初始化
數組的初始化主要分為動態初始化以及靜態初始化。
動態初始化:在創建數組時,直接指定數組中元素的個數
int[] array = new int[10];
靜態初始化:在創建數組時不直接指定數據元素個數,而直接將具體的數據內容進行指定
T[] 數組名稱 = {data1, data2, data3, ..., datan};
靜態初始化雖然沒有指定數組的長度,編譯器在編譯時會根據{}中元素個數來確定數組的長度。
靜態初始化時, {}中數據類型必須與[]前數據類型一致。
靜態初始化可以簡寫,省去后面的new T[]。
如果沒有對數組進行初始化,數組中元素有其默認值,為各個類型的0值。
數組的使用
數組中元素訪問
數組在內存中是一段連續的空間,空間的編號都是從0開始的,依次遞增,該編號稱為數組的下標,數組可以通過下標訪問其任意位置的元素。
int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通過[]對數組中的元素進行修改
array[0] = 100;
System.out.println(array[0]);
數組是引用類型
初始JVM的內存分布
內存是一段連續的存儲空間,主要用來存儲程序運行時數據的。
1. 程序運行時代碼需要加載到內存
2. 程序運行產生的中間數據要存放在內存
3. 程序中的常量也要保存
4. 有些數據可能需要長時間存儲,而有些數據當方法運行結束后就要被銷毀
因此JVM也對所使用的內存按照功能的不同進行了劃分:
程序計數器 (PC Register): 只是一個很小的空間, 保存下一條執行的指令的地址
虛擬機棧(JVM Stack): 與方法調用相關的一些信息,每個方法在執行時,都會先創建一個棧幀,棧幀中包含有:局部變量表、操作數棧、動態鏈接、返回地址以及其他的一些信息,保存的都是與方法執行時相關的一些信息。比如:局部變量。當方法運行結束后,棧幀就被銷毀了,即棧幀中保存的數據也被銷毀了。
本地方法棧(Native Method Stack): 本地方法棧與虛擬機棧的作用類似. 只不過保存的內容是Native方法的局部變量. 在有些版本的 JVM 實現中(例如HotSpot), 本地方法棧和虛擬機棧是一起的
堆(Heap): JVM所管理的最大內存區域. 使用 new 創建的對象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是隨著程序開始運行時而創建,隨著程序的退出而銷毀,堆中的數據只要還有在使用,就不會被銷毀。
方法區(Method Area): 用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據. 方法編譯出的的字節碼就是保存在這個區域
基本類型變量與引用類型變量的區別
?基本數據類型創建的變量,稱為基本變量,該變量空間中直接存放的是其所對應的值;
而引用數據類型創建的變量,一般稱為對象的引用,其空間中存儲的是對象所在空間的地址
?a,b就是基本數據類型,array是引用類型。其實本質相同都存放的是數據只是數據類型不同而已。
再談引用變量
public static void func() {
int[] array1 = new int[3];
array1[0] = 10;
array1[1] = 20;
array1[2] = 30;
int[] array2 = new int[]{1,2,3,4,5};
array2[0] = 100;
array2[1] = 200;
array1 = array2;
array1[2] = 300;
array1[3] = 400;
array2[4] = 500;
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}
?
?認識null
null 在 Java 中表示 "空引用" , 也就是一個不指向對象的引用.
總結: 所謂的 "引用" 本質上只是存了一個地址. Java 將數組設定成引用類型, 這樣的話后續進行數組參數傳參, 其實只是將數組的地址傳入到函數形參中. 這樣可以避免對整個數組的拷貝(數組可能比較長, 那么拷貝開銷就會很大).