在 Java 面試中,有幾個經典題目幾乎是必考項目。本文將針對 equals 與 == 的區別、適配器模式、抽象類與接口的差異、多線程安全與死鎖,以及 UDP/TCP 網絡編程流程 進行系統性梳理,幫助你快速掌握核心考點。
== 運算符:
• 基本類型:比較「值」是否相等。
• 引用類型:比較「引用地址」(即是否指向同一個對象)。
equals() 方法:
• 預設行為(未重寫時):同 ==,比較引用地址。
• 重寫後(如 String、Integer 等包裝類):比較「內容/值」是否相等。
口訣:基本類型用 ==,引用類型看有無重寫 equals。
適配器模式將一個類的接口轉換成客戶端期望的另一個接口,使原本不兼容的類能夠協同工作。
核心做法:定義一個實現目標接口的抽象類 Adapter,在其中持有被適配對象的引用,並將接口方法委託給該對象;具體適配器繼承抽象類,只需實現/覆寫需要的方法即可。這樣既符合「開閉原則」,又避免了繼承帶來的強耦合。
| 維度 | 抽象類 | 接口 |
|---|---|---|
| 關鍵字 | abstract class | interface |
| 成員變量 | 任意修飾符 | 隱含 public static final(常量) |
| 方法 | 可有抽象/具體/靜態/私有方法 | 隱含 public abstract(Java 8+ 可有 default/static/private) |
| 構造器 | 有(供子類調用) | 無 |
| 繼承關係 | 單繼承 | 多實現、多繼承 |
| 設計理念 | is-a(屬於某體系,如「貓是貓科動物」) | like-a(具備某能力,如「實現可跑、可吃接口」) |
選型建議:需共享代碼/狀態用抽象類;需定義行為契約、支持多實現用接口。
對共享資源的操作加「同一把鎖」—— synchronized(lock) 或 ReentrantLock,確保互斥訪問。
定義:兩個或以上線程互相持有對方需要的鎖,導致永久等待。
經典案例:線程 1 持有鎖 A 等待鎖 B;線程 2 持有鎖 B 等待鎖 A。
預防策略:
• 固定加鎖順序(避免交叉等待)
• 使用 tryLock(timeout) 避免無限阻塞
• 減少鎖範圍、避免嵌套鎖
發送端:
1. DatagramSocket socket = new DatagramSocket();
2. 封裝數據包:new DatagramPacket(data, data.length, InetAddress.getByName(ip), port);
3. socket.send(packet);
4. socket.close();
接收端:
1. DatagramSocket socket = new DatagramSocket(port);
2. 準備空包:new DatagramPacket(buf, buf.length);
3. socket.receive(packet);(阻塞)
4. 解析:packet.getAddress()、new String(packet.getData(), 0, packet.getLength())
5. socket.close();
客戶端:
1. Socket socket = new Socket(ip, port);
2. OutputStream out = socket.getOutputStream(); 寫數據
3. socket.close();
服務端:
1. ServerSocket server = new ServerSocket(port);
2. Socket client = server.accept();(阻塞等待連接)
3. InputStream in = client.getInputStream(); 讀數據
4. client.close(); server.close();
掌握以上五大塊核心知識,配合實際代碼練習,Java 面試中這類基礎題將不在話下。