1. 程式人生 > 其它 >2021年最新Java面試題

2021年最新Java面試題

先給大家複習一下基礎題!!!

Java基礎是java初學者的起點,是幫助你從小白入門到精通必學基礎課程!

為初學者而著!

Java300集>>>適合準備入行開發的零基礎員學習Java,基於最新JDK13、IDEA平臺講解的,視訊中穿插多個實戰專案。每一個知識點都講解的通俗易懂,由淺入深。不僅適用於零基礎的初學者,有經驗的程式設計師也可做鞏固學習。

配套學習:Java初學者入門教程>>>

一、Java 基本概念

1、Java源程式的副檔名是什麼?

.java

2、什麼是識別符號?

在java語言中能夠我們自己起名的都叫識別符號

3、識別符號有哪些特點?

識別符號是大小寫字母、數字字元、$和_組成,不能以數字開頭,也不能是java關鍵字,並且區分大小寫

4、請說明環境變數Path 與 classpath 區別

path是系統用來指定可指定檔案的完整路徑。Path是用來搜尋所執行的可執行檔案路徑的,如果執行的可執行檔案不在當前目錄下,那就會依次搜尋path中設定的路徑。

classpath是指定你在程式中所使用的類(.class)檔案所在的位置。

5、java程式經編譯後產生的位元組碼副檔名是什麼?

位元組碼副檔名是 .class

6、請說出常用的DOS命令並解釋?

  • d: 回車
    碟符切換
  • dir (directory)
    列出當前目錄下的檔案以及資料夾
  • cd (change directory)
    改變指定目錄(進入指定目錄)
  • cd..
    退回到上一層目錄
  • cd \
    退回到跟目錄
  • md (make directory)
    建立目錄
  • rd (remove directory)
    刪除目錄
  • del (delete)
    刪除檔案,刪除一堆字尾名一樣的檔案*.txt
  • cls (clear screen)
    清屏
  • exit
    退出dos命令列

7、請解釋Java語言的跨平臺特性?

Java語言是跨平臺執行的,其實就是不同的作業系統,使用不同的JVM對映規則,讓其與作業系統無關,完成了跨平臺性。JVM對上層的Java原始檔是不關心的,它關注的只是由原始檔生成的類檔案(class file)。

8、請說明JDK、JRE、JVM的區別?

  • JDK
    Java Development Kit(Java開發工具包)
    。JDK是整個JAVA的核心,包括了Java執行環境(Java Runtime Environment),一堆Java工具(javac/java/javap等)
  • JRE
    Java Runtime Environment(java執行時環境)。也就是我們說的JAVA平臺。所有的Java程式都要在JRE下才能執行。包括JVM和JAVA核心類庫和支援檔案。與JDK相比,它不包含開發工具(編譯器、偵錯程式和其他工具)。
  • JVM
    Java Virtual Mechinal(JAVA虛擬機器)。JVM是JRE的一部分,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。

二、Java 基礎

1、註釋的分類及作用?

  • 單行註釋
    註釋單行程式碼或為單行程式碼新增描述的時候使用
  • 多行註釋
    註釋多行程式碼或為程式碼新增多行描述的時候使用
  • 文件註釋
    生產java幫助文件的時候使用,開發中常用來描述類、描述方法

2、請說出Java中資料型別的分類?基本資料型別都有哪些?

  • 基本資料型別
    • byte
    • short
    • int
    • long
    • float
    • double
    • char
    • boolean
  • 引用資料型別
    • 陣列
    • 介面

3、Java中資料的型別轉換有幾種?分別是什麼?

  • 強制型別轉換
    容量大的型別向容量小的型別轉換時使用
  • 隱式型別轉換
    容器小的型別向容量大的型別轉換時使用

4、Java語言中的字元char可以儲存一箇中文漢字嗎?為什麼呢?

char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了漢字,所以,char型變數中可以儲存漢字。不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變數中就不能儲存這個特殊漢字。
補充說明:unicode編碼佔用兩個位元組,所以,char型別的變數也是佔用兩個位元組。

5、請說明 && 和 & 的區別?

&和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。

&&還具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式

&還可以用作位運算子,當&操作符兩邊的表示式不是boolean型別時,&表示按位與操作。

6、請說明 == 與 = 的區別?

  • ==
    比較運算子,用來比較操作符兩邊的變數的值是否相等。
  • =
    賦值運算子,把操作符右邊的值,賦值給左邊的變數

7、三元運算子的基本格式是什麼?

三元運算子的格式是: 條件表示式 ? 表示式1 : 表示式2

8、三元運算子的執行流程是什麼?

三元運算子的執行流程: 首先計算條件表示式的值看其返回結果是true還是false,如果是true就執行表示式1,如果是false就執行表示式2

9、使用鍵盤錄入資料的三個步驟是什麼?

  • 第一步導包
    格式: import java.util.Scanner ;位置: 在class上邊
  • 第二步建立Scanner物件
    格式: Scanner sc = new Scanner(System.in) ;
  • 第三步獲取鍵盤錄入資料
    格式: int x = sc.nextInt() ;

10、請說明for、while、do…while三種迴圈的格式以及執行流程,以及它們的區別。

  • for迴圈語句格式
    for(初始化語句;判斷條件語句;控制條件語句) {
    迴圈體語句;
    }
    • 執行流程:
      1. 執行初始化語句
      2. 執行判斷條件語句,看其結果是true還是false,如果是false,迴圈結束;如果是true,繼續執行。
      3. 執行迴圈體語句
      4. 執行控制條件語句
      5. 回到b繼續
  • while迴圈語句格式
    while(判斷條件語句) {
    迴圈體語句;
    }
    • 執行流程:
      1. 執行判斷條件語句,看其結果是true還是false
        如果是false,迴圈結束。
        如果是true,繼續執行。
      2. 執行迴圈體語句
      3. 回到a繼續
  • do…while迴圈語句格式
    do {
    迴圈體語句;
    }while((判斷條件語句);
    • 執行流程:
      1. 執行迴圈體語句
      2. 執行判斷條件語句,看其結果是true還是false,如果是false,迴圈結束;如果是true,繼續執行。
      3. 回到a繼續
  • 三種迴圈語句的區別
    • do…while迴圈至少會執行一次迴圈體
    • for迴圈和while迴圈只有在條件成立的時候才會去執行迴圈體

注意:寫程式優先考慮for迴圈,再考慮while迴圈,最後考慮do…while迴圈

11、定義一個方法的格式是什麼,以及方法的注意事項?

  • 格式
    修飾符 返回值型別 方法名(引數型別 引數名1, 引數型別 引數名2 ….){
    方法體 ;
    return 返回值 ;
    }
  • 注意事項
    A. 方法不呼叫不執行
    B. 方法與方法是平級關係,不能巢狀定義
    C. 方法定義的時候引數之間用逗號隔開
    D. 方法呼叫的時候不用在傳遞資料型別
    E. 如果方法有明確的返回值,一定要有return帶回一個值

12、private 關鍵字在哪裡使用? 被 private 修飾的成員有什麼特點?

類中的成員需要私有的時候使用private關鍵字
特點:
是一個許可權修飾符。
可以修飾成員(成員變數和成員方法)
被private修飾的成員只在本類中才能訪問

13、為什麼要有 this 關鍵字?this 關鍵字的含義?

this用來解決成員變數與區域性變數重名問題
this關鍵字代表的是本類物件引用;誰呼叫我,this就代表誰.

14、final 關鍵字是什麼意思,可以修飾那些成員?被修飾的成員有哪些特點?

final最終的意思。

  • 可修飾

    • 成員變數
    • 成員方法
  • 特點

    • final修飾類,此類不能被繼承。
    • final修飾變數,變數就成了常量,只能被賦值一次
    • final修飾方法,方法不能被重寫

15、形式引數是基本型別要的是什麼?是類名、抽象類名、介面名時分別要的是什麼?

形式引數是基本型別要的是一個基本型別的變數或者具體的常量值

  • 類名時
    要的是一個該類的物件
  • 抽象類名時
    要的是一個繼承自該類的一個子類物件
  • 介面時
    要的是一個實現了該介面的子類物件

16、返回值型別是基本型別返回的是什麼?是類名、抽象類名、介面名分別返回的是什麼?

返回值是基本資料型別的時候返回的是一個具體的值

  • 類名時
    本質上返回的是一個該類對應的子類物件
  • 抽象類名時
    返回的應該是一個繼承自該類的子類物件
  • 介面名的時
    返回的是一個實現了該介面的子類物件

17、package它有什麼作用?

package,包的意思,其實就是資料夾,它可以對類進行分類管理

18、import的作用?

在不同包下的類之間相互訪問的時候,發現,每次使用不同包下的類的時候,都需要加包的全路徑。比較麻煩,這個時候,java就提供了( import )導包的功能。
使用import可以將包中的類匯入進來,以後使用類的時候,不需導包,直接使用,簡化了書寫

19、請解釋 ==與equals()方法的區別?

== 解讀

對於基本型別和引用型別 == 的作用效果是不同的,如下所示:

  • 基本型別:比較的是值是否相同;
  • 引用型別:比較的是引用是否相同;

程式碼示例:

String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true

程式碼解讀:因為 x 和 y 指向的是同一個引用,所以 == 也是 true,而 new String()方法則重寫開闢了記憶體空間,所以 == 結果為 false,而 equals 比較的一直是值,所以結果都為 true。

equals 解讀

equals 本質上就是 ==,只不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較。看下面的程式碼就明白了。

首先來看預設情況下 equals 比較一個有相同值的物件,程式碼如下:

class Cat { public Cat(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }}Cat c1 = new Cat("mbb");Cat c2 = new Cat("mbb");System.out.println(c1.equals(c2)); // false

輸出結果出乎我們的意料,竟然是 false?這是怎麼回事,看了 equals 原始碼就知道了,原始碼如下:

public boolean equals(Object obj) { return (this == obj);}

原來 equals 本質上就是 ==。

那問題來了,兩個相同值的 String 物件,為什麼返回的是 true?程式碼如下:

String s1 = new String("mbb");String s2 = new String("mbb");System.out.println(s1.equals(s2)); // true

同樣的,當我們進入 String 的 equals 方法,找到了答案,程式碼如下:

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) {  char v1[] = value;  char v2[] = anotherString.value;  int i = 0;  while (n-- != 0) {  if (v1[i] != v2[i])   return false;  i++;  }  return true; } } return false;}

原來是 String 重寫了 Object 的 equals 方法,把引用比較改成了值比較。

總結 :== 對於基本型別來說是值比較,對於引用型別來說是比較的是引用;而 equals 預設情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

20、請簡述泛型是什麼?有什麼用?在哪裡用?

  • 泛型是什麼?
    泛型是一種特殊的型別,它把指定型別的工作推遲到客戶端程式碼宣告並例項化類或方法的使用進行。也被稱為引數化型別,可以把型別當做引數一樣傳遞過來,在傳遞過來之前我不明確,但是在使用的時候就就明確了。
  • 泛型的好處
    • 提高了程式的安全性
    • 將執行期遇到的問題轉移到了編譯期
    • 省去了型別強轉的麻煩
  • 泛型的常見應用
    • 泛型類
    • 泛型方法
    • 泛型介面

21、如何編寫一個泛型方法,讓它能夠接受泛型引數並返回泛型型別?並舉例

泛型方法,指把泛型定義在方法上,使用泛型型別來替代原始型別

public static T[] sort(T[] t){ Arrays.sort(t); return t;}

22、請簡述Java中如何使用泛型編寫帶有引數的類?並舉例

泛型類,指把泛型定義在類上,使用泛型型別來替代原始型別

class GenericClass { private T t; public void setT(T t) { this.t = t; } public T getT() { return t; }}

23、請說說檔名稱過濾器FilenameFilter的作用?

FilenameFilter是檔名過濾器,用來過濾不符合規則的檔名,並返回合格的檔案。

24、請簡述遞迴是什麼?注意事項是什麼?

所謂遞迴,是指程式呼叫自身
注意,遞迴不會無休止地呼叫下去,它必然有一個出口,當滿足條件時程式也就結束了,不然的話,那就是死迴圈了。

25、兩個物件的 hashCode() 相同,則 equals() 也一定為 true,對嗎?

不對,兩個物件的 hashCode() 相同,equals() 不一定 true。

程式碼示例:

String str1 = "通話";String str2 = "重地";System. out. println(String. format("str1:%d | str2:%d", str1. hashCode(),str2. hashCode()));System. out. println(str1. equals(str2));

執行的結果:

str1:1179395 | str2:1179395false

程式碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因為在散列表中,hashCode() 相等即兩個鍵值對的雜湊值相等,然而雜湊值相等,並不一定能得出鍵值對相等。

26、Java 中的 Math. round(-1. 5) 等於多少?

等於 -1,因為在數軸上取值時,中間值(0.5)向右取整,所以正 0.5 是往上取整,負 0.5 是直接捨棄。

三、Java 變數

1、請寫出Java識別符號的命名規則


  • 全部小寫
  • 單層包
    小寫,舉例:itcast,com
  • 多層包
    小寫,並用 . 隔開,舉例:cn.itcast, com.baidu
  • 類或者介面:
    • 一個單詞
      首字母大寫,舉例:Student,Demo
    • 多個單詞
      每個單詞首字母大寫,舉例:HelloWorld,StudentName
  • 方法或者變數:
    • 一個單詞
      首字母小寫,舉例:name,main
    • 多個單詞
      從第二個單詞開始,每個單詞首字母大寫,舉例:studentAge,showStudentNames()
  • 常量
    全部大寫
    • 一個單詞
      大寫,舉例:PI
    • 多個單詞
      大寫,並用 _ 隔開,舉例:STUDENT_MAX_AGE

2、變數是什麼?

變數,在程式執行時,值可以被修改的量。

3、變數的定義格式是什麼?

資料型別 變數名 = 變數值

4、成員變數與區域性變數的區別?

  • 在類中的位置不同
    成員變數:在類中方法外
    區域性變數:在方法定義中或者方法宣告上

  • 在記憶體中的位置不同
    成員變數:在堆記憶體
    區域性變數:在棧記憶體

  • 生命週期不同
    成員變數:隨著物件的建立而存在,隨著物件的消失而消失
    區域性變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失

  • 初始化值不同
    成員變數:有預設初始化值
    區域性變數:沒有預設初始化值,必須定義,賦值,然後才能使用。

5、靜態變數與成員變數的區別?

  • 所屬不同
    靜態變數屬於類,所以也稱為為類變數
    成員變數屬於物件,所以也稱為例項變數(物件變數)

  • 記憶體中位置不同
    靜態變數儲存於方法區的靜態區
    成員變數儲存於堆記憶體

  • 記憶體出現時間不同
    靜態變數隨著類的載入而載入,隨著類的消失而消失
    成員變數隨著物件的建立而存在,隨著物件的消失而消失

  • 呼叫不同
    靜態變數可以通過類名呼叫,也可以通過物件呼叫
    成員變數只能通過物件名呼叫

四、Java String

1、String s = “a”+“b”+”c”; 建立了多少物件,分別是什麼?

  • 5個物件
    • a
    • b
    • c
    • ab
    • abc

因為字串的特點是一旦被建立就不能被改變,所有在使用常量進行相加的時候,都是在建立新的字串物件,最後在把字串"abc"這個常量值賦值給引用變數s

2、如何實現StringBuffer和String的相互轉換?

  1. 通過String類的構造方法
  2. 通過StringBuffer類中的toString()方法
  3. 通過StringBuffer類中的substring()方法 (注:不常用)
    String 轉換到 StringBuffer的方式:
  4. 通過StringBuffer類的構造方法
  5. 通過StringBuffer類的append()、insert()方法

3、如何實現String和int資料的相互轉換

  1. String – Integer – int通過Integer類的intValue()方法
  2. 通過Integer類的parseInt(String s)方法
    Int 轉換到 String的方式:
  3. Int – Integer – String Integer的toSting()
  4. 通過String類的valueOf()方法
  5. 通過Integer類的toSting(int i)方法
  6. 通過與字串""相連線

4、如何實現【基本資料型別】與【基本資料封裝類】之間的相互轉換

  1. 通過包裝類的構造方法
  2. 通過包裝類的靜態方法valueOf()
    包裝類 轉換到 基本資料型別的方式:
  3. 通過包裝類的方法xxxValue()

5、請說明String與StringBuffer二者之間的區別?

String類表示內容不可以改變的字串
StringBuffer類表示內容可以被修改的字串

6、請說明StringBuffer與StringBilder二者之間的區別?

  • StringBilder
    是執行緒不安全的,執行效率高

    如果一個字串變數是在方法裡面定義,這種情況只可能有一個執行緒訪問它,不存在不安全的因素了,則用StringBuilder。

  • StringBuffer
    是執行緒安全的,執行要低於StringBilder

    如果要在類裡面定義成員變數,並且這個類的例項物件會在多執行緒環境下使用,那麼最好用StringBuffer。

7、什麼是正則表示式?

正則表示式使用單個字串來描述、匹配一系列符合某個句法規則的字串。在很多文字編輯器裡,正則達表示通常被用來檢索、替換那些符合某個模式的文字。

8、如何實現Date與long相互轉換?

  • Date 轉 long
    通過Date類的getTime()方法
  • long 轉 Date
    通過Date類的構造方法

9、如何實現Date與String相互轉換?

  • Date 轉 String

    • Date類的toString()方法
    • DateFormat類的format()方法
  • String 轉 Date

    • Date類的構造方法

      已過時,被DateFormat類的parse(String s)方法取代

    • DateFormat類的parse()方法

10、String 屬於基礎的資料型別嗎?

String 不屬於基礎型別
基礎型別有 8 種:

  • byte
  • boolean
  • char
  • short
  • int
  • float
  • long
  • double

而 String 屬於物件

11、String str=“i” 與 String str=new String(“i”)一樣嗎?

不一樣,因為記憶體的分配方式不一樣。String str="i"的方式,Java 虛擬機器會將其分配到常量池中;而 String str=new String(“i”) 則會被分到堆記憶體中。

12、如何將字串反轉?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例程式碼:

// StringBuffer reverseStringBuffer stringBuffer = new StringBuffer();stringBuffer.append("abcdefg");System.out.println(stringBuffer.reverse()); // gfedcba// StringBuilder reverseStringBuilder stringBuilder = new StringBuilder();stringBuilder.append("abcdefg");System. out. println(stringBuilder.reverse()); // gfedcba

13、String 類的常用方法都有那些?

  • indexOf():返回指定字元的索引。
  • charAt():返回指定索引處的字元。
  • replace():字串替換。
  • trim():去除字串兩端空白。
  • split():分割字串,返回一個分割後的字串陣列。
  • getBytes():返回字串的 byte 型別陣列。
  • length():返回字串長度。
  • toLowerCase():將字串轉成小寫字母。
  • toUpperCase():將字串轉成大寫字元。
  • substring():擷取字串。
  • equals():字串比較。

大夥伴們需要鞏固Java基礎的可以複習一下>>>

小夥伴如果想要學習更多的知識,學習材料可以,工眾號:程式設計領域

Java初學者學習教程:Java初學者入門教程>>>