天天看點

2021年最新Java面試題

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

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

2021年最新Java面試題

為初學者而著!

B站的​​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(初始化語句;判斷條件語句;控制條件語句) {

循環體語句;

}

執行流程:

執行初始化語句

執行判斷條件語句,看其結果是true還是false,如果是false,循環結束;如果是true,繼續執行。

執行循環體語句

執行控制條件語句

回到b繼續

while循環語句格式

while(判斷條件語句) {

執行判斷條件語句,看其結果是true還是false 如果是false,循環結束。

如果是true,繼續執行。

回到a繼續

do…while循環語句格式

do {

}while((判斷條件語句);

三種循環語句的差別

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的互相轉換?

通過String類的構造方法

通過StringBuffer類中的toString()方法

通過StringBuffer類中的substring()方法 (注:不常用) String 轉換到 StringBuffer的方式:

通過StringBuffer類的構造方法

通過StringBuffer類的append()、insert()方法

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

String – Integer – int通過Integer類的intValue()方法

通過Integer類的parseInt(String s)方法

Int 轉換到 String的方式:

Int – Integer – String Integer的toSting()

通過String類的valueOf()方法

通過Integer類的toSting(int i)方法

通過與字元串""相連接配接

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

通過包裝類的構造方法

通過包裝類的靜态方法valueOf()

包裝類 轉換到 基本資料類型的方式:

通過包裝類的方法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 種:

而 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基礎的可以複習一下>>>​​

2021年最新Java面試題

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

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