---
# System prepended metadata

title: 'Java 學習筆記 - 3-1: 陣列 Array'
tags: [Java 學習筆記]

---

###### tags: `Java 學習筆記`
# Java 學習筆記 - 3-1: 陣列 Array
表述相同型態的複數參考資料型態
## 宣告
```java=
int number; // 宣告一個變數，會存在 Steak 裡
int number[] = new int[7]; 
// 宣告一個陣列，該型態為宣告為 int 的陣列，和 scanner 一樣都是參考資料變數所以需要 new
// [7] 代表要分配給他七個 int 的空間存在 heap
// 仍會在 steak 中存該陣列在 heap 中的位置
```
## 應用
```java=
int number[]; // int[] number; 這個寫法也可以
number = new int[7];
number[0] = 9;
```
* 第三行: 把 9 這個數字存在第 0 格
* 如果印 number 會印出一串 address
* 所有資料型態都可以是陣列
* 在 steak 的不同變數/位置可以存一樣的 address 
* 整數型態的空間可以做運算，number[0]++; 得到 10
* 一個陣列會儲存在同一條連續的記憶體，陣列越長，記憶體長度需求越長，但現今技術會假裝讓他連續

### 把數值用迴圈從進陣列
```java=
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int number[];
number = new int[n];
for (int i = 0; i < n; i++) {
    number[i] = i + 1;
}
```

### 陣列初始化
```java=
int Ary1[] = new int[]{1,2,3,4};

int[] Ary2 = new int[]{1,2,3,4};

int Ary3[];
Ary3 = new int[]{1,2,3,4};

int[] Ary4;
Ary4 = new int[]{1,2,3,4};

int Ary1[] = {1,2,3,4}; // 如果沒有 new ，分兩行就會錯誤

int[] Ary2 = {1,2,3,4};
```
#### GC (Garbage Collect)
重新宣告一個陣列 (參考資料型態) 時，GC 就會被觸發：當一個實體沒有被任何變數連結，就會被釋放掉，但不一定會馬上觸發

### 搭配 Scanner 的用法
```java=
Scanner sc = new Scanner(System.in);
Scanner scanners[] = new Scanner[2];
scanners[0] = sc;
// 上下這兩行結果相同
int n = scanner[0].nextInt(); // 會把數值存到 n 裡
// 但這個時候 scanner[1] 沒有存掃描器，執行的話會報錯 "NullPointException"
```
* Null 代表空值，可用來節省空間
### 讓使用者輸入數值到 Array 中並限制輸入範圍
```java=
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr[] = new int[n];

for (int i = 0; i < arr.length; i++) {
    do {
        arr[i] = sc.nextInt();
    } while (arr[i] < 0 || arr[i] > 9);
}
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
```

### 在陣列中搜尋
#### 循序搜尋法
不規律的資料中，逐一搜尋
```java=
int arr[] = {1,2,3,4,5,63,6,7,0}
int key = 6;
for (int i = 0; i < arr.length; i++) {
    if (key == arr[i]) {
        System.out.println(key + "位於" + i)
    }
```


