Java 相關問題

Posted by Adam on August 24, 2022
### Clob 轉換成 String ```java import java.sql.Clob; import java.sql.SQLException; ``` ```java private String toString(Clob clob) throws SQLException { return null == clob ? "" : clob.getSubString(1, (int)clob.length()); } ``` #### Supplier 無參數有回應 ```java import java.util.function.Supplier; public class Main { public static void main(String[] args) { Supplier<Object> randomNumber = () -> (int)(Math.random() * 10); System.out.println(randomNumber.get()); // 9 } } ``` #### Predicate 有參數 Boolean 回應 ```java import java.util.function.Predicate; public class Main { public static void main(String[] args) { Predicate<String> isMail = (a) -> a.matches("^[_a-z0-9-]+([.][_a-z0-9-]+)*@[a-z0-9-]+([.][a-z0-9-]+)*$"); System.out.println(isMail.test("abc123@abc.com")); // true } } ``` #### Function 有參數有回應 ```java import java.util.function.Function; public class Main { public static void main(String[] args) { Function<String, Integer> toInt = (a) -> Integer.valueOf(a); int a = toInt.apply("198"); System.out.println(a); // 198 } } ``` #### Consumer 有參數無回應 ```java import java.util.function.Consumer; public class Main { public static void main(String[] args) { Consumer<String> printer = (a) -> System.out.println(a); printer.accept("result: " + 198); // result: 198 } } ``` ### [get Thread ID](https://stackoverflow.com/questions/61207226/logging-thread-id-instead-of-thread-name-using-logback) ```java Thread.currentThread().getId() ``` ### Interface 預設函式 自 Java 8 開始,Java 中的 interface 已經可以定義預設實現的方法。這些方法可以直接在 interface 中定義,不需要在實現類中重寫。以下是一個簡單的例子: ```java public interface MyInterface { default void myMethod() { System.out.println("Default implementation of myMethod in MyInterface"); } } ``` 如果需要,在實現類中也可以重寫預設實現的方法,例如: ```java public class MyOtherClass implements MyInterface { @Override public void myMethod() { System.out.println("Custom implementation of myMethod in MyOtherClass"); } } ``` ### 棄用 @Deprecated ```java public class DeprecatedExample { @Deprecated public static final String DEPRECATED_FIELD = "This field is deprecated"; public static final String NEW_FIELD = "This field is not deprecated"; @Deprecated public void deprecatedMethod() { // 這個方法已經棄用 } public void newMethod() { // 新方法的實現 } } ``` ```java public interface DeprecatedInterface { @Deprecated void deprecatedMethod(); void newMethod(); } ``` ### Runtime & Process 當你在 Java 中使用 `Runtime` 類及 `Process` 時,可以執行外部命令並與其進行交互。以下是一個簡單的例子,演示如何使用 `Runtime` 類及 `Process` 來執行 Linux 中的 `ls` 命令並輸出其結果: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ExecuteCommand { public static void main(String[] args) { try { // 使用 Runtime 創建新的進程 Process process = Runtime.getRuntime().exec("ls"); // 獲取進程的輸出流 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; // 讀取輸出並輸出到控制台 while ((line = reader.readLine()) != null) { System.out.println(line); } // 等待命令執行完成 int exitCode = process.waitFor(); System.out.println("Command executed with exit code: " + exitCode); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 在這個例子中,我們使用 `Runtime.getRuntime().exec("ls")` 創建一個新的進程來執行 `ls` 命令。然後,我們使用進程的輸出流來獲取命令的輸出,並將其輸出到控制台。 請注意,這只是一個簡單的例子,你可以根據你的需求修改命令和處理輸出的方式。另外,請注意,`exec()` 方法也可以接受一個字串數組,例如 `exec(new String[]{"ls", "-l"})`,這樣可以更靈活地指定命令及其參數。 ### IOUtils.readLines 以下是一個使用 Apache Commons IO 库的 IOUtils readLines 方法讀取網站上的文本文件的示例: ```java import org.apache.commons.io.IOUtils; import java.net.URL; import java.io.IOException; import java.util.List; public class ReadWebsiteTxt { public static void main(String[] args) { String url = "http://example.com/example.txt"; // 替換為實際網站上的 txt 文件 URL try { // 使用 URL 類來打開網站上的連接 URL website = new URL(url); // 使用 IOUtils readLines 方法讀取文本文件的內容 List<String> lines = IOUtils.readLines(website.openStream(), "UTF-8"); // 輸出讀取到的每一行文本內容 for (String line : lines) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } ``` 請確保將 `url` 變量替換為實際的網站上的 txt 文件的 URL。這段代碼將讀取該網站上的 txt 文件的內容並將其打印到控制台。 ### do-while 下面是一個使用do-while迴圈的Java範例: ```java public class DoWhileExample { public static void main(String[] args) { int i = 1; // 使用 do-while 迴圈列印數字 1 至 10 do { System.out.println(i); i++; } while (i <= 10); } } ``` 這個程式將會列印出數字1到10,因為do-while迴圈的特性是先執行一次迴圈內的程式塊,然後再檢查迴圈的條件。即使迴圈的條件為false,也至少會執行一次。在這個例子中,我們初始化變數i為1,然後使用do-while迴圈顯示i的值,每次迴圈結束後使i增加1,直到i大於10為止。 ### java -Xms256m -Xmx1024m -Xms256m 與 -Xmx1024m 分別是設定 Java 程式的初始記憶體和最大記憶體大小的選項。 -Xms 表示設定程式啟動時初始分配的記憶體大小,這樣程式啟動後就會立即分配指定大小的記憶體給程式使用。 -Xmx 表示設定程式運行時可以分配的最大記憶體大小,當程式執行期間需要更多的記憶體時,系統會分配最多指定大小的記憶體給程式使用。 總結來說,-Xms 設定程式啟動時的初始記憶體大小,-Xmx 設定程式運行時的最大記憶體大小。 ### 兩個集合取交集 在 Java 中,可以使用 Set 的 retainAll() 方法來取兩個 Set 的交集。這個方法會修改呼叫者的 Set,使其只包含兩個 Set 的交集元素。 例如: ```java Set<Integer> set1 = new HashSet<>(); set1.add(1); set1.add(2); set1.add(3); Set<Integer> set2 = new HashSet<>(); set2.add(2); set2.add(3); set2.add(4); set1.retainAll(set2); System.out.println(set1); // 將只會包含 2 和 3 ``` 這樣,set1 中的元素將只包含兩個 Set 的交集元素,即 2 和 3。 ### BitSet BitSet是Java中用來表示位元集合(或稱位元向量)的類別。它可以有效地壓縮大量的布林值,並提供了方便的位元操作方法。 BitSet類別提供了一系列方法來設置、清除、翻轉和檢查位元的值。這些方法包括set()、clear()、flip()和get()等。此外,BitSet還提供了一些方便的方法來進行位元集合之間的操作,例如and()、or()、xor()等。 在使用BitSet時,我們可以根據自己的需求來代表一個位元集合,並進行相應的位元操作。BitSet的方法和操作都是高效、方便且易於理解的,可以幫助我們處理與位元相關的問題。 總的來說,BitSet是一個在Java中用來表示位元集合的強大工具,可以幫助我們簡化處理位元操作的任務。 ```java import java.util.BitSet; public class Main { public static void main(String[] args) { BitSet bitSet = new BitSet(8); // 建立一個有8個元素的BitSet // 設置第1、3、5、7個元素為true bitSet.set(1); bitSet.set(3); bitSet.set(5); bitSet.set(7); // 輸出bitSet的內容 System.out.println("BitSet: " + bitSet); // BitSet: {1, 3, 5, 7} // 清除第3、5個元素 bitSet.clear(3); bitSet.clear(5); // 輸出修改後的bitSet內容 System.out.println("Modified BitSet: " + bitSet); // Modified BitSet: {1, 7} // 檢查第5個元素是否為true if (bitSet.get(5)) { System.out.println("第5個元素為true"); } else { System.out.println("第5個元素為false"); // 第5個元素為false } // 設置所有元素為false bitSet.clear(); // 輸出清空後的bitSet內容 System.out.println("Cleared BitSet: " + bitSet); // Cleared BitSet: {} BitSet bitSet1 = new BitSet(); BitSet bitSet2 = new BitSet(); // 設定bitset1中的位元 bitSet1.set(0); bitSet1.set(2); bitSet1.set(4); bitSet1.set(6); // 設定bitset2中的位元 bitSet2.set(1); bitSet2.set(3); bitSet2.set(5); bitSet2.set(6); // 顯示bitset1中的值 System.out.println("BitSet1: " + bitSet1); // BitSet1: {0, 2, 4, 6} // 顯示bitset2中的值 System.out.println("BitSet2: " + bitSet2); // BitSet2: {1, 3, 5, 6} // 取得bitset1和bitset2的聯集 bitSet1.or(bitSet2); System.out.println("BitSet1 OR BitSet2: " + bitSet1); // BitSet1 OR BitSet2: {0, 1, 2, 3, 4, 5, 6} // 取得bitset1和bitset2的交集 BitSet intersection = (BitSet) bitSet1.clone(); intersection.and(bitSet2); System.out.println("BitSet1 AND BitSet2: " + intersection); // BitSet1 AND BitSet2: {1, 3, 5, 6} } } ``` ### TreeMap ```java import java.util.*; public class Main { public static void main(String[] args) { TreeMap<Integer, String> treeMap = new TreeMap<>(); treeMap.put(3, "Apple"); treeMap.put(1, "Banana"); treeMap.put(2, "Orange"); System.out.println("TreeMap:"); // TreeMap: for (Map.Entry<Integer, String> entry : treeMap.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } // Key: 1, Value: Banana // Key: 2, Value: Orange // Key: 3, Value: Apple System.out.println("\nFirst Key: " + treeMap.firstKey()); // First Key: 1 System.out.println("Last Key: " + treeMap.lastKey()); // Last Key: 3 System.out.println("\nRemoving key 2"); // Removing key 2 treeMap.remove(2); for (Map.Entry<Integer, String> entry : treeMap.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } // Key: 1, Value: Banana // Key: 3, Value: Apple } } ``` ### StringEscapeUtils Apache StringEscapeUtils 是一個用於處理字串的工具類,可以對字串進行 HTML、Java、JavaScript、XML等不同格式的轉義操作。以下是一個使用範例: ```java import org.apache.commons.lang3.StringEscapeUtils; public class StringEscapeUtilsExample { public static void main(String[] args) { // HTML 轉義 String html = "<script>alert('XSS attack');</script>"; String escapedHtml = StringEscapeUtils.escapeHtml4(html); System.out.println("Escaped HTML: " + escapedHtml); // Java 字符串轉義 String java = "This is a text with \"quotes\""; String escapedJava = StringEscapeUtils.escapeJava(java); System.out.println("Escaped Java: " + escapedJava); // JavaScript 字符串轉義 String javascript = "This is a text with 'quotes'"; String escapedJavaScript = StringEscapeUtils.escapeEcmaScript(javascript); System.out.println("Escaped JavaScript: " + escapedJavaScript); // XML 轉義 String xml = "<root>value</root>"; String escapedXml = StringEscapeUtils.escapeXml10(xml); System.out.println("Escaped XML: " + escapedXml); } } ``` 以上範例展示了如何使用 Apache StringEscapeUtils 對字串進行 HTML、Java、JavaScript、XML格式的轉義操作。可以根據需要選擇不同的方法來轉義字串,以確保字串在不同環境下的安全使用。