本篇博客將講解Java中的陣列,
文章目錄
- 陣列的基本用法
- 什么是陣列
- 創建陣列
- 基本語法
- 代碼示例
- 陣列的使用
- 計算陣列長度
- 列印陣列
- for回圈列印陣列
- 使用for each列印陣列
- 使用Arrays列印陣列
- 陣列在記憶體中的存盤
- 初始JVM記憶體區域劃分
- 理解記憶體
- 理解參考
- null
- 陣列作為方法的引數
- 基本用法
- 傳參示意圖
- 陣列作為方法的回傳值
- 拷貝陣列
- for回圈拷貝陣列
- Arrays.copyOf拷貝陣列
- Arrays.copyOfRange拷貝陣列
- System.arraycopy拷貝陣列
- clone拷貝陣列
- 二維陣列
- 基本語法
- 代碼示例
- 二維陣列的存盤
- 二維陣列的列印
- for回圈列印二維陣列
- for each列印二維陣列
- Arrays.deepToString列印二維陣列
陣列的基本用法
什么是陣列
陣列是一塊連續的記憶體,所存放的是一組相同資料型別的集合,
創建陣列
基本語法
// 動態初始化
資料型別[] 陣列名稱 = new 資料型別 [] { 初始化資料 };
// 靜態初始化
資料型別[] 陣列名稱 = { 初始化資料 };
代碼示例
int[] array1 = {1,2,3,4,5,6,7,8,9};
int[] array2 = new int[10];
int[] array3 = new int[]{1,2,3,4,5};
陣列的使用
計算陣列長度
直接使用陣列名.length即可,例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
System.out.println("陣列長度為" + array.length);
}
結果為:

列印陣列
for回圈列印陣列
例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
結果為:

使用for each列印陣列
for each也稱為增強for回圈,使用方法為 for(運算式1 : 運算式2) ,運算式1表示陣列的元素型別,運算式2是陣列名,
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
for(int x : array) {
System.out.println(x);
}
}
結果為:

使用Arrays列印陣列
Arrays是幫助我們操作陣列的工具類,Arrays.toString是將當前陣列轉化為字串的形式進行輸出 例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
System.out.println(Arrays.toString(array));
}
結果為:

陣列在記憶體中的存盤
初始JVM記憶體區域劃分

-
程式計數器 (PC Register):只是一個很小的空間,保存下一條執行的指令的地址,
-
虛擬機堆疊(JVM Stack):重點是存盤區域變數表(當然也有其他資訊),我們剛才創建的 int[] arr 這樣的存盤地址的參考就是在這里保存,
-
本地方法堆疊(Native Method Stack):本地方法堆疊與虛擬機堆疊的作用類似,只不過保存的內容是Native方法的區域變數,在有些版本的 JVM 實作中(例如HotSpot),本地方法堆疊和虛擬機堆疊是一起的,
-
堆(Heap):JVM所管理的最大記憶體區域,使用new創建的物件都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )
-
方法區(Method Area):用于存盤已被虛擬機加載的類資訊、常量、靜態變數、即時編譯器編譯后的代碼等資料,方法編譯出的的位元組碼就是保存在這個區域,
-
運行時常量池(Runtime Constant Pool):是方法區的一部分,存放字面量(字串常量)與符號參考,(注意從JDK1.7開始,運行時常量池在堆上)
區域變數和參考保存在堆疊上,new出的物件保存在堆上,
堆的空間非常大,堆疊的空間比較小,
堆是整個 JVM 共享一個,而堆疊每個執行緒具有一份(一個 Java 程式中可能存在多個堆疊),
理解記憶體
記憶體就是指我們熟悉的 “記憶體”,記憶體可以直觀的理解成一個宿舍樓,有一個長長的大走廊,上面有很多房間,每個房間的大小是1Byte (如果計算機有 8G 記憶體, 則相當于有 80億 個這樣的房間),每個房間上面又有一個門牌號,這個門牌號就稱為 地址 ,
理解參考
對于陣列的存盤,我們暫時只考慮兩塊區域——堆疊區和堆區
例如:
int[] array1 = {1,2,3,4,5};
int[] array2 = new int[]{1,2,3};

array1和array2就是參考,也稱為參考變數,這個變數里面儲存的是一個地址(假設這兩個陣列的地址為0x123和0x456),
null
int[] array = null;
這行代碼代表array這個參考不指向任何一個物件,
陣列作為方法的引數
基本用法
例如列印陣列:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
print(array);
}
public static void print(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
結果為:

傳參示意圖

陣列傳參傳遞的是當前參考的值——地址,
陣列作為方法的回傳值
例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
int[] ret = func(array);
System.out.println(Arrays.toString(ret));
}
//將原陣列各個元素都乘以二,然后賦值給一個新陣列
public static int[] func(int[] array) {
int[] ret = new int[array.length];
for (int i = 0; i < array.length; i++) {
ret[i] = array[i] * 2;
}
return ret;
}
結果為:

因此,陣列作為方法的回傳值的時候,回傳的仍然是地址,
拷貝陣列
for回圈拷貝陣列
例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
int[] ret = new int[array.length];
for (int i = 0; i < array.length; i++) {
ret[i] = array[i];
}
System.out.println(Arrays.toString(ret));
}
結果為:

Arrays.copyOf拷貝陣列
Arrays.copyOf傳兩個引數,第一個是陣列名稱,第二個是拷貝的長度, 例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
int[] ret = Arrays.copyOf(array,array.length);
System.out.println(Arrays.toString(ret));
}
結果為:

Arrays.copyOfRange拷貝陣列
Arrays.copyOfRange可以選擇拷貝區間,第一個引數是陣列名稱,第二引數是起始位置,第三個引數是終止位置,范圍遵循左閉右開的規則, 例如:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
int[] ret = Arrays.copyOfRange(array,1,3);//[1,3)
System.out.println(Arrays.toString(ret));
}
System.arraycopy拷貝陣列
System.arraycopy使用方法如下:

從src的srcPos開始拷貝,拷貝到dest的destPos位置,拷貝長度是length,
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
int[] ret = new int[array.length];
System.arraycopy(array,0,ret,0,array.length);
System.out.println(Arrays.toString(ret));
}
結果為:

clone拷貝陣列
例如:
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5,6,7};
int[] ret = array1.clone();
System.out.println(Arrays.toString(ret));
}
結果為:

二維陣列
基本語法
資料型別[][] 陣列名稱 = new 資料型別 [行數][列數] { 初始化資料 };
例如:
int[][] array1 = {{1,2,3},{4,5,6}};
int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3];
int[][] array4 = new int[2][];
Java中二維陣列不可省略行,
代碼示例
例如列印陣列:
public static void main(String[] args) {
int[][] array = {{1,2,3},{4,5,6}};
for (int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
結果為:

二維陣列的存盤
例如:
int[][] array = {{1,2,3},{4,5,6}};

array這個陣列,本身長度為2,每個元素又是一個一維陣列,
我們可以驗證一下:
public static void main(String[] args) {
int[][] array = {{1,2,3},{4,5,6}};
System.out.println(array.length);
System.out.println(array[0].length);
System.out.println(array[1].length);
}
結果為:

二維陣列的列印
for回圈列印二維陣列
例如:
public static void main(String[] args) {
int[][] array = {{1,2,3},{4,5,6}};
for (int i = 0; i < array.length; i++) {
for(int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
結果為:

for each列印二維陣列
例如:
public static void main(String[] args) {
int[][] array = {{1,2,3},{4,5,6}};
for(int[] arr : array) {
for(int x : arr) {
System.out.print(x + " ");
}
System.out.println();
}
}
結果為:

Arrays.deepToString列印二維陣列
例如:
public static void main(String[] args) {
int[][] array = {{1,2,3},{4,5,6}};
System.out.println(Arrays.deepToString(array));
}
結果為:

本篇博客到此結束,
上一篇博客:Java學習苦旅(五)——方法?方法!!!
下一篇博客:Java學習苦旅(七)——我有物件啦!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292460.html
標籤:其他
上一篇:Ansible 自動化運維工具
