首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 基礎面試題精選(一):語言特性、集合框架、JVM 記憶體、類載入、字串處理

     編輯:Java 相關知識

本文為「Java 基礎面試題」系列第一部分,涵蓋面向物件四大特徵、存取修飾符、基本型別與包裝類、運算子、記憶體模型、String 不變性、位運算技巧、流程控制、建構子/重載/重寫、equals/hashCode 契約、final 關鍵字、抽象類與介面、內部類、記憶體洩漏、GC 機制、序列化、類載入器雙親委派、字元編碼、匿名內部類。適合初中級開發者建立扎實知識體系。


1. 面向物件四大特徵

  • 抽象:提取共同屬性/行為構造類別,忽略細節(資料抽象 + 行為抽象)
  • 繼承:子類獲取父類資訊,實現延續性與封裝變化。單繼承,多實作
  • 封裝:資料與方法綁定,隱藏內部細節,對外提供最簡介面
  • 多態:同一訊息,不同物件不同行為。
    Overload(編譯期/靜態綁定)vs Override(運行期/動態綁定)。
    實現條件:① 方法重寫 ② 父類引用指向子類物件(向上造型)

2. 存取修飾符對照表

修飾符同類同包子類(異包)非子類(異包)
private✓✗✗✗
default✓✓✗✗
protected✓✓✓✗
public✓✓✓✓

注意:外部類只能 public 或 default;成員(含內部類)可用四種。

3-5. 基本型別、包裝類與自動拆裝箱

  • 8 種基本型別:byte, short, int, long, float, double, char, boolean
  • 對應包裝類:Byte, Short, Integer, Long, Float, Double, Character, Boolean
  • float f = 3.4; ❌(3.4 是 double)→ float f = 3.4F; 或 (float)3.4
  • short s = 1; s = s + 1; ❌(int 運算)→ s += 1; ✅(隱含強轉)

自動拆裝箱陷阱面試題


Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2); // true
System.out.println(f3 == f4); // false

解析:Integer.valueOf() 快取 -128 ~ 127 範圍物件。範圍內復用快取(== 為 true),範圍外新建物件(== 為 false)。比較包裝類數值請用 .equals()。

6-7. 保留字與包裝類

  • goto、const 為保留字,不可使用
  • int vs Integer:基本型別 vs 物件。Java 5+ 自動拆裝箱橋接兩者

8. & vs &&(位運算 vs 短路邏輯)

  • &:邏輯與(雙邊必算)或位運算
  • &&:短路與,左邊 false 右邊不執行
  • 實戰:if (str != null && !str.isEmpty()) 順序不可換,& 會拋 NPE

9. JVM 記憶體三區

區域存放內容特點
Stack (棧)基本型別變數、物件引用、方法幀速度最快、容量小、執行緒私有
Heap (堆)new 出來的物件、陣列GC 管理、全域共享、可擴展至虛擬記憶體
Static Area (靜態區)字面量(100、"hello")、常量、static 變數類載入時分配、類卸載時釋放

String s = new String("hello");
// s 在 Stack
// new String() 物件在 Heap
// "hello" 字面量在 Static Area

補充:Java 6+ 逃逸分析 可將未逃逸物件分配在 Stack(標量替換),提升效能。

10. Math.round 四捨五入規則

  • Math.round(11.5) → 12
  • Math.round(-11.5) → -11
  • 原理:參數 + 0.5 後向下取整(floor(x + 0.5))

11. switch 支援型別演進

  • Java 5-:byte, short, char, int
  • Java 5+:+ enum
  • Java 7+:+ String
  • 所有版本:不支援 long

12. 位運算高效乘除

  • 2 * 8 → 2 << 3(左移 3 位 = 乘 2³)
  • num * 31 → (num << 5) - num(HashCode 常用優化,現代 JVM 自動優化)

13. length vs length()

  • 陣列:arr.length(屬性)
  • String:str.length()(方法)
  • JS 混淆點:JS 字串用 .length 屬性

14. 跳出多層迴環


outer: for (int i=0; i<10; i++) {
    for (int j=0; j<10; j++) {
        if (condition) break outer; // 標籤 break
    }
}

建議:慎用標籤 break/continue,易降低可讀性,優先重構為方法返回。

15-17. 建構子、重載、重寫、String final

  • 建構子不可繼承、不可重寫,可重載
  • Overload:同類、同名、參數列表不同(型別/個數/順序),與返回型別無關
  • Override:子類覆寫父類,返回型別兼容、拋出異常子集、存取權限不嚴格於父類
  • String 為 final 類,**不可繼承**。復用請用組合/委派

16. equals/hashCode 契約(核心考點)

  1. x.equals(y) == true → x.hashCode() == y.hashCode() 必須成立
  2. hashCode() 相等 → equals() 不一定相等(哈希碰撞)
  3. 違反契約後果:HashSet 可存入「相等」重複物件、HashMap 效能退化為 O(n)

高質量 equals 實作清單:

  1. == 檢查同一引用
  2. instanceof 檢查型別
  3. 關鍵屬性逐一比較
  4. 驗證對稱性、傳遞性、一致性
  5. 重寫 equals 必重寫 hashCode
  6. 參數保持 Object,加 @Override

18. Java 參數傳遞:值傳遞

  • 基本型別:傳值副本
  • 引用型別:傳引用的副本(指向同一物件)
  • 方法內修改物件屬性 → 影響外部;方法內改變引用指向 → 不影響外部
  • C/C++/C# 支援引用/輸出參數,Java 不支援(常用 Wrapper 類或單元素陣列模擬)

21. 類載入機制與雙親委派

  1. 載入:讀取 .class → 字節陣列 → 生成 Class 物件
  2. 連接:驗證 → 準備(static 變數賦預設值) → 解析(符號引用→直接引用)
  3. 初始化:執行 static 區塊、static 變數賦值、父類優先初始化

四大類載入器

載入器來源父載入器
Bootstraprt.jar 核心類庫無(C++ 實現)
Extensionjre/lib/ext 或 java.ext.dirsBootstrap
System (Application)classpathExtension
Custom使用者自定義System

雙親委派 (PDM):請求父載入器 → 父無法載入 → 子自行載入。優勢:避免核心類被竄改、確保類載入唯一性。

22. char 儲存中文

  • 可儲存。Java 內部使用 Unicode (UTF-16),char 佔 2 bytes (16 bits),涵蓋基本多文種平面 (BMP) 所有漢字
  • JVM 內部 Unicode,外部需編碼轉換 → InputStreamReader/OutputStreamWriter(適配器模式)

23. 抽象類 vs 介面

維度抽象類介面
實例化不可不可
建構子可有不可
方法抽象 + 具體全抽象 (Java 8 前)
成員存取private/protected/public隱含 public
成員變數變數/常數隱含 static final 常數
繼承/實作單繼承多實作

24. 靜態內部類 vs 非靜態內部類

  • Static Nested Class:無需外部類實例即可 new Outer.Nested()
  • Inner Class:需 new Outer().new Inner(),持有外部類引用
  • 靜態方法中建立內部類:new Outer().new Inner()(無 this)

25. Java 記憶體洩漏

  • 理論上 GC 避免洩漏,實務上無用但可達物件 導致洩漏
  • 典型場景:Hibernate Session (一級快取) 未 close/flush、靜態集合持有物件引用、監聽器未移除
  • 後果:OutOfMemoryError、Disk Paging、效能急劇下降

26. abstract 方法限制

abstract 不能與 static、native、synchronized 共存。原因:需子類重寫,但 static/native/synchronized 涉及具體實現細節,互斥。

27-28. static 變數與方法

  • static 變數:屬於類,全類共享單一拷貝
  • 實例變數:屬於物件,需 new 後存取
  • static 方法不可直接呼叫非 static 方法/欄位(無 this)

29. 物件克隆兩大路徑

  1. 實作 Cloneable + 重寫 clone()(淺拷貝,需手動深拷貝)
  2. 實作 Serializable + 序列化/反序列化(**真正深度克隆**,編譯期型別檢查,優於 clone())

30. GC 機制與分代收集

  • 觸發:System.gc() / Runtime.gc()(僅建議,JVM 可忽略)
  • 演算法:標記-清除、複製、標記-整理、分代收集
  • 分代區域:
    • 新生代:Eden + From Survivor + To Survivor(Minor GC)
    • 老年代:多次存活晉升、大物件直入(Major/Full GC)
    • 永久代/元空間:類元資料、常數池
  • 關鍵 JVM 參數:-Xms/Xmx、-Xmn、-XX:+PrintGCDetails、-XX:NewRatio、-XX:SurvivorRatio、-XX:MaxTenuringThreshold

31. String 物件計數


String s = new String("xyz");
// 2 個物件:"xyz" (常量池) + new String() (Heap)

32-35. 介面/抽象類繼承規則、匿名內部類、內部類存取

  • 介面可多重繼承介面;抽象類可實作介面、繼承具體類/抽象類
  • .java 檔最多 一個 public 類,檔名必須同名
  • 匿名內部類:可繼承類或實作介面,常用於事件監聽
  • 內部類可存取外部類所有成員(含 private)

36. final 三大用法

  1. 修飾類:不可繼承
  2. 修飾方法:不可重寫
  3. 修飾變數:只能賦值一次(常量)

37. 初始化順序輸出題


class A { static { print(1); } { print(2); } A() { print(3); } }
class B extends A { static { print(4); } { print(5); } B() { print(6); } }
new B(); new B();
// 輸出:1 4 2 3 5 6  2 3 5 6
// 靜態區塊僅類載入時執行一次

38-40. 型別轉換、字串反轉、編碼轉換

  • 字串→基本型別:Integer.parseInt()、Integer.valueOf()
  • 基本型別→字串:String.valueOf()、"" + val
  • 遞歸反轉字串:reverse(s) = reverse(s.substring(1)) + s.charAt(0)
  • GB2312 → ISO-8859-1:new String(s.getBytes("GB2312"), "ISO-8859-1")

系列導航:Java 基礎面試題(一) | Java 基礎面試題(二) | Java 基礎面試題(三)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved