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