Java 陣列
陣列對于每一門編程語言來說都是重要的資料結構之一,當然不同語言對陣列的實作及處理也不盡相同,
Java 語言中提供的陣列是用來存盤固定大小的同型別元素,
陣列
-
陣列是相同型別資料的有序集合,
-
陣列描述的是相同型別的若干個資料,按照一定的先后次序排列組合而成
-
每一個資料稱作一個陣列元素,每個陣列元素可以通過一個下標來訪問它們
特點:
- 長度不可變
- 元素型別一致
- 可以宣告任意型別的陣列
- 陣列變數屬于參考型別,陣列也可看成物件,元素視為成員變數
- 物件存放在JVM的堆中->陣列是物件->陣列物件本身放在堆中!
無論陣列是基本型別還是參考型別,都存在堆中!
宣告陣列變數
dataType[] arrayRefVar; // java開發手冊推薦
dataType arrayRefVar[]; // 兼容C/C++語法
創建陣列
Java語言使用new運算子來創建陣列,語法如下:
arrayRefVar = new dataType[arraySize];
上面的語法陳述句做了兩件事:
一、使用 dataType[arraySize] 創建了一個陣列,
二、把新創建的陣列的參考賦值給變數 arrayRefVar,
陣列變數的宣告,和創建陣列可以用一條陳述句完成,如下所示:
dataType[] arrayRefVar = new dataType[arraySize];
dataType[] arrayRefVar = {value0, value1, ..., valuek};
陣列的元素是通過索引訪問的,陣列索引從 0 開始,所以索引值從 0 到 arrayRefVar.length-1,
陣列邊界
下標合法區間:[0,length -1]
java.lang.ArrayIndexOutOfBoundsException 陣列下標越界例外!
陣列的記憶體


三種初始化狀態
靜態初始化
創建 + 賦值
int[] a = {1,2,3,4,5,6,7,8,9};
動態初始化
包含默認初始化
int[] b = new int[10];
b[0] = 1;
// 后面未賦值的元素初始化成int的默認值0
陣列的默認初始化
陣列是參考型別,相當于類的實體變數,因此一經分配空間,
其中的每個元素也被按照實體變數同樣的方式被隱式初始化,
陣列的使用
- 普通的For回圈
- For-Each 回圈
- 陣列作方法入參
- 陣列作回傳值
public class ArrayDemo2 {
public static void main(String[] args) {
int[] arrays = {1, 2, 3, 4, 5, 6};
// For-Each 回圈
for (int array : arrays) {
System.out.print(array+" ");
}
System.out.println("\n------------");
// 普通的For回圈
int[] array2 = reverse(arrays);
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i]+" ");
}
}
// 陣列作方法入參
public static int[] reverse(int a[]){
int length = a.length;
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = a[length-i-1];
}
return result; // 陣列作回傳值
}
}
多維陣列
多維陣列可以看成陣列內嵌套陣列,(套娃)

比如二維陣列就是一個特殊的一維陣列,它的每一個元素都是一個一維陣列,
int a[][] = new int[2][3] // 宣告創建一個兩行三列的二維陣列
稀疏陣列


import java.util.Arrays;
/**
* 稀疏陣列->用小陣列儲存大陣列
* 比如棋盤
*/
public class SparseArray {
public static void main(String[] args) {
// 1.首先創建一個二維陣列10*10 -> 0:空 1:黑 2:白
int[][] chessboard = new int[10][10];
chessboard[1][2] = 1;
chessboard[2][3] = 2;
System.out.println("原始棋盤:");
for (int[] ints : chessboard) {
System.out.println(Arrays.toString(ints));
}
int[][] result = toSparse(chessboard);
System.out.println("稀疏陣列:");
for (int[] ints : result) {
System.out.println(Arrays.toString(ints));
}
int[][] chessboard2 = toChess(result);
System.out.println("恢復棋盤:");
for (int[] ints : chessboard2) {
System.out.println(Arrays.toString(ints));
}
}
public static int[][] toSparse(int[][] ints) {
// 首先統計有效個數
int count = 0;
for (int[] anInt : ints) {
for (int i : anInt) {
if (i != 0) {
count++;
}
}
}
// 創建稀疏陣列
int[][] result = new int[count + 1][3];
result[0][0] = ints.length;
result[0][1] = ints[0].length;
result[0][2] = count;
int k = 1;
// 遍歷棋盤 儲存坐標和值
for (int i = 0; i < ints.length; i++) {
for (int j = 0; j < ints[i].length; j++) {
if (ints[i][j] != 0) {
result[k][0] = i;
result[k][1] = j;
result[k][2] = ints[i][j];
k++;
}
}
}
return result;
}
public static int[][] toChess(int[][] ints) {
// 棋盤大小
int len = ints[0][0];
int heigh = ints[0][1];
int[][] result = new int[len][heigh];
for (int i = 1;i<ints.length;i++) {
int x = ints[i][0];
int y = ints[i][1];
int value = https://www.cnblogs.com/1101-/p/ints[i][2];
result[x][y] = value;
}
return result;
}
}
小結
陣列是相同資料型別的有序集合
陣列也是物件,陣列元素相當于物件的成員變數
陣列的長度確定固定,不可變,越界報錯ArrayIndexOutOfBounds
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33857.html
標籤:其他
