---
tags: Java
---
# Java -- 陣列與字串
## 陣列
* 陣列:把相同資料型態的變數集合起來,以一個名稱來代表,使用索引值存取元素,每一個元素相當於是一個變數
* 索引從"0"開始,指向陣列第一個變數值
## 一維陣列
### 宣告
:::info
```java=
type[ ] array_identifier;
```
* type 表示儲存在陣列中的值為基本資料型態或是物件型態
* [ ] 用來告知編譯器,你所宣告的是一維陣列參考
* array_identifier 是你指派給陣列的名稱
:::
### 實例化
:::info
```java=
array_identifier = new type [length]
```
* 使用 new 關鍵字來建立一維陣列
* length 用來表示陣列的大小(元素的數目)
:::
### 存取
:::info
```java=
array_identifier[index] = value;
```
* array_identifier 是陣列的名稱
* index 表示該值將被放置在陣列中的位置
* value 為要指派至陣列 index 位置的值
:::
範例:
int[ ] arr = new int [3]
arr[0] = 1;
arr[1] = 2;
### 宣告、實例化及初始化
:::info
```java=
type[ ] array_identifier = {,分隔的值或運算式} ;
```
:::
範例:
int[ ] arr = {1, 2, 3};
### 走訪
1. for 迴圈
2. foreach 迴圈
:::info
```java=
for(元素型態 迴圈控制變數:集合或陣列名稱)
// 迴圈主體;
```
:::
>參考資料
>* [Java for-each迴圈的用法](https://lakesd6531.pixnet.net/blog/post/342603565-java-for-each%E8%BF%B4%E5%9C%88%E7%9A%84%E7%94%A8%E6%B3%95)
> * [深入理解java中for和foreach迴圈](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/316073/)
範例:
![](https://i.imgur.com/4hVIunH.png)
![](https://i.imgur.com/eSEQqWI.png)
> 參考資料:
> * [JAVA-一維陣列](http://www.codedata.com.tw/book/java-basic-source/ch10-1.htm)
## 二維陣列
### 宣告
:::info
```java=
type[ ][ ] array_identifier;
```
* type 表示儲存在陣列中的值為基本資料型態或是物件型態
* [ ][ ]用來告知編譯器,你宣告的是二維陣列參考
* array_identifier 是你指派給陣列的名稱
:::
### 實例化
:::info
```java=
array_identifier = new type [number_of_arrays][length]
```
* number_of_arrays 為 array_identifier 陣列中擁有的一維陣列數量
* length 是 array_identifier 中每個一維陣列的長度
:::
### 存取
:::info
```java=
array_identifier[left index][right index] = value;
```
* 第一個索引值代表列 (Row)
* 第二個索引值代表行 (Column)
:::
### 宣告、實例化及初始化
:::info
```java=
type[ ][ ] array_identifier = {{,分隔的值或運算式},{,分隔的值或運算式}};
```
:::
### 走訪
1. 巢狀 for 迴圈
2. 巢狀 foreach 迴圈
範例:
![](https://i.imgur.com/W6sB6Sd.png)
> 參考資料:
> * [JAVA-二維陣列](http://www.codedata.com.tw/book/java-basic-source/ch10-2.htm)
## 字串
* Java字串為String物件
* 字串內容不能更改,一旦建立字串後,就無法改變其值。只能重新指定成新的字串字面值或另一個字串變數
* String 類別是 Java 標準類別庫眾多類別的其中之一,能夠提供儲存一連串的字元(陣列)
* 以雙引號" "包括的文字,編譯器會建立 String 物件來表示該文字
### 使用 String 類別建構
:::info
```java=
String 字串參考名稱 = "字串實例";
```
:::
* 直接使用雙引號包括所產生的 String 物件,在程式運行期間將一直存在於 String 儲存池中,雙引號包括的字串只要是字元內容相同,都會重複使用 String 儲存池中的同一個 String 物件
範例:
```java=
public class StringDemo{
public static void main(String[] args){
String text1 = "Hello!";
String text2 = "Hello!";
System.out.println("Hello!" == "Hello!");
System.out.println(text1 == "Hello!");
System.out.println(text2 == "Hello!");
System.out.println(text1 == text2);
}
}
```
![](https://i.imgur.com/3mfc5zZ.png)
> 附註:當關係運算子"=="使用於兩個物件之比較時,目的是比較兩個物件是否為同一個物件,也就是比較是否存在同一個記憶體位置
![](https://i.imgur.com/f7U8ho5.png)
### 使用 new 關鍵字建構
:::info
```java=
String 字串參考名稱 = new String("字串實例")
```
:::
* 使用 new 建立的 String 實例是在運行時產生。與使用雙引號" "包括的文字,在運行時會以一個 String 實例存在於 String 儲存池中不同
範例:
```java=
public class NewString{
public static void main(String[] args){
String name1 = "Justin Lin";
String name2 = new String("Justin Lin");
System.out.println(name1 == "Justin Lin");
System.out.println(name2 == "Justin Lin");
System.out.println(name1 == name2);
}
}
```
![](https://i.imgur.com/sh0yv50.png)
![](https://i.imgur.com/daENCHW.png)
>參考資料
>* [JAVA-String 類別](http://www.codedata.com.tw/book/java-basic-source/ch9-1.htm)
### 字串處理
#### 字串長度與大小寫轉換
![](https://i.imgur.com/dWL1kWM.png)
#### 字元搜尋
![](https://i.imgur.com/ZLNMnAJ.png)
#### 子字串搜尋
![](https://i.imgur.com/lTdv7wN.png)
#### 子字串和字元處理
![](https://i.imgur.com/tqKbuvk.png)
#### 字串的比較
![](https://i.imgur.com/4bjtfyv.png)
範例:
![](https://i.imgur.com/4lL9KsH.png)
![](https://i.imgur.com/H8d7EDq.png)
### StringBuffer字串緩衝區類別
* StringBuffer字串緩衝區類別建立的 StringBuffer物件可以直接修改原字串的內容
* 一定要使用new運算子來建立物件
:::info
```java=
StringBuffer 字串參考名稱 = new StringBuffer("字串實例");
```
:::
#### 新增、反轉
![](https://i.imgur.com/WSfbY0I.png)
#### 插入、刪除、取代
![](https://i.imgur.com/CIzVScj.png)
範例:
![](https://i.imgur.com/xTichSU.png)
![](https://i.imgur.com/8n7TRG7.png)
### 數值與字串間的轉換
#### 字串轉數值
![](https://i.imgur.com/aE4K8Mp.png)
範例:
![](https://i.imgur.com/nmawfsY.png)
![](https://i.imgur.com/BfIDfNg.png)
#### 數值轉字串
![](https://i.imgur.com/Jxx3Rqs.png)
範例:
![](https://i.imgur.com/joqPrEC.png)
![](https://i.imgur.com/0vj9jJl.png)
### 字串物件陣列
範例:
![](https://i.imgur.com/0qPb9fm.png)
![](https://i.imgur.com/MZGi4OH.png)
### 泡沫排序法(Bubble Sort)
* 陣列依序兩兩比較交換
範例:
![](https://i.imgur.com/25tC7AZ.png)
![](https://i.imgur.com/EF5NECP.png)
### 線性搜尋法(Sequential Search)
* 從陣列的第1個元素開始走訪整個陣列,一個一個比較是否有搜尋值
範例:
![](https://i.imgur.com/yaoFdRA.png)
![](https://i.imgur.com/aZVeCVE.png)
![](https://i.imgur.com/OP5GvIx.png)
### 二元搜尋法(Binary Search)
* 資料需要是已經排好序的資料
* 分割資料的搜尋方法:
先檢查排序資料的中間元素,如果等於鍵值就是找到;如果小於鍵值,表示資料是在前半段,否則在後半段。然後繼續分割的半段資料重覆上述操作,直到找到或已經沒有資料可以分割為止
範例:
![](https://i.imgur.com/KCmRzMF.png)
![](https://i.imgur.com/u48jJs2.png)
![](https://i.imgur.com/UEhy3wL.png)
### 練習
一. 請建立 Java 語言的 reverse() 類別方法,可以將陣列元素反轉,索引 0 的元素成為最後一個索引值,最後一個索引元素成為第一個元素。
```java=
public class Ch6a {
// 類別方法:reverse
private static void reverse(int[] arr){
int i, temp;
int j = arr.length ;
for ( i=0; i < j/2; i++ ){
temp = arr[i];
arr[i] = arr[j-1-i];
arr[j-1-i] = temp;
}
}
// 主程式
public static void main(String[] args) {
int[] arr = {1,2,10,7,8,9,5};
int i;
System.out.print("原始陣列: ");
for ( i = 0; i < arr.length; i++ )
System.out.print("[" + arr[i] + "]");
System.out.print("\n");
reverse(arr);
System.out.print("反轉陣列: ");
for ( i = 0; i < arr.length; i++ )
System.out.print("[" + arr[i] + "]");
}
}
```
![](https://i.imgur.com/EmpL3an.png)
二. 請建立 Java 程式宣告一個 3X3 的二維陣列,陣列值是使用亂數產生,範圍為 1~100,再計算每一列的總和及平均。
```java=
public class Ch6b {
// 主程式
public static void main(String[] args) {
int i, j, sum;
float aver;
int [][] arr = new int [3][3];
System.out.println("3x3陣列:");
for ( j=0; j < arr.length; j++ ){
sum = 0;
aver = 0;
for ( i=0; i < arr[j].length; i++ ){
arr[j][i] = (int)(Math.random()*100+1);
System.out.print("["+ arr[j][i] + "]");
sum += arr[j][i];
aver = (float)sum / arr[j].length;
}
System.out.print("\t=> 小計:" + sum);
System.out.println(" 平均:" + aver);
}
}
}
```
![](https://i.imgur.com/hl1FPFp.png)
三. 請建立 getMax() 和 getMin() 類別方法,參數是 int 陣列,可以傳回陣列中的最大值和最小值,並且設計測試的 Java 程式,程式使用亂數產生 1~500 的陣列值。
```java=
public static int getMin( int[] arr ){
int i, j ,temp, min;
for ( j=arr.length; j>1; j-- ){
for ( i=0; i < j-1; i++ ){
if ( arr[i+1] < arr[i] ){
temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
}
}
}
i = 0;
min = arr[i];
return min;
}
public static int getMax( int[] arr ){
int i, j ,temp, max;
for ( j=arr.length; j>1; j-- ){
for ( i=0; i < j-1; i++ ){
if ( arr[i+1] < arr[i] ){
temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
}
}
}
j = arr.length;
max = arr[j-1];
return max;
}
// 主程式
public static void main(String[] args) {
int[] arr = new int[7];
int i;
System.out.print("陣列:");
for ( i=0; i < arr.length; i++ ){
arr[i] = (int)(Math.random()*500+1);
System.out.print("[" + arr[i] + "]");
}
System.out.print("\n");
int min = getMin(arr);
System.out.println("陣列最小值: " + min);
int max = getMax(arr);
System.out.println("陣列最大值: " + max);
}
}
```
![](https://i.imgur.com/XbDAV6M.png)