Java:高頻面試知識分享1

一、Java 語言核心特性(面向對象編程)

核心知識點梳理:
  1. 面向對象三大特性

    • 封裝:隱藏對象內部實現,通過 public 方法暴露接口(例:類的 private 字段 + get/set 方法)。
    • 繼承:子類繼承父類非 private 屬性和方法,減少代碼冗余(注意:Java 單繼承,通過接口實現多繼承效果)。
    • 多態:同一行為的不同表現形式(編譯時多態:方法重載;運行時多態:子類重寫父類方法,父類引用指向子類對象)。
  2. 接口與抽象類的區別

    • 接口:全抽象(JDK8 后可有 default 方法),字段默認 public static final,類可實現多個接口。
    • 抽象類:可含抽象方法和具體方法,字段可非靜態,類只能繼承一個抽象類。
    • 應用場景:接口用于定義規范(如 DAO 層接口),抽象類用于抽取共性實現(如 BaseService)。
  3. 其他高頻點

    • 重載(Overload)vs 重寫(Override):重載是同一類中方法名相同、參數不同;重寫是子類覆蓋父類方法,參數和返回值需一致(協變返回類型除外)。
    • 關鍵字:static(靜態變量 / 方法屬于類,非實例)、final(修飾類不可繼承、方法不可重寫、變量不可修改)、this(當前實例)、super(父類引用)。
面試常見問題及回答思路:
  • Q:多態的實現原理是什么?
    A:核心是 “動態綁定”:編譯時編譯器根據父類引用類型檢查方法是否存在,運行時 JVM 根據實際對象類型調用對應子類的重寫方法(依賴方法表:每個類的 Class 對象中維護方法表,記錄方法的實際入口地址)。
    舉例:List list = new ArrayList(); list.add(1);?編譯時用 List 接口檢查 add 方法,運行時實際調用 ArrayList 的 add 實現。

  • Q:為什么 Java 不支持多繼承?
    A:避免 “菱形繼承” 問題(多個父類有相同方法時,子類無法確定繼承哪一個),通過接口多實現替代,接口僅定義規范,無具體實現沖突。

二、集合框架

核心知識點梳理:
  1. 整體結構

    • 接口:Collection(List/Set)、Map
    • 核心實現類:
      • List:ArrayList(數組,查快改慢)、LinkedList(雙向鏈表,增刪快查慢);
      • Set:HashSet(底層 HashMap,無序去重)、TreeSet(紅黑樹,有序去重,需實現 Comparable);
      • Map:HashMap(數組 + 鏈表 / 紅黑樹,JDK1.8 后鏈表長度 > 8 轉紅黑樹)、ConcurrentHashMap(線程安全,JDK1.7 分段鎖,JDK1.8 CAS+synchronized)。
  2. 高頻細節

    • HashMap:初始容量 16,負載因子 0.75,擴容為 2 倍;key 為 null 存放在索引 0;線程不安全(多線程 put 可能導致死循環,JDK1.8 后修復但仍有數據覆蓋問題)。
    • HashSet:本質是HashMap的 key(value 為常量),所以去重依賴 key 的hashCode()equals()(先比 hashCode,再比 equals)。
    • 線程安全集合:Vector(所有方法 synchronized,效率低)、Collections.synchronizedList()(包裝類,加鎖粒度同 Vector)、CopyOnWriteArrayList(寫時復制,讀不加鎖,適合讀多寫少)。
面試常見問題及回答思路:
  • Q:ArrayList 和 LinkedList 的區別?如何選型?
    A:從底層結構、操作效率、內存占用三方面說:

    • 底層:ArrayList 是動態數組,LinkedList 是雙向鏈表;
    • 效率:ArrayList 隨機訪問(get (index))快(O (1)),增刪(尤其是中間位置)慢(需移動元素,O (n));LinkedList 增刪快(O (1),找到位置后修改指針),隨機訪問慢(O (n));
    • 選型:查多改少用 ArrayList,增刪多(尤其是中間)用 LinkedList;小數據量時差異不大。
  • Q:HashMap 的 put 流程?JDK1.7 和 1.8 有什么區別?
    A:put 流程:

    1. 計算 key 的 hash 值(hashCode () 高 16 位異或低 16 位,減少哈希沖突);
    2. 計算索引(hash & (容量 - 1));
    3. 若桶位為空,直接放新節點;若不為空,判斷 key 是否存在(hash+equals),存在則替換 value;不存在則插入鏈表 / 紅黑樹;
    4. 插入后若鏈表長度 > 8 且容量 >=64,轉紅黑樹;
    5. 若元素數 > 容量 * 負載因子,觸發擴容(2 倍)。
      區別:1.7 是頭插法(擴容時可能死循環),1.8 是尾插法;1.8 新增紅黑樹優化長鏈表查詢;1.7 的 hash 計算更簡單(1.8 增加高 16 位異或)。

三、多線程編程基礎

核心知識點梳理:
  1. 線程創建方式

    • 繼承Thread類(重寫 run ());
    • 實現Runnable接口(重寫 run (),可多線程共享資源);
    • 實現Callable接口(重寫 call (),有返回值,結合Future獲取結果)。
  2. 線程狀態
    新建(New)→ 就緒(Runnable)→ 運行(Running)→ 阻塞(Blocked/Waiting/Timed Waiting)→ 終止(Terminated)。

    • 阻塞原因:synchronized 未拿到鎖(Blocked)、wait ()(Waiting)、sleep (long)/join (long)(Timed Waiting)。
  3. 同步機制

    • synchronized:可修飾方法(鎖當前對象 / 類)、代碼塊(鎖括號內對象);JDK1.6 后優化為偏向鎖→輕量級鎖→重量級鎖(鎖升級),減少性能消耗。
    • Lock接口:ReentrantLock(可重入、可中斷、可超時、公平鎖 / 非公平鎖),需手動lock()unlock()(建議放 finally)。
    • 區別:synchronized 是 JVM 層面隱式鎖,自動釋放;Lock 是 API 層面顯式鎖,靈活但需手動釋放。
  4. 線程池

    • 核心參數:corePoolSize(核心線程數)、maximumPoolSize(最大線程數)、keepAliveTime(非核心線程空閑存活時間)、workQueue(任務隊列)。
    • 常用線程池:Executors.newFixedThreadPool()(固定線程數)、newCachedThreadPool()(緩存線程池,可擴容)、newSingleThreadExecutor()(單線程);實際開發建議用ThreadPoolExecutor手動創建,避免資源耗盡(如 FixedThreadPool 的隊列無界可能 OOM)。
面試常見問題及回答思路:
  • Q:synchronized 和 volatile 的區別?
    A:兩者都用于線程安全,但作用不同:

    • volatile:修飾變量,保證可見性(一個線程修改后,其他線程立即看到)和禁止指令重排序(如單例模式雙重檢查鎖中修飾 instance),但不保證原子性(例:i++ 仍會有線程安全問題);
    • synchronized:保證原子性(臨界區代碼互斥執行)、可見性(解鎖前刷新內存)、有序性(臨界區代碼單線程執行),但開銷比 volatile 大。
      總結:volatile 適合修飾狀態標志(如 boolean isRunning),synchronized 適合復雜邏輯的同步。
  • Q:什么是死鎖?如何避免?
    A:死鎖是兩個或多個線程互相持有對方需要的鎖,導致無限等待。
    例:線程 1 持有鎖 A,等待鎖 B;線程 2 持有鎖 B,等待鎖 A。
    避免:1. 按固定順序獲取鎖(如都先獲取 A 再獲取 B);2. 定時釋放鎖(tryLock (time));3. 減少鎖的持有時間。

四、JVM 內存結構和垃圾回收機制

核心知識點梳理:
  1. 內存結構(JDK8+)

    • 線程私有:
      • 程序計數器:記錄當前線程執行的字節碼行號,唯一不會 OOM 的區域;
      • 虛擬機棧:存儲棧幀(局部變量表、操作數棧、返回地址等),棧深過深會 StackOverflowError(如遞歸無出口),內存不足會 OOM;
      • 本地方法棧:類似虛擬機棧,為 Native 方法服務。
    • 線程共享:
      • 堆:存儲對象實例,GC 主要區域,分新生代(Eden+From Survivor+To Survivor)和老年代;內存不足會 OOM;
      • 方法區(元空間,MetaSpace):存儲類信息、常量、靜態變量等,JDK8 前是永久代(PermGen),元空間使用本地內存,默認無上限(可通過 - XX:MaxMetaspaceSize 限制),內存不足會 OOM。
  2. 垃圾回收(GC)

    • 回收區域:堆和方法區(常量、無用類)。
    • 對象存活判斷:可達性分析(以 GC Roots 為起點,不可達的對象標記為可回收);GC Roots 包括:虛擬機棧中引用的對象、本地方法棧中引用的對象、靜態變量、常量等。
    • 引用類型:強引用(new 的對象,不會被回收)、軟引用(OOM 前回收,適合緩存)、弱引用(GC 時必回收,如 WeakHashMap)、虛引用(回收時通知,跟蹤 GC)。
    • 垃圾收集算法:
      • 標記 - 清除:標記可回收對象,直接清除,會產生碎片;
      • 標記 - 復制:將存活對象復制到另一塊區域,無碎片,適合新生代(Eden:From:To=8:1:1);
      • 標記 - 整理:標記后將存活對象移到一端,清除另一端,適合老年代。
    • 垃圾收集器:
      • 新生代:SerialGC(單線程,STW 長)、Parallel Scavenge(多線程,注重吞吐量)、ParNew(多線程,配合 CMS);
      • 老年代:Serial Old(單線程,配合 SerialGC)、Parallel Old(多線程,配合 Parallel Scavenge)、CMS(并發標記清除,低延遲,三步 STW:初始標記、重新標記、并發清除,有碎片)、G1(Region 分區,兼顧吞吐量和延遲,Mixed GC 回收部分老年代)。
面試常見問題及回答思路:
  • Q:JVM 堆內存分代?為什么這么劃分?
    A:堆分新生代(Young)和老年代(Old),新生代又分 Eden、From Survivor、To Survivor。
    原因:基于 “大部分對象朝生夕死” 的經驗法則(新生代對象存活時間短,回收頻繁;老年代對象存活時間長,回收少),分代后可采用不同 GC 算法優化效率:新生代用標記 - 復制(效率高,適合短生命周期對象),老年代用標記 - 整理(避免碎片,適合長生命周期對象)。

  • Q:G1 收集器的工作原理?
    A:G1 將堆劃分為多個大小相等的 Region(默認 1-32MB),每個 Region 可動態標記為 Eden、Survivor、Old。
    流程:1. 初始標記(STW,標記 GC Roots 直接關聯的對象);2. 并發標記(遍歷對象引用鏈,無 STW);3. 最終標記(STW,處理并發標記遺漏的對象);4. 篩選回收(STW,根據 Region 的回收價值排序,優先回收價值高的,混合回收部分老年代 Region)。
    優勢:可設置最大 STW 時間,兼顧吞吐量和延遲,適合大堆(如 8GB 以上)。

五、復習建議

  1. 畫思維導圖:把每個模塊的知識點串聯起來(如集合框架→線程安全集合→多線程同步),形成知識網。
  2. 看源碼:重點看ArrayListadd()HashMapput()Threadstart()等核心方法,理解底層實現。
  3. 刷面試題:針對每個知識點,找 5-10 道高頻題練習(如牛客網、力扣 Java 面試專題),確保能清晰表達。
  4. 模擬面試:找同學互相提問,訓練臨場反應,避免緊張忘詞。

核心是 “理解原理 + 能舉例子”,面試官更看重你是否真的懂,而不是背概念。比如講 HashMap 時,能說出自己項目中遇到的哈希沖突問題及解決方法,會比單純背流程更加分。

List list = new ArrayList(); 這個是小類型轉換成大類型是自動轉換是嗎,如果反過來呢

在 Java 中,List list = new ArrayList();?涉及的是多態中的向上轉型,而非基本數據類型的自動轉換(小轉大),但邏輯上有相似之處:

  • ArrayList?是?List?接口的實現類,List?是父類型(接口可視為 “抽象父類”),ArrayList?是子類型。
  • 這種 “父類引用指向子類對象” 的寫法是自動向上轉型,無需顯式聲明,編譯器允許這種轉換(因為子類一定符合父類的接口規范)。

如果反過來寫?ArrayList arrayList = new List();,則完全不允許,原因是:

  1. List?是接口,不能直接實例化(new List()?本身語法錯誤);
  2. 即使是類之間的轉換(如?ArrayList?與?LinkedList,同屬?List?子類型),父類型也不能直接轉換為子類型,因為父類型引用的對象可能根本不是目標子類型的實例。

若要將父類型引用轉回子類型,必須滿足兩個條件:

  1. 父類型引用的實際對象是目標子類型的實例
  2. 必須通過顯式強制轉型聲明。

例如:

List list = new ArrayList();  // 向上轉型(自動)
ArrayList arrayList = (ArrayList) list;  // 向下轉型(顯式強制,合法,因為list實際指向ArrayList)

但如果實際對象類型不匹配,強制轉型會拋出?ClassCastException

List list = new LinkedList();  
ArrayList arrayList = (ArrayList) list;  // 運行時異常:LinkedList不能轉為ArrayList

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916917.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MybatisPlus-核心功能

目錄 條件構造器 QueryWrapper UpdateWrapper LambdaQueryWrapper 自定義SQL 基本用法 多表關聯 Service接口 CRUD 基本用法 Lambda 批量新增 條件構造器 除了新增以外,修改、刪除、查詢的SQL語句都需要指定where條件。因此BaseMapper中提供的相關方法…

RHCE綜合項目:分布式LNMP私有博客服務部署

一、項目概述本次項目基于LNMP(linux,nginx,mariadb,php)搭建了一個私有的博客平臺,本篇博客詳細記錄了該博客平臺的服務部署全流程。在該項目中,使用了兩臺linux(openeuler&#xf…

5種安全方法:如何刪除三星手機上的所有內容

隨著新的三星設備不斷推出,在出售或捐贈舊手機之前,徹底清除舊手機上的數據以保護隱私至關重要。許多人不知道的是,簡單的刪除操作并不能完全清除三星設備上的數據,被刪除的文件可能會處于不可見狀態。本文介紹了如何徹底刪除三星…

Vue 3 入門教程 2- Vue 組件基礎與模板語法

一、Vue 組件基礎在 Vue 中,組件是構建用戶界面的基本單位,它可以將頁面拆分成多個獨立、可復用的部分。一個 Vue 組件通常以 .vue 文件名結尾,包含三個核心部分:模板(Template)、腳本(Script&a…

Linux 進程管理與計劃任務詳解

Linux 進程管理與計劃任務詳解 一、程序與進程的基本概念 程序:保存在外部存儲介質中的可執行機器代碼和數據的靜態集合,是靜態的文件實體進程:在 CPU 及內存中處于動態執行狀態的計算機程序,是程序的動態執行實例關聯關系&#x…

分層解耦(Controller,Service,Dao)

1. 三層架構核心職責層級職責說明關鍵技術 / 注解Controller(控制器)1. 接收前端請求(HTTP) 2. 封裝參數、校驗 3. 調用 Service 處理業務 4. 返回視圖 / 數據給前端Controller、GetMapping等Service(業務層&#xff0…

鎂金屬接骨螺釘注冊檢測:骨科植入安全的科學基石

在骨科治療領域,鎂金屬接骨螺釘憑借其可降解性與生物相容性,成為傳統金屬植入物的革新替代方案。然而,作為Ⅲ類高風險無源植入器械(分類編碼13-01-01),其注冊檢測需覆蓋生物相容性、化學表征、降解性能、力…

模具開發和管理系統(c#)

以前編寫的一個管理模具開發和進度的程序,可以跟蹤模具開發進度,可以查詢模具具體情況,也可以用水晶報表查詢。OS:microsoft windows IDE:microsoft visual studio programming language:C# DataBase&#…

【WRF-Chem 實例1】namelist.input 詳解- 模擬CO2

目錄 &time_control(時間控制) &physics(物理過程參數化方案) &fdda(四維數據同化) 工作機制簡述 &dynamics(WRF 動力核心的數值方法和選項) &bdy_control(邊界控制設置) &chem(WRF-Chem 主要化學設置) &namelist_quilt(并行 I/O 控制…

數據中心-時序數據庫InfluxDB

目錄 一、InfluxDB介紹 1.1 什么是InfluxDB? 1.2 應用場景 1.3 特點 1.4 版本差異 二、數據模型和存儲架構 2.1 相關概念 2.2 存儲架構 三、InfluxDB基礎操作 3.1 數據庫操作 3.2 數據表操作 顯示所有表 新建表 刪除表 3.3 數據保存策略 查看保存策…

webpack-高級配置

多入口文件 如何輸出多個html文件 輸入位置 需要寫兩個entryoutput位置也要改一下 加一個name避免重名 在生成html時 要根據每一個入口都寫一個插件 并且chunks要寫好 當前html引入哪些文件如何抽離壓縮css文件 安裝插件在rules里面添加插件plugins中添加css抽離代碼壓縮css抽離…

WinForm組件之Label 控件

Label 控件Label 控件是 WinForm 中最基礎、最常用的控件之一,主要用于在界面上顯示文本信息,通常作為說明、提示或標題,不直接接受用戶輸入。它是構建用戶界面的基礎組件,在引導用戶操作、展示狀態信息等方面發揮重要作用。Label…

鴻蒙中相冊權限彈窗

model.json5配置權限{"name": ohos.permission.READ_MEDIA,"reason":"$string:permission_reason_IMG","usedScene": {}}ui使用const url albumClass.onRequestCameraPermission()類import { abilityAccessCtrl, common, PermissionR…

智能車輛熱管理測試方案——提升效能與保障安全

車輛熱管理在能源危機出現、汽車排放法規日益嚴格以及人們對汽車舒適性要求更高的背景下應運而生。將各個系統或部件如冷卻系統、潤滑系統和空調系統等集成一個有效的熱管理系統;控制和優化車輛的熱量傳遞過程,保證各關鍵部件和系統良好運行;…

如何提升 TCP 傳輸數據的性能?詳解

TCP 會保證每一個報文都能夠抵達對方,它的機制是這樣:報文發出去后,必須接收到對方返回的確認報文 ACK,如果遲遲未收到,就會超時重發該報文,直到收到對方的 ACK 為止 所以,TCP 報文發出去后&…

WiFi連接簡單流程

WiFi連接流程與Debug方法一、WiFi連接全流程與詳細日志解讀 WiFi連接是一個多階段、跨層次的復雜過程,涉及物理層、鏈路層、網絡層和應用層的多種協議協作。整個流程包括AP初始化、終端掃描、認證、關聯、四次握手、DHCP獲取IP、網絡可用與后續服務。1. AP初始化與參…

Python——Pandas庫,超詳細教程

前言1、Python的Pandas是一個基于Python構建的開源數據分析庫,它提供了強大的數據結構和運算功能。2、Series:一維數組,類似于Numpy中的一維array,但具有索引標簽,可以保存不同類型的數據,如字符串、布爾值…

go語言的gRPC教程-protobuf基礎

一、前言 RPC,全稱Remote Procedure Call,中文譯為遠程過程調用。通俗地講,使用RPC進行通信,調用遠程函數就像調用本地函數一樣,RPC底層會做好數據的序列化與傳輸,從而能使我們更輕松地創建分布式應用和服…

Linux基本指令,對路徑的認識

引言簡單介紹一些Linux的基本指令,快速上手Linux操作系統。一、ls指令語法:ls [選項] [目錄或文件]功能::對于目錄,該命令列出該目錄下的所有子目錄與文件。對于文件件,將列出文件名以及其他信息常用選項&a…

25. html 使用的字符集是什么,有什么特點

總結 utf-8&#xff0c;支持所有語言一、HTML 默認使用的字符集? HTML 頁面推薦使用 UTF-8 字符集<meta charset"UTF-8" />這是 HTML5 中推薦的標準字符編碼&#xff0c;用于定義網頁中字符的編碼方式。二、什么是字符集&#xff08;Character Encoding&#…