一、Java並發編程
Java中的並發編程指的是多個線程同時執行,需要解決線程安全問題。以下是Java中並發編程的相關面試題及答案。
1. 什麼是線程?
線程是指執行程序的一條執行路徑,每個線程有自己的棧和程序計數器。Java程序可以同時執行多條線程。
// 示例代碼: // 創建線程 Thread thread = new Thread(() -> { // 線程需要執行的任務 }); // 啟動線程 thread.start();
2. 什麼是線程安全?
線程安全是指多個線程並發訪問同一資源時,不會發生數據衝突、數據損壞等問題,保證程序能正確執行。為了保證線程安全,可以使用鎖機制,如synchronized關鍵字、Lock接口等。
3. 什麼是volatile關鍵字?
volatile關鍵字可以保證變量的可見性和有序性,保證只有一個線程修改變量時,其他線程可以及時看到變化。
public class VolatileTest { private volatile int num = 0; public void increase() { num++; } }
二、Java集合框架
Java集合框架包括了一系列接口、類和算法,用於存儲和操作一組對象。以下是Java中集合框架的相關面試題及答案。
1. ArrayList和LinkedList的區別是什麼?
ArrayList基於數組實現,支持快速隨機訪問元素;LinkedList基於鏈表實現,支持快速添加和刪除元素。
// ArrayList示例代碼: List list1 = new ArrayList(); list1.add("a"); list1.add("b"); list1.add("c"); for (String str : list1) { System.out.println(str); } // LinkedList示例代碼: List list2 = new LinkedList(); list2.add("a"); list2.add("b"); list2.add("c"); for (String str : list2) { System.out.println(str); }
2. HashSet和TreeSet的區別是什麼?
HashSet基於HashMap實現,不保證元素順序,查找效率高;TreeSet基於紅黑樹實現,支持自然排序和定製排序。
// HashSet示例代碼: Set set1 = new HashSet(); set1.add("a"); set1.add("b"); set1.add("c"); for (String str : set1) { System.out.println(str); } // TreeSet示例代碼: Set set2 = new TreeSet(); set2.add("a"); set2.add("b"); set2.add("c"); for (String str : set2) { System.out.println(str); }
3. HashMap和Hashtable的區別是什麼?
HashMap基於數組和鏈表實現,不保證元素順序,允許null值和null鍵;Hashtable基於數組和鏈表實現,保證元素順序,不允許null值和null鍵。
// HashMap示例代碼: Map map1 = new HashMap(); map1.put("a", 1); map1.put("b", 2); map1.put("c", 3); for (Map.Entry entry : map1.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } // Hashtable示例代碼: Map map2 = new Hashtable(); map2.put("a", 1); map2.put("b", 2); map2.put("c", 3); for (Map.Entry entry : map2.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); }
三、Java IO流
Java IO流是Java中實現輸入輸出功能的常用類庫,包括字節流、字符流、對象流等。以下是Java中IO流的相關面試題及答案。
1. FileInputStream和FileReader的區別是什麼?
FileInputStream是字節流,適用於讀取二進制文件;FileReader是字符流,適用於讀取文本文件。
// FileInputStream示例代碼: try (InputStream is = new FileInputStream("demo.txt")) { byte[] bytes = new byte[1024]; int len = -1; while ((len = is.read(bytes)) != -1) { String str = new String(bytes, 0, len, "UTF-8"); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } // FileReader示例代碼: try (Reader reader = new FileReader("demo.txt")) { char[] chars = new char[1024]; int len = -1; while ((len = reader.read(chars)) != -1) { String str = new String(chars, 0, len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); }
2. FileOutputStream和FileWriter的區別是什麼?
FileOutputStream是字節流,適用於寫入二進制文件;FileWriter是字符流,適用於寫入文本文件。
// FileOutputStream示例代碼: try (OutputStream os = new FileOutputStream("demo.txt")) { String str = "Hello, World!"; byte[] bytes = str.getBytes("UTF-8"); os.write(bytes); } catch (IOException e) { e.printStackTrace(); } // FileWriter示例代碼: try (Writer writer = new FileWriter("demo.txt")) { String str = "Hello, World!"; writer.write(str); } catch (IOException e) { e.printStackTrace(); }
3. ObjectInputStream和ObjectOutputStream的作用是什麼?
ObjectInputStream和ObjectOutputStream是Java中的對象序列化操作類,用於將對象轉換為字節流保存或讀取到文件中。
// ObjectInputStream和ObjectOutputStream示例代碼: public static void writeObject(String path, Object obj) throws IOException { try (OutputStream os = new FileOutputStream(path); ObjectOutputStream oos = new ObjectOutputStream(os);) { oos.writeObject(obj); } } public static Object readObject(String path) throws IOException, ClassNotFoundException { try (InputStream is = new FileInputStream(path); ObjectInputStream ois = new ObjectInputStream(is);) { return ois.readObject(); } } public static void main(String[] args) { // 寫入對象 Student student = new Student("張三", 18); try { writeObject("demo.obj", student); } catch (IOException e) { e.printStackTrace(); } // 讀取對象 try { Student stu = (Student) readObject("demo.obj"); System.out.println(stu.getName() + ":" + stu.getAge()); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } // Student類代碼 public class Student implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159613.html