1
【Q】:序列化和反序列化
【A】:
- 序列化是將Java對象轉化為字節流,用于網絡傳輸,持久化或緩存。Java提供了
java.io.Serializable
接口實現序列化。 - 反序列化是將字節流轉為為對象。
2
【Q】: Java中Exception和Error有什么區別?
【A】:
- 都是
Throwable
類的子類,在java中只有集成了Throwable
類的實例才可以被throw
或catch
。 - Exception是程序可以處理的異常情況,分為編譯時異常(在編譯時必須顯示處理,使用try-catche或throws聲音異常拋出)和運行時異常(集成RuntimeException)。
- Error是嚴重的錯誤,通常為JVM層次系統級的,無法預料的錯誤。如內存耗盡或棧溢出。
3
【Q】:Java的優勢是什么?
【A】:
- 跨平臺:java中加了一層中間件JVM,可以做到一次編譯多次運行。首先Java源代碼編譯成字節碼,字節碼再由JVM解釋或JIT編譯執行,業務JIT編譯需要預熱,所有還提供了AIT,將字節碼轉為機器碼。
- 垃圾回收:在內存充裕的情況下將內存管理交給GC來做。減輕編程效率。
- 生態:網上各種資料多。
- 面向對象:有明確 清晰的類,對象,繼承,接口等概念,支持封裝,繼承,多態等OOP特性。
4
【Q】:什么是java的多態?
【A】:
- 多態是指同一個接口或父類引用的變量可以指向不同的對象實例。它允許同一方法在不同對象上表現出不一樣的行為。
- 通過多態可以減低代碼耦合度,增加系統可擴展性。
5
【Q】:java中的參數傳遞是按值還是引用?
【A】:
- Java中,參數傳遞只有按值傳遞,不論是基本還是引用類型。
- 基礎數據類型:傳遞的是值的副本,即基礎類型的數值本身。
- 引用數據類型:傳遞的是引用的副本,即對象引用的內存地址。
6
【Q】:面向對象和面向過程的區別是什么?
【A】:
- 面向對象是把類或對象本身作為基本單元來組織代碼。
- 面向過程是把函數作為作為基本單元。
7
【Q】:Java中方法重載和方法重寫的區別?
【A】:
- 方法重載:一個類中運行用有多個同名方法,只要它們的參數列表不一樣。
- 方法重寫:子類在集成父類時,可以重寫父類的某個方法(參數列表,方法名都必須一樣)。
8
【Q】:什么是Java的內部類?
【A】:
- 是指在一個類的內部定義的類,Java支持多種類型的內部類,包括成員內部類、局部內部類、匿名內部類、靜態內部類。內部類可以訪問外部類的成員變量和方法,包括私有的成員。
9
【Q】:String、StringBuffer、StringBuilder的區別?
【A】:
- String:是不可變的類,一旦被創建無法修改,每次對String進行操作都會創建新的String對象。使用于少量字符串操作。
- StringBuffer:是可變的,可以進行字符串的追加,刪除,插入等。其是線程安全的,內部使用
synchronized
關鍵字保證多線程下的安全性。適用多線程環境的頻繁字符串修改。 - StringBuilder:是可變的。不保證線程安全,但性能更高。使用于單線程環境中的高性能字符串處理。
10
【Q】:StringBuilder是怎么實現的?
【A】:
- 主要是為了解決String對象的不可變性問題,提供高效動態的字符串拼接和修改操作。
- 大概核心實現如下:內部使用字符數組來存儲字符序列;提供append、insert等操作直接修改內部的字符數組;每次進行字符操作時,如果內存不足,它會通過擴展數組容量(一般為2倍),減少擴展次數,提高性能。