Java數組詳解
數組的定義
- 數組是相同資料類型的有序集合。
- 數組描述的是相同類型的若幹資料,按照一定的先後次序排列組合而成。
- 其中,每一個資料稱作一個數組元素,每一個數組元素可以通過下标來通路它們。
數組的聲明和建立
首先必須聲明數組變量,才能在程式中使用數組。下面是聲明數組變量的兩種文法:
dataType[] arrayRefVar; // 首選的方法,推薦使用
或
dataType arrayRefVar[]; // 為C/C++程式員保留的方式,不推薦
Java語言使用new操作符來建立數組,文法如下:
示例:
package com.wmwx.array;
public class Demo01 {
public static void main(String[] args) {
int[] numbers; //數組的聲明
numbers = new int[5]; //數組的建立
}
}
數組的指派
數組可以通過使用下标來執行指派操作。數組的下标從0開始,到length-1結束(length為數組長度)。
如果下标超過length-1,就會報錯:ArraylndexOutOfBoundsException ,即數組下标越界異常。
示例:
package com.wmwx.array;
public class Demo01 {
public static void main(String[] args) {
int[] numbers = new int[5];
numbers[0] = 1; //下标從0開始
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;
System.out.println(numbers[0]); //輸出1
System.out.println(numbers[1]); //輸出2
System.out.println(numbers[2]); //輸出3
System.out.println(numbers[3]); //輸出4
System.out.println(numbers[4]); //輸出5
System.out.println(numbers[5]); //報錯:越界異常
}
}
數組的周遊
數組的元素類型和數組的大小都是确定的。是以當處理數組元素時候,我們通常使用循環結構。
示例:
package com.wmwx.array;
public class Demo01 {
public static void main(String[] args) {
int[] numbers = new int[5]; //聲明和建立
numbers[0] = 1; //指派
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;
int sum = 0;
//通過array.length可以得到數組的長度
for (int i = 0; i < numbers.length; i++) {
sum = sum + numbers[i];
}
System.out.println(sum); //輸出15
}
}
數組的初始化
數組的初始化有以下三種方式:
- 靜态初始化
- 動态初始化
- 預設初始化
示例:
package com.wmwx.array;
public class Demo02 {
public static void main(String[] args) {
//靜态初始化:建立+指派
int[] a = {1, 2, 3, 4};
System.out.println(a[0]); //輸出1
//動态初始化(包含預設初始化)
int[] b = new int[4];
b[0] = 5;
System.out.println(b[0]); //輸出5
//預設初始化
System.out.println(b[1]); //輸出0
System.out.println(b[2]); //輸出0
System.out.println(b[3]); //輸出0
}
}
數組的基本特點
- 其長度是确定的。數組一旦被建立,它的大小就是不可以改變的。其元素必須是相同類型,不允許出現混合類型。
- 數組中的元素可以是任何資料類型,包括基本類型和引用類型。
- 數組變量屬于引用類型,數組也可以看成是對象,數組中的每個元素相當于該對象的成員變量。
- 數組本身就是對象,而Java中的對象是在堆中的。是以數組無論儲存原始類型還是其他對象類型,數組對象本身是在堆中的。
For-Each循環
Java5 引進了一種新的循環類型,被稱為 For-Each 循環或者加強型循環,它能在不使用下标的情況下周遊數組。
其文法格式如下:
for(type element: array)
{
System.out.println(element);
}
示例:
package com.wmwx.array;
public class Demo03 {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
//輸出數組的所有元素
//for循環
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
//for-each循環
for (int i: array) {
System.out.println(i);
}
}
}
數組作為參數和傳回值
示例:
package com.wmwx.array;
public class Demo04 {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
int[] new_array = reverse(array);
for (int i: new_array) {
System.out.println(i); //輸出5、4、3、2、1
}
}
//數組作為傳回值
public static int[] reverse(int[] array){ //數組作為參數
int[] result = new int[array.length];
//反轉整個數組
for (int i=0, j=array.length-1;i<array.length;i++,j--){
result[j] = array[i];
}
return result;
}
}
多元數組
多元數組可以看成是數組的數組,比如二維數組就是一個特殊的一維數組,其每一個元素都是一個一維數組。
示例:
package com.wmwx.array;
public class Demo05 {
public static void main(String[] args) {
//二維數組
int[][] array = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}};
System.out.println(array[0][1]); //輸出2
System.out.println(array[1][2]); //輸出4
System.out.println(array[2][0]); //輸出3
//周遊二維數組
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
}
}
Arrays類
java.util.Arrays 類能友善地操作數組,它提供的所有方法都是靜态的。
具有以下功能:
- 列印數組:通過 toString 方法
- 給數組指派:通過 fill 方法。
- 對數組排序:通過 sort 方法,按升序。
- 比較數組:通過 equals 方法比較數組中元素值是否相等。
- 查找數組元素:通過 binarySearch 方法能對排序好的數組進行二分查找法操作。
示例:
package com.wmwx.array;
import java.util.Arrays;
public class Demo06 {
public static void main(String[] args) {
int[] array = {1, 234, 56, 7890};
//列印數組
System.out.println(array); //輸出[[email protected]
System.out.println(Arrays.toString(array)); //輸出[1, 234, 56, 7890]
//排序數組
Arrays.sort(array); //升序排序
System.out.println(Arrays.toString(array)); //輸出[1, 56, 234, 7890]
//查找元素
System.out.println(Arrays.binarySearch(array, 234)); //輸出2
//填充數組
Arrays.fill(array, 0);
System.out.println(Arrays.toString(array)); //輸出[0, 0, 0, 0]
//比較數組
System.out.println(Arrays.equals(array, new int[]{0, 0, 0, 0})); //輸出true
}
}
稀疏數組
當一個數組中大部分元素為0,或為同一值時,可以使用稀疏數組來儲存該數組。
稀疏數組的處理方式是:
- 記錄數組一共有幾行幾列,有多少個不同的值
- 把具有不同值的元素的行列及值記錄在一個小規模的數組中,進而縮小程式的規模
示例:
package com.wmwx.array;
import java.util.Arrays;
public class Demo07 {
public static void main(String[] args) {
//11*11的棋盤上:0 空格 1 黑棋 2 白棋
int[][] chess = new int[11][11];
chess[1][2] = 1;
chess[2][3] = 2;
//輸出原始數組:
System.out.println("原始數組如下:");
for (int[] arrs: chess) {
for (int i: arrs) {
System.out.print(i+" ");
}
System.out.println();
}
System.out.println("=====================");
//轉換為稀疏數組并輸出
chess = sparse(chess);
System.out.println("稀疏數組如下:");
for (int[] arrs: chess) {
for (int i: arrs) {
System.out.print(i+" ");
}
System.out.println();
}
System.out.println("=====================");
//還原成原始數組并輸出
chess = toArray(chess);
System.out.println("還原數組如下:");
for (int[] arrs: chess) {
for (int i: arrs) {
System.out.print(i+" ");
}
System.out.println();
}
}
public static int[][] sparse(int[][] array){
//第一步:擷取有效值的個數
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的個數:"+sum);
System.out.println("=====================");
//第二步:建立一個稀疏數組
int[][] sparseArray = new int[sum+1][3];
sparseArray[0][0] = array.length;
sparseArray[0][1] = array[0].length;
sparseArray[0][2] = sum;
//第三步:周遊原數組,将非零值存放到稀疏數組中
int count = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j]!=0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = array[i][j];
}
}
}
//第四步:傳回稀疏數組
return sparseArray;
}
public static int[][] toArray(int[][] sparse){
//第一步:建構原始數組
int[][] array = new int[sparse[0][0]][sparse[0][1]];
//第二步:還原其中的值
for (int i = 1; i < sparse.length; i++) {
array[sparse[i][0]][sparse[i][1]] = sparse[i][2];
}
//第三步:傳回原始數組
return array;
}
}
最終的輸出結果如下:
原始數組如下:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
=====================
有效值的個數:2
=====================
稀疏數組如下:
11 11 2
1 2 1
2 3 2
=====================
還原數組如下:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0