天天看點

Java數組詳解Java數組詳解

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
    }
}
           

數組的初始化

數組的初始化有以下三種方式:

  1. 靜态初始化
  2. 動态初始化
  3. 預設初始化

示例:

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
    }
}
           

數組的基本特點

  1. 其長度是确定的。數組一旦被建立,它的大小就是不可以改變的。其元素必須是相同類型,不允許出現混合類型。
  2. 數組中的元素可以是任何資料類型,包括基本類型和引用類型。
  3. 數組變量屬于引用類型,數組也可以看成是對象,數組中的每個元素相當于該對象的成員變量。
  4. 數組本身就是對象,而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