每天一道面試題@第五天

1.包裝類型的緩存機制了解么?

指部分包裝類在創建對象時,會將一定范圍內的對象緩存起來,當再次使用相同值創建對象時,優先從緩存中獲取,而不是重新創建新對象。【提高性能】【節省內存】

列舉幾個常見的包裝類緩存機制:

(1)Integer?類在?-128?到?127?這個范圍內有緩存機制。當使用?Integer.valueOf(int)?方法創建?Integer?對象時,如果值在這個范圍內,會直接從緩存中獲取對象,否則會創建新對象。

Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b); // 輸出 true,因為從緩存中獲取的同一個對象Integer c = Integer.valueOf(200);
Integer d = Integer.valueOf(200);
System.out.println(c == d); // 輸出 false,因為值不在緩存范圍內,創建了新對象

(2)ByteShort?和?Long?類也有類似的緩存機制,緩存范圍都是?-128?到?127

Byte byte1 = Byte.valueOf((byte) 10);
Byte byte2 = Byte.valueOf((byte) 10);
System.out.println(byte1 == byte2); // 輸出 trueShort short1 = Short.valueOf((short) 100);
Short short2 = Short.valueOf((short) 100);
System.out.println(short1 == short2); // 輸出 trueLong long1 = Long.valueOf(120L);
Long long2 = Long.valueOf(120L);
System.out.println(long1 == long2); // 輸出 true

(3)Character?類會緩存從?\u0000?到?\u007F(即?0?到?127)的字符對象。

Character char1 = Character.valueOf('A');
Character char2 = Character.valueOf('A');
System.out.println(char1 == char2); // 輸出 true

(4)Boolean?類會緩存?true?和?false?兩個對象。

Boolean bool1 = Boolean.valueOf(true);
Boolean bool2 = Boolean.valueOf(true);
System.out.println(bool1 == bool2); // 輸出 true

【注意】只有使用?valueOf?方法創建對象時才會觸發緩存機制,如果使用?new?關鍵字創建對象,無論值是否在緩存范圍內,都會創建新對象。

2. 自動裝箱與拆箱了解嗎?原理是什么?

Java的自動裝箱和拆箱是Java 5 引入的,主要用于簡化基本數據類型和對應的包裝類之間的轉換操作。

自動裝箱:指基本類型自動轉換成對應的包裝類對象。如 int 自動轉 Integer。

自動拆箱:指包裝類對象自動轉換成對應的基本類型。如 Integer自動轉int。

// 自動裝箱
int num1 = 10;
Integer num2 = num1;// 自動拆箱
Integer num3 = 20;
int num4 = num3;

自動裝箱和拆箱的原理:

自動裝箱原理:在編譯階段,編譯器會調用包裝類的valueOf()方法來實現自動裝箱。

例如,上述代碼中的Integer num2 = num1;

在編譯后實際上會變成Integer num2 = Integer.valueOf(num1);。

自動拆箱:在編譯階段,編譯器會調用包裝類的xxxValue()方法來實現自動拆箱。

像int num4 = num3;

在編譯后會變為int num4 = num3.intValue();。

包裝類的緩存機制,又在這里得到了驗證。

3. 淺拷貝和深拷貝區別了解嗎?什么是引用拷貝?

淺拷貝、深拷貝和引用拷貝是三種不同的對象復制方式。

(1)引用拷貝僅僅是復制對象的引用,而不會創建新的對象。也就是說,原對象和復制后的對象都指向內存中的同一個實例。因此,對其中一個對象的修改會反映到另一個對象上。

(2)淺拷貝會創建一個新的對象,然后將原對象的非靜態字段復制到新對象中。如果字段是基本數據類型,就直接復制其值;如果字段是引用類型,只復制引用,而不復制對象本身。這意味著原對象和淺拷貝對象中的引用類型字段會指向同一個對象(也就是說原對象的內部類會直接引用)。

要實現淺拷貝,可以讓類實現?Cloneable?接口并重寫?clone()?方法。

(3)深拷貝同樣會創建一個新的對象,并且會遞歸地復制原對象的所有字段,包括引用類型的字段。這意味著原對象和深拷貝對象中的引用類型字段指向不同的對象,對一個對象的修改不會影響到另一個對象

要實現深拷貝,可以通過序列化和反序列化來完成,也可以手動遞歸地復制所有引用類型的字段。

4. 談談對 Java 注解的理解,解決了什么問題?

注解可以看作是一種特殊的標記,它可以應用于包、類、方法、字段等元素上,以提供額外的信息。注解通過?@?符號來標識,例如?@Override@Deprecated?等。Java 提供了一些內置的注解,同時開發者也可以自定義注解。

注解解決的問題:

(1)編譯時檢查:編譯器會檢查被?@Override?注解標記的方法是否真的重寫了父類的方法,如果沒有則會報錯。這樣可以避免因方法名拼寫錯誤或方法簽名不匹配而導致的潛在問題。

(2)代碼生成:在一些框架中,注解可以用于生成代碼。如 Lombok?

(3)配置信息管理:注解可以用于替代傳統的配置文件,將配置信息直接嵌入到代碼中。例如,Spring 框架使用?@Component@Service@Repository?等注解來標識組件,將組件的配置信息與代碼緊密結合,提高了代碼的可維護性。

(4)運行時信息的獲取:通過反射機制,在運行時獲取注解的信息,并根據這些信息執行相應的操作。例如,JUnit 框架使用?@Test?注解來標記測試方法,在運行測試時,JUnit 會通過反射查找所有被?@Test?注解標記的方法并執行。

5. Exception 和 Error 有什么區別?

Exception?和?Error?都繼承自?Throwable?類

Exception?表示程序運行時可能出現的可處理的異常情況。開發人員能夠通過捕獲和處理這些異常。

Error?表示系統級別的錯誤通常是由 JVM或者底層系統出現問題引發的。

應用場景

  • Exception
    • 受檢查異常:在編譯時就需要被處理的異常,若不處理,程序將無法通過編譯,例如?IOExceptionSQLException?等。
    • 運行時異常:編譯時不需要強制處理,例如?NullPointerExceptionArrayIndexOutOfBoundsException?等。
  • Error:一般是系統級的錯誤,常見的有?OutOfMemoryErrorStackOverflowError?

6. Java 反射?反射的缺點?反射的應用場景?

?反射是什么?

反射(Reflection)是 Java 提供的一種動態機制,允許程序在運行時獲取類的元數據(如類名、方法、字段、構造器等),并動態操作類或對象(如實例化對象、調用方法、訪問私有成員等)。其核心是通過?Class?對象實現,關鍵 API 包括:

  • Class?類:表示類的元數據。

  • MethodFieldConstructor:分別表示方法、字段和構造器。

示例:通過類名動態創建對象:
Class<?> clazz = Class.forName("com.example.User");
Object user = clazz.newInstance();

反射的缺點

  • 性能開銷:反射調用涉及動態解析和 JVM 優化限制(如無法內聯方法),性能比直接調用低。但通過緩存?Method?對象或使用?setAccessible(true)?關閉安全檢查可緩解。

  • 破壞封裝性:可訪問私有成員(如?private?方法或字段),可能導致代碼安全隱患。

  • 代碼復雜度:反射代碼冗長,需處理大量異常(如?ClassNotFoundException),降低可讀性和維護性。

  • 兼容性風險:反射依賴類的內部細節(如方法名、參數列表),若類結構變更(如版本升級),反射代碼可能失效。

  • 泛型擦除:反射無法直接獲取泛型類型信息(如?List<String>?在運行時變為?List)。

?反射的應用場景

  • 框架開發

    • Spring 依賴注入:通過反射實例化 Bean 并注入屬性。

    • ORM 框架(如 Hibernate):將數據庫結果映射到 Java 對象。

    • 動態代理(如 AOP):生成代理類攔截方法調用。

  • 序列化/反序列化:如 Jackson 通過反射讀取對象字段生成 JSON。

  • 測試工具:JUnit 使用反射調用測試方法。

  • 插件化架構:動態加載類(如通過配置文件的類名實例化對象)。

  • IDE 和調試工具:實時獲取對象信息(如變量值、方法列表)。

7. Java 泛型了解么?什么是類型擦除?介紹?下常?的通配符?

Java泛型&通配符

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

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

相關文章

mysql--索引

索引作為一種數據結構&#xff0c;其用途是用于提升檢索數據的效率。 分類 普通索引&#xff08;INDEX&#xff09;&#xff1a;索引列值可重復 唯一索引&#xff08;UNIQUE&#xff09;&#xff1a;索引列值必須唯一&#xff0c;可以為NULL 主鍵索引&#xff08;PRIMARY KEY&a…

王道考研數據結構課后題代碼題(2026版)——排序部分

一、前言 本合集以王道考研《數據結構》輔導書&#xff08;2026版&#xff09;課后習題代碼題部分為參考依據&#xff0c;給出課后習題代碼題的可執行代碼的實現&#xff0c;本合集使用編程語言以C/C語言為主&#xff0c;也不限于使用Python和Java語言&#xff0c;本套合計代碼…

AVFormatContext 再分析零

隨著對于AVFormatContext 各個參數的學習&#xff0c;逐漸可以從 整體架構上 再認識一下 AVFormatContext 了。 還是從解封裝的第一步開始。 int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 實際上…

uniapp打包apk詳細教程

目錄 1.打apk包前提條件 2.獲取uni-app標識 3.進入dcloud開發者后臺 4.開始打包 1.打apk包前提條件 1.在HBuilderX.exe軟化中&#xff0c;登錄自己的賬號 2.在dcloud官網&#xff0c;同樣登錄自己的賬號。沒有可以免費注冊。 2.獲取uni-app標識 獲取方法&#xff1a;點…

Vue2 和 Vue3 的核心區別

1. 響應式原理&#xff1a;從「手動擋」到「自動擋」 Vue2&#xff1a; 使用 Object.defineProperty 監聽數據變化&#xff0c;但無法檢測新增屬性和數組索引修改&#xff0c;需要借助 Vue.set。 // Vue2 中修改數組元素不會觸發視圖更新 this.list[0] 新值; // ? 不…

EMMC存儲性能測試方法

記于 2022 年 9 月 15 日 EMMC存儲性能測試方法 - Wesley’s Blog 參考Android-emmc性能測試 | 一葉知秋進行實踐操作 dd 命令 頁面緩存 為了測試 emmc 的真實讀寫性能&#xff0c;我們需要先把頁面緩存給清理&#xff1a; echo 1 > /proc/sys/vm/drop_caches console:…

軟件管理(安裝方式)

1.rpm安裝 1.1.rpm介紹 rpm軟件包名稱: 軟件名稱 版本號(主版本、次版本、修訂號) 操作系統 -----90%的規律 舉例:openssh-6.6.1p1-31.el7.x86_64.rpm 數字是版本號:第一位主版本號,第二位次版本號,帶橫杠的是修訂號, el幾---操作系統的版本。 #用rpm安裝需要考慮如下信…

OnlyOffice Document Server 源碼調試指南-ARM和x86雙模式安裝支持

在ARM64架構下創建的ONLYOFFICE源碼調試容器具有顯著優勢。該容器基于官方Document Server鏡像構建&#xff0c;通過集成Git、Python和Node.js等工具鏈&#xff0c;實現跨平臺環境一致性&#xff0c;確保ARM設備的兼容性。容器化隔離消除了依賴沖突&#xff0c;支持快速部署到邊…

oracle 數據庫查詢指定用戶下每個表占用空間的大小,倒序顯示

oracle 查詢指定用戶下每個表占用空間的大小&#xff0c;倒序顯示 使用場景&#xff1a;數據分析&#xff1b;導出醫院正式庫到開發環境時&#xff0c;查詢出占用表空間高的業務表、導出時排除該表 在Oracle數據庫中&#xff0c;要查詢指定用戶下每個表占用空間的大小并以倒序…

歸并排序【逆序對】

目錄 歸并排序原理 逆序對 歸并排序 主要利用分治思想&#xff0c;時間復雜度O(nlogn) 原理 1.對數列不斷等長拆分&#xff0c;直到一個數的長度。2.回溯時&#xff0c;按升序合并左右兩段。3.重復以上兩個過程&#xff0c;直到遞歸結束。 合并 1.i&#xff0c;j分別指向a的…

AI 與生物技術的融合:開啟精準醫療的新紀元

在科技飛速發展的今天&#xff0c;人工智能&#xff08;AI&#xff09;與生物技術的融合正在成為推動醫療領域變革的重要力量。精準醫療作為現代醫學的重要發展方向&#xff0c;旨在通過深入了解個體的基因信息、生理特征和生活方式&#xff0c;為患者提供個性化的治療方案。AI…

對比表格:數字簽名方案、密鑰交換協議、密碼學協議、后量子密碼學——密碼學基礎

文章目錄 一、數字簽名方案1.1 ECDSA&#xff1a;基于橢圓曲線的數字簽名算法1.2 EdDSA&#xff1a;Edwards曲線數字簽名算法1.3 RSA-PSS&#xff1a;帶有概率簽名方案的RSA1.4 數字簽名方案對比 二、密鑰交換協議2.1 Diffie-Hellman密鑰交換2.2 ECDH&#xff1a;橢圓曲線Diffi…

Linux 進程間通信(IPC)詳解

進程間通信&#xff08;IPC&#xff09;深入解析 一、進程間通信概述 在操作系統里&#xff0c;不同進程間常常需要進行數據交換、同步協調等操作&#xff0c;進程間通信&#xff08;Inter - Process Communication&#xff0c;IPC&#xff09;機制應運而生。在Linux系統中&a…

深度解析ComfyUI的使用

一、ComfyUI 概述 ComfyUI 本質上是一個專為 AI 繪畫愛好者和專業人士打造的用戶界面工具&#xff0c;它的核心作用是將復雜的 AI 繪畫生成過程以直觀的方式呈現給用戶。與傳統的圖像生成工具不同&#xff0c;ComfyUI 借助其獨特的節點化工作流系統&#xff0c;把深度學習模型…

模型測試報錯:有2張顯卡但cuda.device_count()顯示GPU卡數量只有一張

此貼僅為記錄debug過程&#xff0c;為防后續再次遇見 問題 問題情境 復現文章模型&#xff0c;使用GPU跑代碼&#xff0c;有兩張GPU&#xff0c;設置在 cuda: 1 上跑 問題描述 在模型測試加載最優模型時報錯&#xff1a;torch.cuda.device_count()顯示GPU卡數量只有一張&…

【計網】認識跨域,及其在go中通過注冊CORS中間件解決跨域方案,go-zero、gin

一、跨域&#xff08;CORS&#xff09;是什么&#xff1f; 跨域&#xff0c;指的是瀏覽器出于安全限制&#xff0c;前端頁面在訪問不同源&#xff08;協議、域名、端口任一不同&#xff09;的后端接口時&#xff0c;會被瀏覽器攔截。 比如&#xff1a; 前端地址后端接口地址是…

內存性能測試方法

寫于 2022 年 6 月 24 日 內存性能測試方法 - Wesley’s Blog dd方法測試 cat proc/meminfo console:/ # cat proc/meminfo MemTotal: 3858576 kB MemFree: 675328 kB MemAvailable: 1142452 kB Buffers: 65280 kB Cached: 992252 …

AVFormatContext 再分析二

說明 &#xff1a;將 avfromatContext 的變量依次打印分析&#xff0c;根據ffmpeg 給的說明&#xff0c;猜測&#xff0c;結合網上的文章字節寫測試代碼分析二。 37 AVInputFormat *iformat; /** * The input container format. * * Demuxing only, set by avfo…

深入了解Linux系統—— 進程優先級

前言 我們現在了解了進程是什么&#xff0c;進程狀態表示什么 &#xff0c;我們現在繼續來了解進程的屬性 —— 進程優先級 進程執行者 在了解進程優先級之前&#xff0c;先來思考一個問題&#xff1a;在我們進行文件訪問操作時&#xff0c;操作系統是如何直到我們是誰&#x…

Expected SARSA算法詳解:python 從零實現

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…