2025熱門八股文學(xué)習(xí))
介紹這是從面試網(wǎng)站自我理解整理的面試筆記如有不對的地方請大佬指正也歡迎大家關(guān)注我和我一起學(xué)習(xí)沖擊大廠如果文章對你有些許幫助不妨不要吝嗇大伙的點贊收藏這是我出下一篇的筆記最大的支持~~~如果侵權(quán)純屬巧合通知我會修改Java 中的序列化和反序列化是什么序列化序列化將對象轉(zhuǎn)為字節(jié)流對象。網(wǎng)絡(luò)傳輸遠(yuǎn)程調(diào)用分布式系統(tǒng)等...類上繼承java.io.serilizable接口實現(xiàn)方法反序列化將字節(jié)流對象轉(zhuǎn)為java對象。transient關(guān)鍵字可標(biāo)記不被序列化字段。SerialVersionUID用于反序列化時驗證版本是否一致.什么是 Java 中的不可變類不可變類類字段有private和final創(chuàng)建后類的字段一切都不能修改。聲明類為final類不能被繼承。只能通過構(gòu)造函數(shù)初始化。不提供任何修改字段方法。類包含可變對象引用確保該對象外部無法修改。String、Integer、Character、LocalDate、BigDecimal等Java 中 Exception 和 Error 有什么區(qū)別Exception和Error都實現(xiàn)于Throwable接口。Exception編譯時異常checkedException和運行異常uncheckedException。檢查錯誤需要通過try...catch進(jìn)行捕獲或throw拋出。運行時異常常見有空指針異常不合法變量。ErrorJVM級錯誤比較嚴(yán)重的錯誤無法在代碼層面修改解決。棧溢出內(nèi)存耗盡你認(rèn)為 Java 的優(yōu)勢是什么跨平臺一次編譯處處運行。生態(tài)生態(tài)圈龐大比如spring全家桶開源社區(qū)龐大。面向?qū)ο蠓庋b、繼承、多態(tài)。垃圾回收內(nèi)存管理交給GC垃圾自動回收提高內(nèi)存管理效率。什么是 Java 的多態(tài)特性多態(tài)一個方法在不同對象上有不同的行為。分為編譯時多態(tài)和運行時多態(tài)編譯時多態(tài)方法重載實現(xiàn)相同方法不同行為。運行時多態(tài)方法重寫實現(xiàn)繼承關(guān)系或接口實現(xiàn)時相同方法不同類不同行為。優(yōu)勢降低代碼耦合度增強(qiáng)擴(kuò)展性。Java 中的參數(shù)傳遞是按值還是按引用參數(shù)傳遞按值傳遞無論基本數(shù)據(jù)類型還是引用類型?;緮?shù)據(jù)類型傳遞數(shù)值。修改不影響原始變量。引用數(shù)據(jù)類型傳遞對象引用的內(nèi)存地址??尚薷膶ο髮傩缘珶o法改變其引用本身。為什么 Java 不支持多重繼承會出現(xiàn)鉆石繼承問題導(dǎo)致無法找到對應(yīng)的方法。jdk8以前接口無法實現(xiàn)方法不會出現(xiàn)該問題。jdk8后接口出現(xiàn)默認(rèn)方法如果出現(xiàn)多個方法沖突則強(qiáng)制類中重寫該方法。抽象類無法多繼承Java 面向?qū)ο缶幊膛c面向過程編程的區(qū)別是什么面向?qū)ο蠡陬悺?shù)據(jù)和方法封裝為對象為基本單位。繼承、封裝、多態(tài)注重模塊和對象之間的配合。面向過程基于方法函數(shù)。以過程來組織代碼。注重過程邏輯分布。OOP更適合需擴(kuò)展的復(fù)雜系統(tǒng)面向過程更適合簡單任務(wù)。人.煮咖啡 對比 執(zhí)行煮咖啡方法Java 方法重載和方法重寫之間的區(qū)別是什么重載編譯時找到。同一個類中方法名一樣通過參數(shù)數(shù)量位置類型找到方法。返回類型可不一樣。訪問修飾符不受影響。重寫運行時找到。繼承或接口實現(xiàn)參數(shù)類方法名返回都不能更改。子類訪問修飾符不能小于父類。不能拋出比父類更多的異常。什么是 Java 內(nèi)部類它有什么作用內(nèi)部類類中內(nèi)部定義的類可以訪問外部類的成員變量。分為成員內(nèi)部類靜態(tài)內(nèi)部類只能訪問外部靜態(tài)成員局部內(nèi)部類匿名內(nèi)部類。訪問外部類成員操作外部類對象場景有用。簡化代碼開發(fā)。封裝性邏輯相關(guān)類封裝一起提高內(nèi)聚。事件處理回調(diào)函數(shù)或事件監(jiān)聽簡化結(jié)構(gòu)。在實際jvm中沒有內(nèi)部類編譯出來還是正常類。JDK8 有哪些新特性接口有默認(rèn)實現(xiàn)方法default。新增時間類LocalDateTime線程安全。Stream流方便操作集合。Optional類。lambda表達(dá)式。元空間代替永久代元空間是分配在直接內(nèi)存中解決永久代存在的內(nèi)存不足GC效率低。Java 中 String、StringBuffer 和 StringBuilder 的區(qū)別是什么String線程安全不可變final適用操作少量字符串。StringBuffer線程安全可變適用并發(fā)頻繁操作字符串。synchronizedStringBuilder線程不安全適用單線程大量操作字符串。Java 的 StringBuilder 是怎么實現(xiàn)的stringbuilder解決不可變字符串問題。在jdk1.8中底層使用char[] value數(shù)組占用連續(xù)內(nèi)存空間默認(rèn)大小是16也可以自行修改。常用方法有append、insert、delete、replace等append字符串拼接底層實現(xiàn)int舉例將int數(shù)字轉(zhuǎn)為字符所占位數(shù)Integer.stringSize,查表法判斷char[] 是否充足不充足擴(kuò)容充足就放入。擴(kuò)容Arrays.copyOf方法將容量擴(kuò)大到原始容量兩倍2。沒有實現(xiàn)縮容優(yōu)化策略節(jié)約內(nèi)存可以將char[] 改為byte[]然后添加一個標(biāo)記區(qū)分不同編碼。jdk9Java 中包裝類型和基本類型的區(qū)別是什么基本類型:int , short ,long , double ,float , byte , boolean , char不可變。默認(rèn)不是0就是false沒有null。比較的是值。性能快。初始化方式直接創(chuàng)建。局部變量存儲在棧成員變量存儲在堆。包裝類型:Integer,Short,Long,Double,Float,Byte,Boolean,Character操作對象屬性。默認(rèn)是null。比較的是引用對象地址eqalus比較值。性能慢。new對象。存儲在堆。接口和抽象類有什么區(qū)別接口自上而下設(shè)計。成員變量默認(rèn)public static final常量。方法默認(rèn)是public abstract方法Java8后可設(shè)置default方法或靜態(tài)方法。允許多實現(xiàn)。抽象類自下而上設(shè)計。成員變量沒有約束。方法可以abstract未實現(xiàn)方法和具體方法。只允許單繼承。JDK 和 JRE 有什么區(qū)別JDK是java開發(fā)工具包它包含了常用開發(fā)工具和JRE運行環(huán)境給開發(fā)人員使用可以將.java文件轉(zhuǎn)為.class字節(jié)文件以供運行。JRE是java運行環(huán)境它包含了Java常見庫和JVM虛擬機(jī)給最終用戶使用提供運行Java程序運行環(huán)境。JVM虛擬機(jī)提供運行.class文件的工具如果單有jvm是無法執(zhí)行java程序的。Java 中 hashCode 和 equals 方法是什么它們與 操作符有什么區(qū)別hashCodeequals和都是java用于比較對象的方法。hashcode通常是用于在散列表內(nèi)存存儲中記錄位置如果對象的hashcode不同那么對象肯定不同。而equals通常比較的是對象的屬性值是否一致如果需要可以重寫equals如果對象equals相等那么它們的hashCode也一定相等但反之卻不一定。比較的是對象中的引用地址如果是基本數(shù)據(jù)類型則比較對象的值。什么是 Java 中的動態(tài)代理動態(tài)代理是一種在運行時動態(tài)生成代理對象的技術(shù)它可以在不修改原有對象代碼的情況下擴(kuò)展或改變對象的行為。動態(tài)代理的核心思想是通過一個代理對象來間接訪問目標(biāo)對象從而在目標(biāo)對象的方法執(zhí)行前后插入額外的邏輯。動態(tài)代理的常用方法有JDK動態(tài)代理和CGLIB動態(tài)代理JDK 動態(tài)代理和 CGLIB 動態(tài)代理有什么區(qū)別1.JDK動態(tài)代理只能代理實現(xiàn)了接口的類通過實現(xiàn)InvocationHandler接口進(jìn)行方法增強(qiáng)操作通過proxy創(chuàng)建代理對象2.CGLIB通過繼承的方式實現(xiàn)代理所有要求被代理類和方法不能使用final修飾。Java 中的注解原理是什么注解其實是對對象的描述提供了一種元數(shù)據(jù)的方式其本身并不影響具體對象的功能。常用于框架開發(fā)等可以通過反射機(jī)制拿到對應(yīng)的注解與其值然后對其擴(kuò)展功能或修改。注解的使用可以用interface關(guān)鍵字進(jìn)行標(biāo)識元注解有Rentention描述注解的有效范圍Target描述注解使用的對象。你使用過 Java 的反射機(jī)制嗎如何應(yīng)用反射反射機(jī)制指的是在運行過程中獲取對象屬性與方法無需在編譯時了解該對象情況并對其進(jìn)行強(qiáng)制操作。一般用于框架開發(fā)。詳細(xì)使用Java 中的反射機(jī)制1. 反射的本質(zhì)反射機(jī)制允許程序在運行時動態(tài)獲取類的元數(shù)據(jù)如類名、方法、字段等并操作對象的屬性和方法。反射的核心類是java.lang.Class它表示一個類或接口的元數(shù)據(jù)。2. 反射的核心類Class類用于獲取類的元數(shù)據(jù)??梢酝ㄟ^Class.forName()、對象.getClass()或類名.class獲取Class對象。Method類用于獲取和調(diào)用方法??梢酝ㄟ^Class.getMethod()或Class.getDeclaredMethod()獲取Method對象。Field類用于獲取和修改字段??梢酝ㄟ^Class.getField()或Class.getDeclaredField()獲取Field對象。Constructor類用于獲取和調(diào)用構(gòu)造方法。可以通過Class.getConstructor()或Class.getDeclaredConstructor()獲取Constructor對象。3. 反射的典型應(yīng)用場景框架開發(fā)如 Spring 通過反射實現(xiàn)依賴注入DI和 AOP。如 Hibernate 通過反射實現(xiàn)對象關(guān)系映射ORM。動態(tài)代理通過反射調(diào)用目標(biāo)對象的方法。配置文件解析通過反射動態(tài)加載類和調(diào)用方法。4. 反射的優(yōu)缺點優(yōu)點靈活性高可以在運行時動態(tài)操作對象。適用于框架開發(fā)和動態(tài)加載類。缺點性能開銷較大反射操作比直接調(diào)用慢。安全性較低可以訪問私有成員破壞封裝性。什么是 Java 的 SPIService Provider Interface機(jī)制SPI是一種插件機(jī)制用于運行時動態(tài)加載服務(wù)的實現(xiàn)。它通過定義接口并提供一種可擴(kuò)展的方式來讓服務(wù)提供者運行時注入實現(xiàn)解耦和模塊化設(shè)計。Java 泛型的作用是什么泛型在編譯時檢查類型安全可以將代碼抽離復(fù)用避免運行時發(fā)生類型轉(zhuǎn)換錯誤。大白話說能夠?qū)⑦\行時異常轉(zhuǎn)為編譯時異常。Java 泛型擦除是什么泛型擦除是為了適應(yīng)java1.4版本及之前版本的向后兼容性Java在編譯階段將泛型信息擦除將其轉(zhuǎn)換為該對象的上限如果沒有就轉(zhuǎn)為Object類這樣所有泛型信息都不再保留稱為泛型擦除。什么是 Java 泛型的上下界限定符泛型的上下界定符用于指定泛型傳入的范圍比如上界定符為extends T指的是傳入時需要傳入T的子類包括T而下界定符為 super T是傳入T的父類包括TJava 中的深拷貝和淺拷貝有什么區(qū)別深拷貝遞歸復(fù)制原來對象的屬性生成一份獨立于原來的對象修改不影響原來的對象淺拷貝復(fù)制引用的內(nèi)存地址指向原來的對象修改影響原來的值什么是 Java 的 Integer 緩存池在大部分使用場景中發(fā)現(xiàn)int的使用大部分在小數(shù)值范圍為了提升速度Java中引入integer緩存池從-128到127范圍減少內(nèi)存分支加快運行速度減少每次調(diào)用生成新的integer對象。使用場景自動裝箱和值比較Java 的類加載過程是怎樣的Java的類加載過程分為加載連接初始化三個階段在加載階段通過類加載器將類對象轉(zhuǎn)為字節(jié)碼文件連接分為驗證準(zhǔn)備和解析三個子階段。驗證字節(jié)碼文件是否安全并為靜態(tài)變量和方法分配內(nèi)存空間將常量池的符號引用轉(zhuǎn)為直接引用初始化階段將執(zhí)行類的初始化邏輯并將靜態(tài)變量和靜態(tài)代碼塊的初始化操作整合運行什么是 Java 的 BigDecimalBigDecimal是Java中用于高精度計算的類屬于Java.math包常用于數(shù)學(xué)和金融領(lǐng)域。它的特點有1.可以處理任何精度的數(shù)值不像double和float限制精度位數(shù)2.BIgDecimal是一個不可變類每次使用都會創(chuàng)建一個新的對象使用時要注意性能問題3.豐富的功能提供加減乘除等多種方法BigDecimal 為什么能保證精度不丟失?BigDecimal內(nèi)部是使用整數(shù)表示法通過整數(shù)部分intVal和一個記錄小數(shù)點scale的位置避免了浮點數(shù)計算時的誤差。計算時通過整數(shù)計算結(jié)合小數(shù)點位置和設(shè)置的精度去計算。使用 new String(y) 語句在 Java 中會創(chuàng)建多少個對象一個或兩個對象。首先會在堆內(nèi)存中的字符串常量池中查找是否有對應(yīng)的字符串如果沒有則會先在字符串常量池里創(chuàng)建對應(yīng)的字符串再到堆中創(chuàng)建一個對象引用該字符串。如果有的話則只在堆中創(chuàng)建一個字符串。Java 中 final、finally 和 finalize 各有什么區(qū)別final是修飾不可變對象。加在類上類無法被繼承和修改。加在方法上方法無法被重寫和修改。加在變量上變量無法被修改。finally是在try...catch中無論如何都會執(zhí)行。一般用于釋放資源。finalize是Object類中的方法允許對象在被回收前進(jìn)行清理操作。少用因為JVM不保證finalize會被及時執(zhí)行。為什么在 Java 中編寫代碼時會遇到亂碼問題編碼和譯碼不一致。為什么 JDK 9 中將 String 的 char 數(shù)組改為 byte 數(shù)組JDK9之前char數(shù)組用于存儲utf-16編碼每個字符會占兩個字節(jié)。但如果有些字節(jié)只占用一個字節(jié)那么就會浪費空間比如一些latin-1字符用一個字節(jié)。所以采用byte數(shù)組可以減少內(nèi)存占用。并引入coder來標(biāo)識編碼方式保持了兼容性。如何在 Java 中調(diào)用外部可執(zhí)行程序或系統(tǒng)命令Runtime.exec或者ProcessBuilder如果一個線程在 Java 中被兩次調(diào)用 start() 方法會發(fā)生什么線程會發(fā)生異常。一個線程只能被調(diào)用一次線程一旦被啟動無法回到初始狀態(tài)。否則會發(fā)生illegalThreadException。棧和隊列在 Java 中的區(qū)別是什么棧先進(jìn)后出在java中可以用Stack或者LinkedList雙端隊列實現(xiàn)。使用場景函數(shù)調(diào)用隊列先進(jìn)先出可以用QueueLinkedList。使用場景消息隊列Java 的 Optional 類是什么它有什么用它是Java8新出的一個容器類??梢蕴幚砣绻椒ǚ祷氐氖莕ull對象時類的保存機(jī)制可以減少空指針異常。它提供了一套清楚的處理空值的方法比如常用的orElse.Java 的 I/O 流是什么I/O流是處理數(shù)據(jù)讀入讀出的接口。I/O流分為字節(jié)流和字符流字節(jié)流處理8位字節(jié)用于處理二進(jìn)制數(shù)據(jù)視頻文件。主要類是InputStream和OutputStream及其子類。字符流用于處理16位字節(jié)適合處理文本文件。主要類有reader和writer。什么是 Java 的網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程是Java中用于通信的工具。IP網(wǎng)絡(luò)中計算機(jī)的地址。端口號計算機(jī)中應(yīng)用程序的位置。Socket用于在計算機(jī)間通信的工具。協(xié)議通信間需遵循的規(guī)則。TCP三次握手。比較安全但傳輸速度不夠快UDP無連接的協(xié)議但傳輸速度快。Java 中的基本數(shù)據(jù)類型有哪些整型byte1字節(jié)、short(2)、int(4)、long(8)浮點型float(4)、double8字符型char2布爾型boolean(根據(jù)JVM查看一般一個或多個)什么是 Java 中的自動裝箱和拆箱Integer、Character、Short、Long、Boolean、Double、Byte、Float自動裝箱將基礎(chǔ)數(shù)據(jù)類型自動轉(zhuǎn)為包裝類。常見的例子有ListInteger a ...會自動將傳入的基本數(shù)據(jù)類型轉(zhuǎn)為對象。拆箱將包裝類自動轉(zhuǎn)為基礎(chǔ)數(shù)據(jù)類型。簡化代碼開發(fā)提高代碼閱讀性。什么是 Java 中的迭代器Iterator迭代器是在Collection接口中用于遍歷元素操作元素的工具不注重集合類的實現(xiàn)。優(yōu)點方便快捷操作集合中的元素。核心方法hasNext查看是否下一個元素next轉(zhuǎn)到下個元素remove方法。但其他線程在中途修改會快速失敗報錯Java 運行時異常和編譯時異常之間的區(qū)別是什么主要有三個不同發(fā)生時機(jī)處理方式和設(shè)計意圖編譯時異常在編譯過程中出錯一般要進(jìn)行try..catch進(jìn)行捕獲或throw拋出錯誤進(jìn)行處理否則無法使用。常見的編譯時異常處理釋放資源。設(shè)計意圖外部因素引發(fā)需捕獲處理運行時異常在運行過程中出錯一般是程序邏輯錯誤可以在運行前發(fā)現(xiàn)解決。常見運行異常空指針異常數(shù)組越界。設(shè)計意圖邏輯漏洞在調(diào)試階段可以處理。什么是 Java 中的繼承機(jī)制是三大特征之一指一個類在原有類的基礎(chǔ)上進(jìn)行extends關(guān)鍵字繼承用于擴(kuò)展原有對象的方法或者改變原有對象的行為體現(xiàn)層級結(jié)構(gòu)。是實現(xiàn)多態(tài)、抽象和代碼復(fù)用的關(guān)鍵機(jī)制。什么是 Java 的封裝特性封裝指將所有方法和屬性都存在一個對象中并對外提供查看和修改的接口。封裝主要目的是隱藏對象內(nèi)部實現(xiàn)細(xì)節(jié)只暴露必要功能從而保護(hù)數(shù)據(jù)和降低系統(tǒng)復(fù)雜性。Java 中的訪問修飾符有哪些public全部范圍protected其他包訪問不了default默認(rèn)子類不同包訪問不了private只有當(dāng)前類才能訪問Java 中靜態(tài)方法和實例方法的區(qū)別是什么Java 中 for 循環(huán)與 foreach 循環(huán)的區(qū)別是什么for循環(huán)是傳統(tǒng)遍歷方式提供步長循環(huán)條件支持索引下標(biāo)。foreach基于Iterator類開發(fā)如果循環(huán)過程中有修改則會快速失敗不支持索引下標(biāo)遍歷每個對象速度相對較快并且代碼可讀性高。什么是 Java 中的雙親委派模型雙親委派模型是類加載器在加載類的時候會將其交給父類進(jìn)行處理如果父類已加載此類則會直接返回加載后的class對象否則會再次傳給父類直到初始化加載器bootstrap ClassLoader再從上往下進(jìn)下加載。Java 中 wait() 和 sleep() 的區(qū)別wait是Object類的方法。會釋放對應(yīng)的內(nèi)存資源但會釋放鎖wait需要被notify喚醒必須配合synchronized一起使用否則會拋出異常。sleep是Thread類的方法會釋放對應(yīng)的內(nèi)存資源但不會釋放鎖資源。sleep1000在一秒后會自動喚醒Java Object 類中有什么方法有什么作用toString返回對象的字符串表現(xiàn)形式、clone默認(rèn)淺拷貝可重寫實現(xiàn)深拷貝、equals判斷對象是否相等、notify喚醒、notifyAll、wait等待、getClass拿到當(dāng)前的類、finalize釋放資源Java 中的字節(jié)碼是什么字節(jié)碼是編譯器編譯后處于源代碼和機(jī)器碼的中間表現(xiàn)形式可以交給虛擬機(jī)進(jìn)行解析為機(jī)器碼并運行。什么是 BIO、NIO、AIOBIO傳統(tǒng)阻塞I/O格式調(diào)用方發(fā)起IO請求時在任務(wù)未完成時會阻塞等待其完成后才繼續(xù)執(zhí)行。NIO非阻塞I/O格式調(diào)用方調(diào)用后無需等待線程完成通過selector實現(xiàn)多路復(fù)用技術(shù)可在執(zhí)行其他任務(wù)時等待其線程等到線程完成在回去執(zhí)行邊干活邊看著煮水AIO異步I/O格式調(diào)用方發(fā)起IO請求后無需等待線程。直到操作系統(tǒng)或底層庫完成IO操作后通知調(diào)用方。雇了個保姆看煮水什么是 Channel可以雙向讀寫。常用于非阻塞IO操作通過實現(xiàn)selector實現(xiàn)多路復(fù)用并發(fā)操作。有四種實現(xiàn)方式SocketChannel、ServerSocketChannel、DataGramChannel、FileChannel什么是 SelectorSelector是NIO中實現(xiàn)IO多路復(fù)用的組件可以通過一個單獨的線程管理多個通道Channel)事件。