Java面試題和答案大全

一、Java基礎知識

1. Java語言特點

題目: 請說明Java語言的主要特點?

答案:

  • 面向對象:Java是純面向對象的語言,支持封裝、繼承、多態
  • 平臺無關性:一次編譯,到處運行(Write Once, Run Anywhere)
  • 簡單性:語法簡潔,去掉了C++中的指針、多重繼承等復雜特性
  • 安全性:提供了安全管理機制,防止惡意代碼攻擊
  • 多線程:內置多線程支持
  • 健壯性:強類型檢查、異常處理、垃圾回收
  • 分布式:支持網絡編程,便于開發分布式應用

2. JDK、JRE、JVM的關系

題目: 請解釋JDK、JRE、JVM三者的關系?

答案:

  • JVM(Java虛擬機):Java程序運行的環境,負責將字節碼轉換為機器碼
  • JRE(Java運行環境):包含JVM + Java核心類庫,是Java程序運行的最小環境
  • JDK(Java開發工具包):包含JRE + 開發工具(javac、java、javadoc等),是Java開發環境

關系:JDK > JRE > JVM

3. 基本數據類型

題目: Java有哪些基本數據類型?各占幾個字節?

答案:

整型:
- byte:1字節,范圍 -128 到 127
- short:2字節,范圍 -32768 到 32767
- int:4字節,范圍 -2^31 到 2^31-1
- long:8字節,范圍 -2^63 到 2^63-1浮點型:
- float:4字節,單精度
- double:8字節,雙精度字符型:
- char:2字節,Unicode字符布爾型:
- boolean:1字節(JVM中實際可能占4字節)

4. 自動裝箱和拆箱

題目: 什么是自動裝箱和拆箱?

答案:

  • 自動裝箱:基本類型自動轉換為對應的包裝類對象
  • 自動拆箱:包裝類對象自動轉換為對應的基本類型
// 自動裝箱
Integer i = 100; // 等價于 Integer i = Integer.valueOf(100);// 自動拆箱  
int j = i; // 等價于 int j = i.intValue();

注意事項:

  • Integer緩存池:-128到127的Integer對象被緩存
  • 可能出現NullPointerException

5. equals()和==的區別

題目: equals()和==有什么區別?

答案:

  • ==
    • 對于基本類型:比較值是否相等
    • 對于引用類型:比較引用地址是否相等
  • equals()
    • 默認實現與==相同
    • 可以重寫來比較對象內容
    • String類已重寫equals()方法比較字符串內容
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = "hello";
String s4 = "hello";System.out.println(s1 == s2);     // false,不同對象
System.out.println(s1.equals(s2)); // true,內容相同
System.out.println(s3 == s4);     // true,字符串池中同一對象

二、面向對象編程

6. 面向對象三大特性

題目: 請詳細說明面向對象的三大特性?

答案:

1. 封裝(Encapsulation)

  • 將數據和方法包裝在類中
  • 通過訪問修飾符控制訪問權限
  • 隱藏內部實現細節
public class Person {private String name; // 私有屬性public String getName() { // 公共方法return name;}public void setName(String name) {this.name = name;}
}

2. 繼承(Inheritance)

  • 子類繼承父類的屬性和方法
  • 實現代碼復用
  • 支持方法重寫
class Animal {protected void eat() {System.out.println("Animal is eating");}
}class Dog extends Animal {@Overrideprotected void eat() {System.out.println("Dog is eating");}
}

3. 多態(Polymorphism)

  • 同一接口不同實現
  • 運行時確定具體調用哪個方法
  • 包括重載和重寫
Animal animal = new Dog();
animal.eat(); // 調用Dog的eat方法

7. 重載和重寫的區別

題目: 方法重載和重寫有什么區別?

答案:

特性 重載(Overload) 重寫(Override)
定義 同一類中方法名相同,參數不同 子類重新實現父類方法
參數 必須不同 必須相同
返回值 可以不同 必須相同(或協變)
訪問修飾符 可以不同 不能降低訪問權限
異常 可以不同 不能拋出更寬泛的檢查異常
發生時期 編譯期確定 運行期確定

8. 抽象類和接口的區別

題目: 抽象類和接口有什么區別?什么時候使用?

答案:

特性 抽象類 接口
關鍵字 abstract interface
繼承 單繼承 多實現
構造器 可以有 不能有
成員變量 任意類型 public static final
方法 抽象和具體方法 抽象方法(JDK8+支持默認方法)
訪問修飾符 任意 public

使用場景:

  • 抽象類:is-a關系,有共同的屬性和部分相同的行為
  • 接口:can-do關系,定義行為規范

三、集合框架

9. Collection和Collections的區別

題目: Collection和Collections有什么區別?

答案:

  • Collection:集合框架的根接口,定義了集合的基本操作
  • Collections:工具類,提供了對集合操作的靜態方法
// Collection是接口
Collection<String> list = new ArrayList<>();// Collections是工具類
Collections.sort(list);
Collections.reverse(list);

10. ArrayList和LinkedList的區別

題目: ArrayList和LinkedList有什么區別?

答案:

特性 ArrayList LinkedList
底層結構 動態數組 雙向鏈表
隨機訪問 O(1) O(n)
插入刪除(頭部) O(n) O(1)
插入刪除(尾部) O(1) O(1)
插入刪除(中間) O(n) O(n)
內存占用 較小 較大(存儲指針)
線程安全 不安全 不安全

11. HashMap的實現原理

題目: 請詳細說明HashMap的實現原理?

答案:

底層結構:

  • JDK1.7:數組 + 鏈表
  • JDK1.8+:數組 + 鏈表 + 紅黑樹

核心機制:

// 1. 計算hash值
int hash = key.hashCode();
hash = hash ^ (hash >>> 16); // 擾動函數// 2. 確定數組下標
int index = (n - 1) & hash; // n為數組長度// 3. 處理沖突
// - 鏈表長度 < 8:使用鏈表
// - 鏈表長度 >= 8:轉換為紅黑樹
// - 紅黑樹節點 <= 6:轉換為鏈表

擴容機制:

  • 默認容量:16
  • 負載因子:0.75
  • 擴容閾值:容量 × 負載因子
  • 擴容時容量翻倍

12. ConcurrentHashMap實現原理

題目: ConcurrentHashMap是如何實現線程安全的?

答案:

JDK1.7實現:

  • 分段鎖(Segment)機制
  • 每個Segment繼承ReentrantLock
  • 降低鎖的粒度

JDK1.8實現:

  • 取消分段鎖
  • 使用CAS + synchronized
  • 鎖住鏈表或紅黑樹的首節點
  • 進一步降低鎖粒度
// JDK1.8 put方法核心邏輯
final V putVal(K key, V value, boolean onlyIfAbsent) {// 1. CAS嘗試設置空位置if (casTabAt(tab, i, null, new Node<K,V>(hash, key, value, null)))break;// 2. synchronized鎖住首節點synchronized (f) {// 3. 插入鏈表或紅黑樹}
}

四、多線程

13. 進程和線程的區別

題目: 進程和線程有什么區別?

答案:

特性 進程 線程
定義 程序的執行實例 進程中的執行單元
資源 擁有獨立的內存空間 共享進程的內存空間
通信 IPC(進程間通信) 共享內存
創建開銷
切換開銷
影響范圍 進程崩潰不影響其他進程 線程崩潰可能影響整個進程

14. 線程的狀態

題目: Java線程有哪些狀態?如何轉換?

答案:

線程狀態(Thread.State):

public enum State {NEW,          // 新建RUNNABLE,     // 運行(就緒+運行)BLOCKED,      // 阻塞WAITING,      // 等待TIMED_WAITING, // 超時等待TERMINATED    // 終止
}

狀態轉換:

NEW → RUNNABLE:調用start()
RUNNABLE → BLOCKED:等待synchronized鎖
BLOCKED → RUNNABLE:獲得鎖
RUNNABLE → WAITING:調用wait()、join()
WAITING → RUNNABLE:notify()、notifyAll()
RUNNABLE → TIMED_WAITING:sleep()、wait(timeout)
TIMED_WAITING → RUNNABLE:時間到或被喚醒
RUNNABLE → TERMINATED:run()方法結束

15. synchronized關鍵字

題目: 請詳細說明synchronized的原理和使用?

答案:

使用方式:

// 1. 修飾實例方法
public synchronized void method() {}// 2. 修飾靜態方法
public static synchronized void method() {}// 3. 修飾代碼塊
synchronized(object) {// 同步代碼
}

實現原理:

  • Java對象頭:包含MarkWord,存儲鎖信息
  • Monitor機制:基于操作系統的互斥量
  • 字節碼指令:monitorenter和monitorexit

鎖升級過程(JDK1.6+):

無鎖 → 偏向鎖 → 輕量級鎖 → 重量級鎖

16. volatile關鍵字

題目: volatile關鍵字的作用是什么?

答案:

作用:

  1. 保證可見性:修改后立即寫入主內存,其他線程讀取時從主內存讀取
  2. 禁止指令重排序:使用內存屏障

使用場景:

// 1. 狀態標記
private volatile boolean flag = true;// 2. 雙重檢查鎖單例模式
public class Singleton {private volatile static Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

注意:volatile不保證原子性

17. 線程池

題目: 請說明線程池的工作原理和參數?

答案:

核心參數:

public ThreadPoolExecutor(int corePoolSize,       // 核心線程數int maximumPoolSize,    // 最大線程數long keepAliveTime,     // 線程存活時間TimeUnit unit,          // 時間單位BlockingQueue<Runnable> workQueue,  // 工作隊列ThreadFactory threadFactory,        // 線程工廠RejectedExecutionHandler handler    // 拒絕策略
)

工作流程:

  1. 提交任務到線程池
  2. 如果運行線程數 < corePoolSize,創建新線程
  3. 如果運行線程數 >= corePoolSize,任務加入隊列
  4. 如果隊列滿了且運行線程數 < maximumPoolSize,創建新線程
  5. 如果運行線程數 >= maximumPoolSize,執行拒絕策略

常用線程池:

// 固定大小線程池
ExecutorService executor = Executors.newFixedThreadPool(10);// 緩存線程池
ExecutorService executor = Executors.newCachedThreadPool();// 單線程線程池
ExecutorService executor = Executors.newSingleThreadExecutor();// 定時任務線程池
ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);

五、JVM虛擬機

18. JVM內存結構

題目: 請詳細說明JVM的內存結構?

答案:

運行時數據區域:

1. 程序計數器(PC Register)

  • 線程私有
  • 存儲當前線程執行字節碼的行號
  • 唯一不會OutOfMemoryError的區域

2. Java虛擬機棧(JVM Stack)

  • 線程私有
  • 存儲局部變量表、操作數棧、動態鏈接、方法出口
  • StackOverflowError、OutOfMemoryError

3. 本地方法棧(Native Method Stack)

  • 線程私有<

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

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

相關文章

用NAS如何遠程訪問:詳細教程與實用技巧

在信息時代&#xff0c;家用NAS&#xff08;網絡附加存儲&#xff09;成為家庭數據存儲和管理的熱門設備。它不僅可以作為家庭照片、視頻、工作文件的集中存儲中心&#xff0c;還支持遠程訪問&#xff0c;方便用戶隨時隨地獲取數據。那么&#xff0c;如何配置和實現家用NAS的遠…

Qt-桌面寵物

目錄 一&#xff0c;演示&#xff08;部分功能&#xff09; 二&#xff0c;開發環境準備 三&#xff0c;部分代碼實現 1.創建基礎窗口 2.實現寵物動畫 3.添加交互功能 4.系統托盤集成 5.行為模式實現 6.狀態管理系統 7.資源打包部署 四&#xff0c;接受定制 一&…

C++編程學習(第19天)

局部變量和全局變量每一個變量都有其有效作用范圍&#xff0c;這就是變量的作用域&#xff0c;在作用域以外是不能訪問這些變量的。局部變量在一個函數內部定義的變量是局部變量&#xff0c;它只在本函數范圍內有效&#xff0c;也就是說只有在本函數內才能使用他們&#xff0c;…

客流特征識別準確率提升 29%:陌訊多模態融合算法在零售場景的實戰解析

原創聲明本文為原創技術解析文章&#xff0c;涉及的技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止任何形式的抄襲與轉載。一、行業痛點&#xff1a;零售客流識別的技術瓶頸在零售數字化轉型過程中&#xff0c;客流特征識別&#xff08;包括性別、年齡分層、停留…

YOLOv8/YOLOv11 C++ OpenCV DNN推理

首先需要將yolov8/yolov11的pt文件轉為onnx文件 from ultralytics import YOLO model YOLO("best.pt") model.export(format"onnx",opset11,dynamicFalse) 本次C工具使用vs2017&#xff0c;需要下載OpenCV包&#xff1a;https://opencv.org/releases/&a…

【Mysql】日志--錯誤日志、二進制日志、查詢日志、慢查詢日志

錯誤日志:數據庫出現錯誤時&#xff0c;進行故障排除默認位置&#xff1a;/var/log/mysqld.log查看日志位置show variables like %log_error%查看日志tail -50 /var/log/mysqld.log二進制日志&#xff1a;記錄了所有的DDL語句和DML語句&#xff0c;不包含查詢&#xff08;selec…

后端常用框架環境與軟件詳解

一、基礎運行環境 1. JDK&#xff08;Java Development Kit&#xff09; 定義&#xff1a;Java 開發工具包&#xff0c;包含編譯器、運行時環境&#xff08;JRE&#xff09;及核心類庫 作用&#xff1a;提供 Java 程序開發和運行的基礎環境&#xff0c;是所有 Java 應用的必備依…

本地服務器端部署基于大模型的通用OCR項目——dots.ocr

本地服務器端部署基于大模型的通用OCR項目——dots.ocrdots.ocr相關介紹本地服務器端部署第一步&#xff1a;安裝cuda12.8與CUDNN8.9.7第二步&#xff1a;創建項目所需的依賴環境第三步&#xff1a;啟動項目第四步&#xff1a;測試第五步&#xff1a;文本解析相關性測試第六步&…

Text2SQL 智能問答系統開發-spider驗證集(三)

概述 已完成 基礎 Text2SQL 功能實現 實現用戶輸入自然語言問題后&#xff0c;系統能夠自動生成 SQL 并執行返回結果。用戶交互優化 支持用戶通過補充信息對查詢進行調整&#xff0c;提升易用性。模糊時間處理機制 對“最近”“近期”等模糊時間關鍵詞進行補全或引導&#xf…

ElementUI常用的組件展示

文章目錄1、要使用ElementUI先導入組件庫2、自定義表頭&#xff0c;可以改為添加和批量刪除的按鈕3、Dialog模態框&#xff0c;主要用于添加和修改時展示信息4、抽屜5、消息提示&#xff1a;用于提示是否操作成功6、詢問&#xff1a;常用于詢問是否確定刪除7、批量選擇復選框8、…

在電腦上可以存儲文件并合理備份文件的工具用哪個?

每天被群消息、報表、PPT 輪番轟炸的上班族&#xff0c;最怕的不是加班&#xff0c;而是——文件突然失蹤&#xff01;別再把“CtrlS”當護身符&#xff0c;今天一口氣測完 4 款熱門“文件保險箱”&#xff0c;看看誰才真正配得上你的 Deadline。 敬業簽 首先登場的是敬業簽&am…

JavaWeb(04)

MyBatis 時一款優秀的持久層框架&#xff0c;用于簡化JDBC的開發 The MyBatis Blog 目錄 MyBatis入門Mybatis基礎CRUDMybatis動態SQL Mybatis入門 快速入門 JDBC介紹 數據庫連接池 lombok 準備工作(創建springboot工程&#xff0c;數據庫表user&#xff0c;實體類User) …

統計學1:伯努利模型的參數估計與等價性分析

伯努利模型的參數估計方法 1. 統計學習方法三要素對比方法模型策略算法極大似然估計概率模型經驗風險最小化數值解貝葉斯估計概率模型結構風險最小化解析解2. 極大似然估計 2.1 模型設定 設P(x1)θP(x1)\thetaP(x1)θ&#xff0c;則P(x0)1?θP(x0)1-\thetaP(x0)1?θ 2.2 似然…

游戲行業DDoS攻防實戰指南

一、游戲DDoS攻擊特征分析游戲行業DDoS攻擊呈現高度復合化特征&#xff0c;攻擊手段日益專業化。2023年Akamai監測數據顯示&#xff0c;63%的游戲服務器攻擊采用UDP反射放大&#xff08;如NTP、Memcached協議&#xff09;與HTTP慢速攻擊&#xff08;如Slowloris&#xff09;相結…

[自動化Adapt] 錄制引擎 | iframe 穿透 | NTP | AIOSQLite | 數據分片

鏈接&#xff1a;https://github.com/OpenAdaptAI/OpenAdapt/wiki/OpenAdapt-Architecture-(draft) docs&#xff1a;OpenAdapt OpenAdapt 是一個開源項目&#xff0c;旨在 記錄 和 回放 用戶在計算機上的交互行為。 它如同智能助手般 觀察 我們的操作&#xff08;鼠標點擊、…

ipv6學習

ipv6的歷史背景和及展望ipv6普及不夠&#xff0c;ipv4快要用完。ipv6技術部分ivp6包頭結構ipv6不允許分片&#xff0c;減輕中間設備壓力。IPv6 包頭結構可按字段分層解析&#xff0c;核心特點是 固定頭部長度&#xff08;40 字節&#xff09; &#xff0c;將可選功能移至擴展頭…

軟件定義汽車 --- 電子電氣架構的驅動

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

HTML5 語義元素

HTML5 語義元素 引言 HTML5 作為現代網頁開發的基礎&#xff0c;引入了許多新的語義元素&#xff0c;這些元素使得網頁內容更加結構化&#xff0c;便于搜索引擎更好地理解和索引頁面內容。本文將詳細介紹 HTML5 中的語義元素&#xff0c;并探討其在網頁設計中的應用。 HTML5…

vue3 el-select el-option 使用

在 Vue 3 中&#xff0c;el-select 是 Element Plus 組件庫中的一個選擇器組件&#xff0c;它允許用戶從下拉菜單中選擇一個或多個選項。如果你想在使用 Vue 3 和 Element Plus 時讓 el-select 支持多種選擇&#xff08;即多選&#xff09;&#xff0c;你可以通過設置 multiple…

windows搬運文件腳本

使用方法&#xff1a;copy_files_by_prefix.bat [目標目錄] [結果目錄] [文件名前綴] [可選參數&#xff1a;文件包含內容]echo off chcp 65001 >nul setlocal enabledelayedexpansion:: Check parameters if "%~3""" (echo Usage: %~nx0 [SourceDir] […