---
# System prepended metadata

title: Java 基本概念
tags: [Java]

---

# Java 基本概念

### 變數輸入

需要先建立 `Scanner` 物件：

```java
import java.util.Scanner;
Scanner scn = new Scanner(System.in);

int num1 = scn.nextInt();
float num2 = scn.nextFloat();
double num3 = scn.nextDouble();
String str1 = scn.next(), str2 = scn.nextLine();
char ch = scn.next().charAt(0); // 輸入字串後取第一個位元
boolean bool = nextBoolean();
```



### 強制轉型

- 數值之間的轉換

  ```java
  num = (int)num;
  ```

- 涉及字串的轉型

  ```java
  // 數值(num)/字元(ch) to 字串(str)
  str = Integer.toString(num);
  str = Double.toString(num);
  str = Character.toString(ch);
  
  // 字串(str) to 數值(num)
  num = Integer.parseInt(str);
  num = Double.parseDouble(str);
  ```

  

### 字串處理

- 字串取位元：`char ch = str.charAt(i)`
- 判斷字串是否相同：`boolean isEqual = str1.equals(str2)`
- 根據某個字元找出它第一次在字串中出現的位置：`int index = str.indexOf(ch)`
- 字串合併：`str = str1 + str2`

其他功能如字串取代(replace)、插入字元(insert)、反轉字串(reverse)等功能需要使用`StringBuilder()`或`StringBuffer()`來處理，`String`類別本身沒有這些函式。

[參考連結](https://mycollegenotebook.medium.com/stringbuilder-%E7%9A%84%E4%BD%BF%E7%94%A8-b75300871c6f)



### Array vs. ArrayList

Array 是 Java 中的基本功能，而 ArrayList 就是 Collection Framework 的一部分。因此兩者有著完全不同的使用方式。

1. 創建方式不同

   **Array**
   是一個固定大小的Array。
   每次創建一個新的Array時，都需要為它設定一個大小；而且在創建後，是**不能再更改大小**。
   `int arr[] = new int[10]`

   **ArrayList**
   是一個可隨時更改大小的Array。
   每次創建一個新的Array時，不需要為它設定大小；因為在創建後，你**可以隨意更改它的大小**。
   另外，它是List interface的實作。
   `ArrayList<型別> arrList = new ArrayList<>()`



2. 新增元素及存取元素的方式不同

   Array 透過 `[]` 的方式新增元素而 ArrayList 透過 `add()`。
   Array 透過 `[]` 的方式存取元素而 ArrayList 透過 `get()`。

   ```java
   import java.util.ArrayList; 
   import java.util.Arrays; 
     
   class ArrayTest 
   { 
       public static void main(String args[]) 
       { 
           /* Array */
           int[] arr = new int[2]; 
   		// 新增元素到Array
           arr[0] = 1; 
           arr[1] = 2; 
   		// 存取元素
           System.out.println(arr[0]); 
     
           /*ArrayList*/
           ArrayList<Integer> arrL = new ArrayList<Integer>();
           // 新增元素到ArrayList 
           arrL.add(1); 
           arrL.add(2); 
     
           // 存取元素 
           System.out.println(arrL.get(0)); 
       } 
   }
   ```



### HashMap vs. HashSet

1. 建立空物件

   ```java
   HashMap<Integer, String> map = new HashMap<>();
   HashSet<String> set = new HashSet<>();
   ```

   

2. 相關功能

   ```java
   // HashMap
   map.put(key, value); // 新增
   map.remove(key); // 刪除
   String value = map.get(key); // 取值
   boolean exists = map.containsKey(key);
   boolean exists = map.containsValue(value);
   
   // HashSet
   set.add(element); // 新增
   boolean success = set.get(remove); // 刪除
   boolean exists = set.contains(element); // 是否存在
   ```



參考連結：[HashMap](https://www.geeksforgeeks.org/java-util-hashmap-in-java-with-examples/?ref=lbp)、[HashSet](https://www.w3schools.com/java/java_hashset.asp)



# Java 常見問題

- `package`的包裝必須在所有程式碼之前 (包含 `import`)

- Java 裡面沒有 vector

  可以改用 ArrayList 去實作類似功能

- Java 裡面，Array 與 List/ArrayList 型別無法直接以 `System.out.println()` 輸出，會出現亂碼

  印出 array 裡面所有數值的方法：

  ```java
  System.out.println(Arrays.toString(arr)); // 1D array
  System.out.println(Arrays.deepToString(arr)); // 2D array
  ```

- Java 檔名必須與 main class 名稱相同

  ```java
  public class Ax_xxxxxxxxx {
  	public static void main(String[] args) {
  		// TODO
  	}
  }
  ```

  這個檔案檔名必須是 `Ax_xxxxxxxxx.java`



# Java / C++ 容易搞混的部分

- `Array` vs. `ArrayList` vs. `String` 取得長度

  | 比較   | Java           | C++                            |
  | ------ | -------------- | ------------------------------ |
  | Array  | `arr.length`   | `arr.size()`                   |
  | List   | `list.size()`  | `list.size()`                  |
  | String | `str.length()` | `str.length()` 或 `str.size()` |

- 判斷字串是否相同：`str1.equals(str2)`

- C++ 的字串名稱是 `string`，Java 的字串名稱是 `String` (大小寫不一樣)