Java面試基本問題
Q1,解釋JDK,JRE和JVM?
| JDK | JRE | JVM |
|---|---|---|
| Java開發工具包, | Java運行時環境, | Java虛擬機, |
| 它是編譯,記錄和打包Java程式所必需的工具, | JRE是指可以在其中執行Java位元組碼的運行時環境, | 它是一臺抽象機,該規范提供了可以在其中執行Java位元組碼的運行時環境, |
| 它包含JRE +開發工具, | 它是實際存在的JVM的實作, | JVM遵循三種表示法:規范,實作和 運行時實體, |
Q2,在Java中解釋public static void main(String args []),
Java中的main()是任何Java程式的入口點,它總是寫為public static void main(String [] args),
- public:public是訪問修飾符,用于指定誰可以訪問此方法,Public表示任何類都可以訪問此方法,
- static:它是java中的關鍵字,標識它是基于類的,main()在Java中被設為靜態,因此無需創建Class的實體即可對其進行訪問,如果main不是靜態的,那么編譯器將拋出錯誤,因為JVM在創建任何物件之前呼叫main(),并且只能通過該類直接呼叫靜態方法,
- void:這是方法的回傳型別,Void定義了不會回傳任何值的方法,
- main:這是JVM搜索的方法的名稱,它是僅具有特定簽名的應用程式的起點,這是主要執行發生的方法,
- String args []:這是傳遞給main方法的引數,
Q3,為什么Java是平臺獨立的?
Java之所以被稱為平臺無關的,是因為Java的位元組碼可以在任何系統上運行,而不管其底層作業系統什么,
Q4,為什么Java不是100%面向物件的?
Java不是100%面向物件的,因為它使用了不是物件的八種原始資料型別,例如布林值,位元組,字符,整數,浮點數,雙精度型,長型,短型,
Q5,Java中的包裝器類是什么?
包裝器類將Java原語轉換為參考型別(物件),每個原始資料型別都有一個專用于它的類,這些稱為包裝器類,因為它們將原始資料型別“包裝”到該類的物件中,請參考下圖,該圖顯示了不同的原始型別,包裝器類和建構式引數,
Q6,Java中的建構式是什么?
在Java中,建構式是指用于初始化物件的代碼塊,它必須與該類具有相同的名稱,而且,它沒有回傳型別,并且在創建物件時會自動呼叫它,
有兩種型別的建構式:
- 默認建構式:在Java中,默認建構式是不接受任何輸入的建構式,換句話說,默認建構式是無引數建構式,如果用戶沒有定義其他建構式,則默認情況下將創建該建構式,其主要目的是用默認值初始化實體變數,而且,它主要用于物件創建,
- 引數化建構式: Java中的引數化建構式是能夠使用提供的值初始化實體變數的建構式,換句話說,采用引數的建構式稱為引數化建構式,
Q7,Java中的單例類是什么?如何使單例類成為單例?
Singleton類是在一個給定的時間在一個JVM中只能創建一個實體的類,可以通過將建構式設為私有來使類成為單例,
Q8,Java中的陣列串列和向量有什么區別?
| 陣列串列 | 向量 |
|---|---|
| 陣列串列未同步, | 向量已同步, |
| 陣列串列不同步,因此速度很快, | 向量很慢,因為它是執行緒安全的, |
| 如果將元素插入“陣列串列”,則它將其陣列大小增加50%, | 向量默認為其陣列大小加倍, |
| 陣列串列未定義增量大小, | 向量定義增量大小, |
| 陣列串列只能使用Iterator遍歷陣列串列, | 向量可以使用Enumeration和Iterator進行遍歷, |
Q9,在Java中equals()和==有什么區別?
Equals()方法在Java的Object類中定義,用于檢查由業務邏輯定義的兩個物件的相等性,
Java中的“ ”或相等運算子是Java編程語言提供的二進制運算子,用于比較基元和物件,public boolean equals(Object o)是Object類提供的方法,默認實作使用運算子比較兩個物件,例如:方法可以像String類一樣被覆寫,equals()方法用于比較兩個物件的值,
Q10,Java中的堆和堆疊記憶體有何區別?
堆和堆疊記憶體之間的主要區別是:
| 特征 | 疊放 | 堆 |
|---|---|---|
| 記憶 | 堆疊存盤器僅由一個執行執行緒使用, | 堆記憶體由應用程式的所有部分使用, |
| 訪問 | 堆疊記憶體不能被其他執行緒訪問, | 堆中存盤的物件可全域訪問, |
| 記憶體管理 | 遵循LIFO方式釋放記憶體, | 記憶體管理基于與每個物件關聯的生成, |
| 生命周期 | 存在,直到執行緒執行結束, | 堆記憶體從應用程式執行的開始一直到結束, |
| 用法 | 堆疊記憶體僅包含堆空間中物件的區域原語和參考變數, | 每當創建物件時,它總是存盤在堆空間中, |
Q11, 什么是Java包?列出軟體包的各種優點,
Java中的程式包是捆綁在一起的相關類和介面的集合,通過使用軟體包,開發人員可以輕松地將代碼模塊化并優化其重用,而且,包中的代碼可以由其他類匯入并重新使用,下面我列出了它的一些優點:
-
軟體包有助于避免名稱沖突
-
它們提供了更容易的代碼訪問控制
-
包還可以包含隱藏類,這些隱藏類對外部類不可見,僅在包內使用
-
創建適當的層次結構,使查找相關類更加容易
Q12,為什么在Java中不使用指標?
Java不使用指標,因為它們不安全并且會增加程式的復雜性,由于Java以其簡單的代碼而聞名,因此添加指標的概念將是矛盾的,此外,由于JVM負責隱式記憶體分配,因此,為了避免用戶直接訪問記憶體,在Java中不建議使用指標,
Q13, Java中的JIT編譯器是什么?
JIT代表Java中的即時編譯器,它是一個程式,有助于將Java位元組碼轉換為直接發送到處理器的指令,默認情況下,JIT編譯器在Java中啟用,并且在呼叫Java方法時被激活,然后,JIT編譯器將被呼叫方法的位元組碼編譯為本地機器代碼,“及時”編譯以執行,編譯完該方法后,JVM會直接呼叫該方法的已編譯代碼,而不是對其進行解釋,這就是為什么它經常在運行時負責Java應用程式的性能優化的原因,
Q14,Java中的訪問修飾符是什么?
在Java中,訪問修飾符是特殊的關鍵字,用于限制對另一個類中的類,建構式,資料成員和方法的訪問,Java支持四種型別的訪問修飾符:
- 默認
- 私人的
- 受保護的
- 公開的
| 修飾符 | 默認 | 私人的 | 受保護的 | 公開的 |
|---|---|---|---|---|
| 同班 | 是 | 是 | 是 | 是 |
| 相同的包子類 | 是 | 沒有 | 是 | 是 |
| 相同包裝的非子類 | 是 | 沒有 | 是 | 是 |
| 不同的包子類 | 沒有 | 沒有 | 是 | 是 |
| 不同的包非子類 | 沒有 | 沒有 | 沒有 | 是 |
Q15,定義一個Java類,
Java中的類是包含所有資料的藍圖,一個類包含用于描述物件行為的欄位(變數)和方法,讓我們看一看一個類的語法,
class Abc {
member variables // class body methods
}
Q16,Java中的物件是什么,如何創建?
物件是具有狀態和行為的現實世界物體,一個物件具有三個特征:
- State
- Behavior
- Identity
使用'new'關鍵字創建物件,例如:
ClassName obj = new ClassName();
Q17,什么是面向物件編程?
面向物件的編程或通常稱為OOP的編程模型或方法是圍繞物件而不是邏輯和函式來組織程式,換句話說,OOP主要集中在需要操作的物件上,而不是邏輯上,這種方法對于大型和復雜代碼的程式是理想的,并且需要主動更新或維護,
Q18,Java中OOP的主要概念是什么?
面向物件編程或OOP是一種與以下概念相關的編程樣式:
-
繼承:繼承是一個類在其中獲取另一類的屬性的程序,
-
封裝: Java中的封裝是一種將資料和代碼打包為單個單元的機制,
-
抽象:抽象是向用戶隱藏實作細節并僅向用戶提供功能的方法,
-
多型性:多型性是變數,函式或物件采取多種形式的能力,
Q19,區域變數和實體變數有什么區別?
在Java中, 區域變數通常在方法,建構式或塊內使用 ,并且僅具有區域作用域,因此,該變數只能在塊的范圍內使用,擁有區域變數的最大好處是該類中的其他方法甚至都不知道該變數,
例
if(x > 100){
String test = "Edureka";
}
而Java中的 實體變數是系結到其物件本身的變數,這些變數在類內宣告,但在方法外宣告 ,該類的每個物件都將在使用它時創建它自己的變數副本,因此,對該變數所做的任何更改都不會反映在該類的任何其他實體中,而只會系結到該特定實體,
class Test{
public String EmpName;
public int empAge;
}
Q20,區分Java中的建構式和方法?
| 方法 | 建構式 |
|---|---|
| 1.用于表示物件的行為 | 1.用于初始化物件的狀態 |
| 2.必須具有回傳型別 | 2.沒有任何退貨型別 |
| 3.需要顯式呼叫 | 3.隱式呼叫 |
| 4.編譯器未提供默認方法 | 4.如果該類沒有默認建構式,則由編譯器提供 |
| 5.方法名稱可以與類名稱相同或不相同 | 5.建構式名稱必須始終與類名稱相同 |
Q21,Java中的final關鍵字是什么?
final是Java中的一個特殊關鍵字,用作非訪問修飾符,最終變數可以在不同的背景關系中使用,例如:
- 最終變數
當final關鍵字與變數一起使用時,其值一旦分配就無法更改,如果沒有值分配給最終變數,則僅使用類建構式可以將值分配給它,
-
最終方法
當方法宣告為final時,繼承類不能覆寫該方法,
-
最終類
在Java中將一個類宣告為final時,任何子類類都不能對其進行擴展,但可以擴展其他類,
Q22,break和continue陳述句有什么區別?
| 打破 | 繼續 |
|---|---|
| 1.可以在switch和loop(for,while,do While)陳述句中使用 | 1.只能與回圈陳述句一起使用 |
| 2.它會使switch或loop陳述句在執行時終止 | 2.它不會終止回圈,但會導致回圈跳至下一個迭代 |
| 3.終止最里面的封倍訓路或立即切換 | 3.在嵌套有開關的回圈內繼續執行將導致執行下一個回圈迭代 |
中斷示例:
for (int i = 0;i < 5;i++){
if (i == 3){
break;
}
System.out.println(i);
}
示例繼續:
for(int i = 0;i < 5;i++){
if(i == 2){
continue;
}
System.out.println(i);
}
Q23,什么是Java中的無限回圈?舉例說明,
無限回圈是Java中的一個指令序列,當不滿足功能退出要求時,它會無限回圈,這種型別的回圈可能是編程錯誤的結果,也可能是基于應用程式行為的故意行為,一旦應用程式退出,無限回圈將自動終止,
例如:
public class InfiniteForLoopDemo{
public static void main(String[] arg) {
for(;;)
System.out.println("Welcome to Edureka!");
// To terminate this program press ctrl + c in the console.
}
}
Q24,Java中的this()和super()有什么區別?
在Java中,super()和this()都是用于呼叫建構式的特殊關鍵字,
| this() | super() |
|---|---|
| 1. this()代表一個類的當前實體 | 1. super()表示父/基類的當前實體 |
| 2.用于呼叫同一類的默認建構式 | 2.用于呼叫父/基類的默認建構式 |
| 3.用于訪問當前類的方法 | 3.用于訪問基類的方法 |
| 4.用于指向當前的類實體 | 4.用于指向超類實體 |
| 5.必須是塊的第一行 | 5.必須是塊的第一行 |
Q25,什么是Java字串池?
Java字串池是指存盤在堆記憶體中的字串的集合,在這種情況下,無論何時創建新物件,字串池都會首先檢查該物件是否已存在于池中,如果存在,則將相同的參考回傳到變數,否則將在字串池中創建新物件,并將回傳相應的參考,

Q26,區分Java中的靜態方法和非靜態方法,
| 靜態方法 | 非靜態方法 |
|---|---|
| 1. 方法名稱之前必須使用static關鍵字 | 1.無需在方法名稱前使用s tatic關鍵字 |
| 2.使用類(className.methodName)進行呼叫 | 2.可以像任何常規方法一樣呼叫 |
| 3.他們不能訪問任何非靜態實體變數或方法 | 3.它可以訪問任何靜態方法和任何靜態變數,而無需創建類的實體 |
Q27,什么是Java中的建構式鏈接?
在Java中,建構式鏈接是相對于當前物件從另一個建構式呼叫一個建構式的程序,構造器鏈接只有通過繼承才能實作,在傳統中,子類構造器負責首先呼叫超類的構造器,建構式鏈中可以有任意多個類,構造器鏈接可以通過兩種方式實作:
- 在同一類中使用this()
- 從基類使用super()
Q28,String,StringBuilder和StringBuffer之間的區別,
| 因子 | 串 | StringBuilder | 字串緩沖區 |
|---|---|---|---|
| 儲藏區域 | 常量字串池 | 堆面積 | 堆面積 |
| 變異性 | 一成不變的 | 可變的 | 可變的 |
| 執行緒安全 | 是 | 沒有 | 是 |
| 性能 | 快速 | 更高效 | 效率較低 |
Q29,Java中的類加載器是什么?
該 Java類加載器是JVM(Java虛擬機)是負責加載類檔案的一個子集,每當執行Java程式時,類加載器就會首先加載它,Java提供了三個內置的類加載器:
- 引導類加載器
- 擴展ClassLoader
- 系統/應用程式類加載器
Q30,為什么Java字串本質上是不可變的?
在Java中,字串物件本質上是不可變的,這僅意味著一旦創建了String物件,就無法修改其狀態,每當您嘗試更新該物件的值而不是更新該特定物件的值時,Java都會創建一個新的字串物件,Java String物件是不可變的,因為通常將String物件快取在String池中,由于字串文字通常在多個客戶端之間共享,因此來自一個客戶端的操作可能會影響其余客戶端,它增強了應用程式的安全性,快取,同步和性能,
Q31,陣列和陣列串列有什么區別?
| 陣列 | 陣列串列 |
|---|---|
| 不能包含其他資料型別的值 | 可以包含不同資料型別的值, |
| 尺寸必須在申報時定義 | 大小可以動態更改 |
| 需要指定索引才能添加資料 | 無需指定索引 |
| 陣列未引數化型別 | 陣列串列是型別 |
| 陣列可以包含原始資料型別以及物件 | 陣列串列只能包含物件,不允許使用原始資料型別 |
Q32,Java中的Map是什么?
在Java中,Map是Util程式包的介面,它將唯一鍵映射到值,Map介面不是主要Collection介面的子集,因此,其行為與其他Collection型別幾乎沒有什么不同,以下是Map界面的一些特征:
- 地圖不包含重復的鍵,
- 每個鍵最多可以映射一個值,
Q33,Java中的集合類是什么?列出其方法和介面,
在Java中,集合是一個框架,用作存盤和操作一組物件的體系結構,使用集合可以執行各種任務,例如搜索,排序,插入,操作,洗掉等,Java集合框架包括以下內容:
- 介面
- 班級
- 方法
下圖顯示了Java集合的完整層次結構,

如果您面臨這些Java面試問題的任何挑戰,請在下面的部分中評論您的問題,
歡迎關注 Java架構師社區公眾號.
本文轉載自Java架構師必看 ,更多內容點擊查看!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165338.html
標籤:Java
上一篇:IO那些事
