面試 Java 基礎八股文十問十答第十五期
作者:程序員小白條,個人博客
相信看了本文后,對你的面試是有一定幫助的!關注專欄后就能收到持續更新!
?點贊?收藏?不迷路!?
1)BIO, NIO, AIO 有什么區別?
- BIO(Blocking I/O):BIO 是傳統的 Java I/O 模型,它是阻塞的,意味著當一個線程執行 I/O 操作時,它會一直等待直到數據被讀取或寫入完成。這種模型下,每個連接都需要一個獨立的線程來處理,當連接數較大時會導致資源消耗嚴重,性能較差。
- NIO(Non-blocking I/O):NIO 是 Java 中引入的一種更靈活的 I/O 模型。它提供了通道(Channel)和緩沖區(Buffer)的概念,使得可以使用單個線程管理多個連接。NIO 提供了非阻塞的 I/O 操作,通過選擇器(Selector)可以輪詢多個通道的狀態,當某個通道就緒時,可以進行相應的讀寫操作。相比于 BIO,NIO 可以更高效地處理大量連接。
- AIO(Asynchronous I/O):AIO 是 Java 7 中引入的一種異步 I/O 模型。它在 NIO 的基礎上進一步提供了異步 I/O 操作的支持,即在進行 I/O 操作時可以指定一個回調函數,在操作完成時自動調用該函數,不需要線程等待。AIO 通常用于處理較大的數據流,例如文件的異步讀寫操作。
2)Files 的常用方法都有哪些?
Java 中的 Files
類提供了一組用于操作文件和目錄的靜態方法,常用的方法包括但不限于:
Files.exists(Path path)
:檢查指定路徑是否存在。Files.createFile(Path path)
:創建一個新文件。Files.createDirectory(Path dir)
:創建一個新目錄。Files.copy(Path source, Path target, CopyOption... options)
:復制文件或目錄。Files.move(Path source, Path target, CopyOption... options)
:移動文件或目錄。Files.delete(Path path)
:刪除文件或目錄。Files.readAllBytes(Path path)
:讀取文件的所有字節。Files.lines(Path path)
:逐行讀取文件內容。Files.write(Path path, byte[] bytes, OpenOption... options)
:將字節數組寫入文件。Files.write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
:將字符串集合逐行寫入文件。
3)什么是反射機制?
反射(Reflection)是指在運行時動態地獲取類的信息以及操作類的屬性和方法的能力。在 Java 中,反射機制允許程序在運行時檢查類的屬性和方法,獲取類的構造函數信息,創建類的實例,以及調用類的方法等。Java 的反射 API 主要包括 java.lang.Class
類以及其相關方法,例如 getField()
、getMethod()
、getConstructor()
等。
反射機制的主要應用場景包括但不限于:
- 在運行時動態加載類和創建對象,例如通過類名字符串來加載類并創建對象。
- 在運行時動態調用類的方法,例如通過方法名字符串來調用方法。
- 分析類的屬性和方法,例如獲取類的字段、方法、構造函數等信息。
- 實現通用的框架和工具,例如 Java 的 ORM(對象關系映射)框架和序列化框架。
盡管反射提供了一種強大的機制來操作類的屬性和方法,但由于其涉及到動態類型檢查和動態調用,通常會導致性能較低,并且在編寫代碼時易于出錯。因此,應該在必要時使用反射,避免濫用。
4)反射機制優缺點
優點:
- 動態性: 反射機制允許在運行時動態地加載類、創建對象、調用方法,從而使得程序的行為可以更加靈活和動態。
- 擴展性: 反射機制提供了一種強大的擴展機制,允許程序在不修改源代碼的情況下對現有類進行擴展和定制。
- 靈活性: 反射機制使得程序可以更加靈活地處理各種類型的對象,而不需要提前確定對象的類型。
缺點:
- 性能開銷: 反射涉及到動態類型檢查和方法調用,通常比直接調用方法要慢,因此可能會帶來一定的性能開銷。
- 安全性問題: 反射機制可以訪問和修改類的私有屬性和方法,因此可能會破壞封裝性,引起安全漏洞。
- 可讀性和維護性差: 反射使得程序的結構更加復雜,降低了代碼的可讀性和維護性,使得程序更難以理解和調試。
5)反射機制的應用場景有哪些?
反射機制在許多場景下都有廣泛的應用,包括但不限于:
- 框架開發: 框架通常需要處理各種類型的對象,并且提供通用的接口供用戶使用,反射機制可以使框架更加靈活和通用。
- 工具開發: 許多工具在運行時需要加載和操作用戶提供的類,反射機制可以使工具更加靈活和可擴展。
- ORM(對象關系映射)框架: ORM 框架通常需要在運行時根據類的屬性和數據庫表的字段進行映射,反射機制可以幫助 ORM 框架實現自動映射。
- 序列化和反序列化: 反射機制可以幫助序列化和反序列化框架在運行時動態地獲取類的屬性信息,從而實現對象的序列化和反序列化。
6)Java 獲取反射的三種方法
在 Java 中獲取反射的三種主要方法包括:
-
通過對象的 getClass() 方法: 每個對象都有一個
getClass()
方法,可以返回表示對象所屬類的Class
對象。例如:MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
-
通過類的 .class 屬性: 每個類都有一個
.class
屬性,可以直接獲取表示該類的Class
對象。例如:Class<?> clazz = MyClass.class;
-
通過 Class 類的 forName() 方法:
Class
類提供了一個forName(String className)
方法,可以根據類的全限定名(包名加類名)來獲取Class
對象。例如:Class<?> clazz = Class.forName("com.example.MyClass");
這三種方法都可以用來獲取 Class
對象,然后通過 Class
對象可以獲取類的屬性、方法、構造函數等信息,實現反射的功能。
7)字符型常量和字符串常量的區別
- 字符型常量: 字符型常量是指用單引號括起來的單個字符,例如
'A'
、'B'
、'1'
等。 - 字符串常量: 字符串常量是指用雙引號括起來的一個或多個字符組成的序列,例如
"Hello"
、"World"
、"123"
等。
區別在于字符型常量是單個字符,而字符串常量可以包含多個字符組成字符串。
8)什么是字符串常量池?
字符串常量池是 Java 中的一種特殊的存儲區域,用于存儲字符串常量對象。在 Java 中,如果兩個字符串常量的值相同(即字符序列相同),則它們實際上指向字符串常量池中的同一個對象,而不是創建兩個獨立的對象。這樣可以節省內存空間,并提高字符串的比較效率。
9)String 是最基本的數據類型嗎
不是的。在 Java 中,String
是引用數據類型,而不是基本數據類型。基本數據類型包括 byte
、short
、int
、long
、float
、double
、char
和 boolean
,而 String
是由 char
類型組成的對象。
10)String有哪些特性
String
類具有以下特性:
- 不可變性(Immutable):
String
對象一旦被創建,其值就不能被修改。任何對String
對象的操作都會返回一個新的String
對象。 - 線程安全性: 由于不可變性,
String
對象是線程安全的,可以在多線程環境下安全地使用。 - 字符串常量池: Java 中的字符串常量池可以提高字符串的重用率和比較效率。
- 重載
+
運算符:String
類重載了+
運算符,可以用于字符串的連接操作。 - 實現了
Serializable
接口:String
類實現了Serializable
接口,可以被序列化和反序列化。 - 實現了
Comparable
接口:String
類實現了Comparable
接口,可以進行字符串的比較操作。
開源項目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端總計已經 700+ Star,1W+ 訪問!
?點贊?收藏?不迷路!?