:::spoiler Java 其他補充資源 : https://hackmd.io/@camiol/By5H1aL0Y <details> <summary> String、StringBuilder 和 StringBuffer 的區別 </summary> - String:不可變的字符串,每次操作都會創建新對象 - StringBuilder:可變字符串,執行緒不安全,但性能最好 - StringBuffer:可變字符串,執行緒安全,性能比 StringBuilder 稍差 </details> 1 <details> <summary> equals() 和 == 的區別 </summary> - equals():比較物件的內容值是否相等 (需要類別覆寫 equals 方法) - ==: - 基本類型:比較值是否相等 - 引用類型:比較內存地址是否相等 - 補充說明:== 是比較儲存的值, 基本型別是儲存在Stack中,因此值是相同的。 字串是儲存在字串池(String Pool)中, 在Stack當中存的是址的值, 因此採用==比較時會對比就是址的值。 <details> <summary> 補充 字串池 機制 </summary> Java的字串有字串池機制,當宣告一個新的字串時, Java會先去字串池中尋找是否有相同的字串, 如果有則會使用原本舊有的字串,沒有時才會新增一個新的字串。 如此一來,如果都是用String s1=”Hello World;” 這種方式宣告新的字串, String s2=”Hello World”;的址的值會與s1一樣。 值得注意的是,如果是用new來宣告, 如:String s3=new String(”Hello World”);這種方式, 則s3這個字串會存在Heap中,與s1、s2的址的值是不同的, 這時候使用==就會是false。 </details> </details> <details> <summary> HashMap 和 ConcurrentHashMap 的區別 </summary> - HashMap: - 非執行緒安全 - 允許 key 和 value 為 null - 性能較好 - ConcurrentHashMap: - 執行緒安全,使用分段鎖機制 - 不允許 key 或 value 為 null - 支持高並發操作 </details> <details> <summary> Arrays跟ArrayList的區別 </summary> - Arrays可包含原始(primitive)及物件(object), ArrayList只允許物件 - Arrays大小固定,ArrayList可以動態調整 - ArrayList提供較多方法,如removeAll、iterator(迭代器) </details> <details> <summary> stack跟heap區別 </summary> - stack: 可被預測生命週期的變數或函數資訊都放在stack, 例如區域變數(local variable)、物件或陣列的 返回位址(function/method return address)等資訊。 - heap: 動態配置的記憶體空間,放置被new出來的物件 以及內含的成員變數及方法。 </details> <details> <summary> Int以及Integer何者會占用更多記憶體? </summary> - Integer會占用較多記憶體,Integer是一個物件, 會在Heap中儲存,並儲存址的值於Stack中, - 而Int只會保存值在Stack中,因此Int占用資源較少。 </details> <details> <summary> a=a+b與a+=b的區別為何? </summary> a+=b會先將資料型別提升至少至int型別, 而a=a+b則不會,因此如果今天將a與b都宣告為byte型別, 相加超過127時就會產生錯誤。 </details> <details> <summary> Overload和Override區別? </summary> - 多載(Overload):指在一個類別(class)中, 定義多個名稱相同,但參數(Parameter)不同的方法(Method)。 - 覆寫(Override):指子類別可以覆寫父類別的方法內容, 使該方法擁有不同於父類別的行為。 </details> <details> <summary> Java 的多型? </summary> - 多型(Polymorphism)是指父類別可透過子類別衍伸成多種型態, 而父類別為子類別的通用型態,再透過子類別可覆寫父類別的方法 來達到多型的效果,也就是同樣的方法名稱會有多種行為。 - 向上轉型:父類引用指向子類對象 ```java= class Animal { void makeSound() { } } class Dog extends Animal { void makeSound() { System.out.println("Woof"); } } Animal animal = new Dog(); // 向上轉型 ``` ```java= polymorphism(多型)、overriding(覆寫)、overloading(多載) // Superclass(父類別) class Animal(){ void sound(){ } } // Subclass(子類別) class Dog extends Animal{ // 覆寫 Animal.sound() void sound(){ 汪汪; } // 多載 Dog.sound() void sound(int i){ } // 多載 Dog.sound() void sound(String s, int i){ } } // Subclass(子類別) class Cat extends Animal{ // 覆寫 Animal.sound() void sound(){ 喵喵(); } } // main void main(){ // 以父類建立具有子類方法的物件 Animal dog = new Dog(); Animal cat = new Cat(); // 以子類建立具有父類方法的物件,執行產生錯誤(runtime error) Dog d = (Dog)new Animal(); .. .. dog.sound(); // 將會執行"汪汪(); } ``` </details> <details> <summary> Java 中如何實現執行緒安全 </summary> - synchronized 關鍵字(方法或代碼塊) - volatile 關鍵字 - Lock 介面的實現類(ReentrantLock等) - 執行緒安全的集合類(ConcurrentHashMap、Vector等) - Atomic原子類(AtomicInteger等) - ThreadLocal <details> <summary> synchronized 補充說明 </summary> 使用原因: 在程式的某些危險區域,不同執行緒可能同時 存取同一份資源而產生衝突或重複修改 使用目的: 控制每次只能有一個執行緒再使用同一份資源, 此時另外的執行緒”無法同時” 使用此同一份資源 1. 在方法宣告中加入synchronized關鍵字 2. 或程式區塊以synchronized標示 3. 或類別資料以synchronized標示 </details> </details> <details> <summary> final、finally 和 finalize 的區別 </summary> - final: 是一種**修飾關鍵字** - 加在**類別**前則該類別**不能被繼承** - 加在**方法**前則該方法**不能被覆寫** - 加在**變數**前該變數為**常數** - finally: 是一個例外處理關鍵字,寫在catch最後面, try-catch 後必執行的代碼塊,主要功用是做資源釋放。 - finalize:對象被垃圾回收前調用的方法, 是一種Object類的方法, 因此是所有類別都有的方法(所有類繼承Object), 當物件要被銷毀前,會執行的方法, 此外可以透過System.gc呼叫資源回收。 </details> <details> <summary> throw與throws的區別 </summary> - throw關鍵字通常用在設計方法中, 預先宣告可能會產生的例外, 後續方法使用者需要使用try-catch處理例外, 或者使用throws關鍵字再拋出例外 - throw關鍵字用於方法內部拋出異常 - throw關鍵字後面只能有一個異常 - throws關鍵字通常被應用在聲明方法時, 放在方法的大括號前,用來拋出異常,多個異常可以使用逗號隔開。 後續使用者要調用方法時必須要拋出異常或者使用try-catch語句 處理異常。 - throws用於方法聲明上拋出異常 - throws 可以聲明多個異常 </details> <details> <summary> Java 中的異常處理機制 checked 和 unchecked 異常的區別? </summary> - Checked Exception: - 編譯時必須處理 - 例如:IOException, SQLException - 繼承自 Exception - Unchecked Exception: - 運行時異常 - 例如:NullPointerException, ArrayIndexOutOfBoundsException - 繼承自 RuntimeException </details> <details> <summary> 什麼是死鎖?如何避免? </summary> 死鎖是指兩個或多個執行緒互相等待對方持有的資源。 避免方法: - 按順序申請資源 - 設置超時時間 - 使用 tryLock() - 避免嵌套鎖 ```java= // 按固定順序申請資源 synchronized(lockA) { synchronized(lockB) { // TODO } } // 使用 tryLock 設定超時 Lock lockA = new ReentrantLock(); if (lockA.tryLock(1000, TimeUnit.MILLISECONDS)) { try { // TODO } finally { lockA.unlock(); } } ``` </details> <details> <summary> 介面和抽象類別 有什麼差別? </summary> - 介面: - 只能有常數和抽象方法 (Java 8後介面可以有默認方法(default)) - 可以多個實現 - 方法默認 public abstract - 屬性默認 public static final - 抽象類: - 可以有普通屬性、方法和構造函數 - 只能單個繼承 - 可以有訪問修飾符 抽象類別中可以宣告抽象方法,提供子類別實作。 介面中的方法必定是抽象方法。 但是一個類別僅能繼承一個抽象類別, 可以實作多個介面,達到類似多重繼承效果。 </details> <details> <summary> List、Set、Map區別 </summary> - List: 1.有順序性(索引值) 2.可重複 3.ArrayList實作了List介面 4.ArrayList : 插入、刪除速度慢,走訪速度快 5.LinkedList : 插入、刪除速度快,走訪速度慢,雙向連結 - Set: 1.無順序性(搭配迭代器) 2.不可重複、搜尋速度快 3.HashSet實作了Set介面 4.HashSet : 無順序性,查找速度快 5.LinkedHashSet : 有順序性 6.TreeSet : 有排序性(依字母) - Map: 1.有元素鍵值(Key-Value),搜尋快 2.元素可重複,鍵值如果重複新加入值會覆蓋舊有值 3.HashMap : 查找速度慢,插入刪除速度快 4.TreeMap : 有排序性 </details> <details> <summary> 在Java裡面 1/0 , 0/0 會發生什麼事? </summary> - 如果整數相除,分母為0會產生例外ArithmeticException - 如果是浮點數,分母為0.0,不會有例外不會進到catch, 結果為無窮 Infinite </details> <details> <summary> Java 8 Stream API 常用方法? </summary> - collect 收集 將 Stream 轉換為其他形式的集合 ```java= List<String> list = stream.collect(Collectors.toList()); // 轉成 List Set<String> set = stream.collect(Collectors.toSet()); // 轉成 Set Map<String, String> map = stream.collect(Collectors.toMap()); // 轉成 Map ``` - filter 過濾 根據條件過濾元素 ```java= List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // 只保留偶數 .collect(Collectors.toList()); // 結果:[2, 4] ``` - reduce 歸納 將所有元素組合成一個結果 ```java= List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .reduce(0, (a, b) -> a + b); // 計算總和:15 ``` - sorted 排序 對元素進行排序 ```java= List<String> names = Arrays.asList("Charlie", "Alice", "Bob"); List<String> sortedNames = names.stream() .sorted() // 按字母順序排序 .collect(Collectors.toList()); // 結果:[Alice, Bob, Charlie] ``` - distinct 去重 去除重複元素 ```java= List<Integer> numbers = Arrays.asList(1, 1, 2, 2, 3); List<Integer> uniqueNumbers = numbers.stream() .distinct() // 去除重複 .collect(Collectors.toList()); // 結果:[1, 2, 3] ``` - flatMap 扁平化 將多個集合合併成一個集合 ```java= List<List<Integer>> nestedNumbers = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4) ); List<Integer> flatNumbers = nestedNumbers.stream() .flatMap(List::stream) // 將嵌套列表展平 .collect(Collectors.toList()); // 結果:[1, 2, 3, 4] ``` - forEach 跌代 對每個元素執行操作 ```java= List<String> names = Arrays.asList("Alice", "Bob"); names.stream() .forEach(name -> System.out.println(name)); // 印出每個名字 ``` - count 計數 計算元素個數 ```java= List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); long count = numbers.stream() .count(); // 結果:5 ``` - min/max 最小值/最大值 找出最小或最大的元素 ```java= List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> min = numbers.stream() .min(Integer::compareTo); // 最小值:1 Optional<Integer> max = numbers.stream() .max(Integer::compareTo); // 最大值:5 ``` - anyMatch/allMatch/noneMatch 匹配判斷 - anyMatch:是否存在符合條件的元素 - allMatch:是否所有元素都符合條件 - noneMatch:是否沒有元素符合條件 ```java= List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); boolean hasEven = numbers.stream() .anyMatch(n -> n % 2 == 0); // 是否有偶數:true boolean allEven = numbers.stream() .allMatch(n -> n % 2 == 0); // 是否全部是偶數:false boolean noNegative = numbers.stream() .noneMatch(n -> n < 0); // 是否沒有負數:true ``` 可以組合使用,例如: ```java= List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 4, 5); List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) // 過濾偶數 .distinct() // 去重 .sorted() // 排序 .collect(Collectors.toList()); // 結果:[2, 4] ``` 最後來總匯一下 : ```java= List<String> list = Arrays.asList("a", "b", "c"); list.stream() .filter(s -> s.startsWith("a")) // 過濾 .map(String::toUpperCase) // 轉換 .sorted() // 排序 .distinct() // 去重 .collect(Collectors.toList()) // 收集 .forEach(System.out::println); // 遍歷 ``` </details> <details> <summary> MVC 是什麼?以及MVC架構的優點與缺點? </summary> MVC是程式設計的一種架構方法, 主要涵蓋模型(Model)、視圖(View)和控制器(Controller)。 - 模型(Model): 程式設計師編寫程式應有的功能, 資料庫專家進行資料管理和資料庫設計(可以實現具體的功能) Model主要負責資料存取。 - 視圖(View): 介面設計人員進行圖形介面設計。 View主要負責顯示資料。 - 控制器(Controller): 負責轉發請求,對請求進行處理。 Controller主要負責處理訊息。 **優點** 1.好維護、方便擴充 2.控制器與 Model 和 View 保持相對獨立, 所以可以方便的改變應用程式的資料層和業務規則。 3.多個 View 能共享一個 Model,大幅度提高程式重複使用性。 **缺點** 1.開發時間長 2.分層細 </details> <details> <summary> sendRedirect() 、 forward(request,response)的差別 </summary> - forward 1.定義在RequestDispatcher的介面, 由request.getRequestDispatcher呼叫 2.內部轉址,url不會顯示程式名稱(可設定成參數) 3.可透過setAttribute傳遞參數(因為是內部傳址) 4.效率高 5.適用於權限管理轉頁時使用 - sendRedirect() 1.定義在HttpServletResponse 2.直接外部呼叫另一支程式,會顯示程式名稱 3.效率較低(因為client會在request一次) 4.適用於跳到外部網站或回主畫面使用 </details> <details> <summary> JSP隱含物件有哪些? </summary> 1.request 2.response 3.out 4.session 5.application 6.config 7.pageContext 8.page 9.Exception </details> ::: --- :::spoiler SQL <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> ::: --- :::spoiler 其他.. <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> <details> <summary> ... </summary> ... </details> ::: ---