Java面試中常考察線程和集合的知識,下面我們來分別介紹一下。
//例子1:創建線程的方式 //繼承Thread類 public class MyThread extends Thread { public void run() { System.out.println("繼承Thread類創建線程"); } } //實現Runnable接口 public class MyRunnable implements Runnable { public void run() { System.out.println("實現Runnable接口創建線程"); } } //主函數中創建線程,兩種方式都可以 public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); MyRunnable myRunnable = new MyRunnable(); new Thread(myRunnable).start(); }
線程的生命周期:新建、運行、阻塞、等待、超時等待、終止。線程的狀態可由Thread類的getState()方法獲取。
線程間的通信方式:共享變量、wait()、notify()、notifyAll()等,其中wait()、notify()、notifyAll()應與synchronized關鍵字一起使用。
//例子2:使用synchronized關鍵字控制線程訪問共享變量 public class SynchronizedDemo { private int count = 0; public synchronized void increase() { count++; } public static void main(String[] args) { SynchronizedDemo demo = new SynchronizedDemo(); for (int i = 0; i < 10; i++) { new Thread(() -> { for (int j = 0; j < 1000; j++) { demo.increase(); } }).start(); } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(demo.count); } }
Java集合框架包括List、Set、Map三種各自的接口和對應的實現類。其中List按照索引位置有序存儲元素,Set不允許重復元素,Map存儲鍵值對。常用的實現類有ArrayList、LinkedList、HashSet、TreeSet、HashMap和TreeMap等。
//例子3:使用集合操作實現查找重復元素 public class CollectionDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("java"); list.add("python"); list.add("c++"); list.add("java"); list.add("go"); Set<String> set = new HashSet<>(); List<String> result = new ArrayList<>(); for (String item : list) { if (!set.add(item)) { result.add(item); } } System.out.println(result); } }