Array

23 April 2020

Java - Array

Array 本身是reference type,array裡面的element取決於data的base type 而已array為參數傳進function跟C依樣,裡面改,外面值也改。

int[5] a = new Int[5];
int[5]b = a;  // a和b指向同個地方,所以一邊改,另一邊也會改

Create Array

如果沒assign值,會用那個basetype的default value

1. double[] score = new double[5],跑for assign值
2. int[] a = {1,2,3}
score.length -> 5
score.length = 10 // invalid, 應該是因為宣告private之類的

注意如果是object array要注意,他是create 5個object variable,每個object variable要new給他一個object

Date[] d = new Date[5]
for(int i = 0 ; i < 5 ;i++)
    d[i] = new Date();

String object & character array

char array在print時像C一樣是string方式印出 char array和string object的轉換

char[] a = {'h','e','l','l','o'};
String s = new String(a,[st],[len]);
st : 從array哪個地方開始
len : 複製多長的array

Return array

跟return object依樣,因此不會像C一樣,function結束就被free掉,主因就是array產生方式適用new,所以data不是存在stack裡,他這個等於是return array的位址。

public static int[] test(int[] a){...}

for-each loop

有些特定的class(collection class)他並沒有index來使用for loop來iterate, 因此要使用這種方式,跟python很像

double[] a = new double[4];
for(double ele : a){...}

variable number of parameter

有些function像是max,min要找一堆數字中的最大最小的 第一個想法是包成array傳進來 第二個可以有variable number of paramter parameter傳入的特殊寫法

public static int test(int ... arg){
    int largest = Integer.INT_MIN;
    for(int ele : arg){
        largest = ele;
    }
    // or
    for(int i = 0 ; i < arg.length; i++)
}

privacy leak

因為Array本身也是object,如果element也是mutable object,很有可能發生privacy leak 因此要回傳array時,要new一個array,內部的元素每個也都要new

public Date[] getArr(){
    Date[] tmp = new Date[5];
    for(int i = 0 ; i < 5 ; i++)
        tmp[i] = new Date(a[i]);
    return tmp;
}

enum

產生一個type,值是自訂的
這個type的變數只能是enum內部宣告的其中一個值
可以用==來比較兩個workday type的變數值ㄧ不一樣

enum workday {Mon,Tue,Wen,...}; => 產生一個workday type
workday a = workday.Mon;
System.out.println(a) -> Mon 但這個不是String type!!!!

這個object有自己的method,見課本p.427

Multi-dimension Array

create array

char[][] a = new char[30][100];
a.length -> 30
a[i].length -> 100

Ragged arrays

java沒有限定一定要 a[3][5]這樣的格式,

可以宣告a[3][] 
int[][] a = new int[3][];
a[0] = new int[5] -> a[0][5]
a[1] = new int[4] -> a[1][4]
a[2] = new int[2] -> a[2][2] 
即每一層的數量可以不同

argument

public static int[][] show(int[][] a){...}