# 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` (大小寫不一樣)