1. 程式人生 > 實用技巧 >Java中的陣列

Java中的陣列

Java中的陣列

陣列的定義

  • 相同型別資料的有序集合
  • 相同型別的若干個資料,按照一定順序排列組合而成
  • 每一個數據稱作元素,可以用下標來訪問

陣列的宣告與建立

int[] num1;
int num2[];

有以上兩種方式宣告

常用的是第一種方式宣告

第二種是為了迎合C/C++的風格

//計算所有元素的和
int[] nums = new int[10];
int sum = 0 ;
Scanner scanner = new Scanner(System.in);
for( int i = 0 ; i<nums.length ; i++) {
    if ( scanner.hasNextInt() ) {
        nums[i] = scanner.nextInt();
	}
}
for ( int x : nums) {
	sum += x;
}
System.out.println("sum=" + sum);

下標越界

int[] nums = new int[10];

注意:下標是從0開始的,nums[10]屬於越界,會報一下錯誤

ArrayIndexOutOfBoundError

陣列下表越界錯誤


記憶體分析

Java記憶體分析

    • 存放new的物件和陣列
    • 可被所有執行緒共享
    • 不存放別的物件引用
    • 存放基本變數型別
      • 會包含這個基本型別的具體數值
    • 引用物件的變數
      • 會存放這個物件的引用,也就是這個物件的地址
  • 方法區
    • 可以被所有的執行緒共享
    • 包含了所有的class和static變數

陣列的初始化

靜態初始化

int[] a = {1,2,3,4,5,6,7,8,9};

動態初始化

int[] a = new int[9];

動態分配,每個預設賦值為0

陣列的基本特點

  • 長度固定,建立後無法改變
  • 每個元素型別相同
  • 元素可以是任意型別,即基本型別和引用型別
  • 陣列變數屬於引用型別
    • 陣列本身就是一個物件
    • java中物件是在堆當中的
    • 陣列的元素不論是基本型別還是引用型別,陣列本身是在堆當中的

陣列的使用

普通遍歷

int[] a = {1,2,3,4,5,6,7,8,9};
for (int i=0 ; i<a.length ; i++) {
    System.out.println(a[i]);
}

Each for遍歷

int[] a = {1,2,3,4,5,6,7,8,9};
for (int i : a) {
    System.out.println(i);
}

反轉陣列

public class Demo02 {
    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,8,9};
        reverse(a);	//這裡也體現了陣列的引用傳遞
        for (int i: a) {
            System.out.println(i);
        }
    }
    //將陣列的值反轉
    public static void reverse(int[] array) {
        for (int i=0 ,tmp = 0; i<array.length/2 ; i++) {
            tmp = array[i];
            array[i] = array[array.length-i-1];
            array[array.length-i-1] = tmp;
        }
    }
}

注意:array[array.length-i-1],這裡非常容易越界,報ArrayIndexOutOfBoundException


多維陣列

二位陣列宣告

int[][] a = {{0,1},{2,3},{4,5},{6,7},{8,9}};
int[][] b = new int[5][2];

二維陣列初始化

int[][] a = {{0,1},{2,3},{4,5},{6,7},{8,9}};
for (int[] x: a) {
    for(int y: x) {
        System.out.print(y + "\t");
    }
    System.out.println();
}

Arrays類的使用

import java.util.Arrays;

public class Demo04 {
    public static void main(String[] args) {
        int[] a = {3,515,2521,111,224,845,31313,2545,45,88};
        System.out.println(a);	//列印雜湊碼
        System.out.println(Arrays.toString(a));	//列印陣列
        Arrays.fill(a,8);	//填充8
        System.out.println(Arrays.toString(a));	//列印陣列
    }
}

列印結果

[I@34a245ab
[3, 515, 2521, 111, 224, 845, 31313, 2545, 45, 88]
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8]


排序

氣泡排序

import java.util.Arrays;
public class Demo05 {
    public static void main(String[] args) {
        int[] a = {3,515,2521,111,224,845,31313,2545,45,88};
        System.out.println(Arrays.toString(a));
        sequence(a);
        System.out.println(Arrays.toString(a));
    }
    public static void sequence(int[] array) {
        for( int i=0 ; i<array.length-1 ; i++) {
            boolean flag = true;
            for( int j=0 , tmp = 0; j<array.length-i-1 ; j++) {
                if ( array[j] > array[j+1]) {
                    tmp = array[j] ;
                    array[j] = array[j+1] ;
                    array[j+1] = tmp;
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }
}

輸出結果

[3, 515, 2521, 111, 224, 845, 31313, 2545, 45, 88]
[3, 45, 88, 111, 224, 515, 845, 2521, 2545, 31313]

只需要修改第10行中的'<'為‘>’就是逆向排序