Java基礎面試題整理-50題(附答案)

Java架構解析發表於2019-02-15

昨天有讀者問我有沒有java基礎面試題,現在分享出來給大家

篇幅限制,只貼出前五題答案

1、說說&和&&的區別

答:

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

&&還具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式,例如,對於if(str != null && !str.equals(“”))表示式,當str為null時,後面的表示式不會執行,所以不會出現 NullPointerException如果將&&改為&,則會丟擲NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長

&還可以用作位運算子,當&操作符兩邊的表示式不是boolean型別時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果為 0x01

2、 char型變數中能不能存貯一箇中文漢字?為什麼?

答:

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

3、 "=="和equals方法究竟有什麼區別

答:

(單獨把一個東西說清楚,然後再說清楚另一個,這樣,它們的區別自然就出來了,混在一起說,則很難說清楚)

==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==操作符。

如果一個變數指向的資料是物件型別的,那麼,這時候涉及了兩塊記憶體,物件本身佔用一塊記憶體(堆記憶體),變數也佔用一塊記憶體,例如Objet obj = new Object();變數obj是一個記憶體,new Object()是另一個記憶體,此時,變數obj所對應的記憶體中儲存的數值就是物件佔用的那塊記憶體的首地址。對於指向物件型別的變數,如果要比較兩個變數是否指向同一個物件,即要看這兩個變數所對應的記憶體中的數值是否相等,這時候就需要用==操作符進行比較。

equals方法是用於比較兩個獨立物件的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個物件是獨立的。例如,對於下面的程式碼:

String a=new String("foo"); String b=new String("foo");

兩條new語句建立了兩個物件,然後用a,b這兩個變數分別指向了其中一個物件,這是兩個不同的物件,它們的首地址是不同的,即a和b中儲存的數值是不相同的,所以,表示式a==b將返回false,而這兩個物件中的內容是相同的,所以,表示式a.equals(b)將返回true。

在實際開發中,我們經常要比較傳遞進行來的字串內容是否等,例如,String input = …;input.equals(“quit”),許多人稍不注意就使用==進行比較了,這是錯誤的,隨便從網上找幾個專案實戰的教學視訊看看,裡面就有大量這樣的錯誤。記住,字串的比較基本上都是使用equals方法。

如果一個類沒有自己定義equals方法,那麼它將繼承Object類的equals方法,Object類的equals方法的實現程式碼如下:

boolean equals(Object o){

return this==o;

}

這說明,如果一個類沒有自己定義equals方法,它預設的equals方法(從Object 類繼承的)就是使用==操作符,也是在比較兩個變數指向的物件是否是同一物件,這時候使用equals和使用==會得到同樣的結果,如果比較的是兩個獨立的物件則總返回false。如果你編寫的類希望能夠比較該類建立的兩個例項物件的內容是否相同,那麼你必須覆蓋equals方法,由你自己寫程式碼來決定在什麼情況即可認為兩個物件的內容是相同的。

4、 靜態變數和例項變數的區別

答:

在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加。

在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。

例如,對於下面的程式,無論建立多少個例項物件,永遠都只分配了一個staticVar變數,並且每建立一個例項物件,這個staticVar就會加1;但是,每建立一個例項物件,就會分配一個instanceVar,即可能分配多個instanceVar,並且每個instanceVar的值都只自加了1次。

public class VariantTest

{

public static int staticVar = 0;

public int instanceVar = 0;

public VariantTest()

{

staticVar++;

instanceVar++;

System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);

}

}

5、 是否可以從一個static方法內部發出對非static方法的呼叫

答:

不可以。因為非static方法是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,而static方法呼叫時不需要建立物件,可以直接呼叫。也就是說,當一個static方法被呼叫時,可能還沒有建立任何例項物件,如果從一個static方法中發出對非static方法的呼叫,那個非static方法是關聯到哪個物件上的呢?這個邏輯無法成立,所以,一個static方法內部發出對非static方法的呼叫。

6、 Integer與int的區別

6-50題答案請私信關注後轉發,私信架構即可獲取

7、 請說出作用域public,private,protected,以及不寫時的區別

8、 Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?

9、 如何實現執行緒間的通訊

10、 構造器Constructor是否可被override?

11、 abstract class和interface有什麼區別?

12、 String是最基本的資料型別嗎?

13、 String s = "Hello";s = s + " world!";這兩行程式碼執行後,原始的String物件中的內容到底變了沒有?

14、 是否可以繼承String類?

15、 String和StringBuffer的區別

16、 StringBuffer與StringBuilder的區別

17、 陣列有沒有length()這個方法? String有沒有length()這個方法?

18、 try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?

19、 final, finally, finalize的區別

20、 執行時異常與一般異常有何異同?

21、 JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?

22、 java****中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法

23、 sleep()和wait()有什麼區別?

24、 啟動一個執行緒是用run()還是start()?

25、 List和Map區別?

26、 List, Set, Map是否繼承自Collection介面?

27、 說出ArrayList,Vector, LinkedList的儲存效能和特性

28、 Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還是equals()? 它們有何區別?

29、 你所知道的集合類都有哪些?主要方法?

30、 java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類

31、 位元組流與字元流的區別

32、 什麼是java序列化,如何實現java序列化?或者請解釋Serializable介面的作用

33、 能不能自己寫個類,也叫java.lang.String?

34、 一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

35、 Jvm如何調優?

36、 Jvm如何載入類?如何分配空間。

37、 八個基本型別各佔多少位元組?

38、 HashMap、HashSet、HashTable的區別?

39、 Hashcode和equals

40、 方法過載和重寫的區別

41、 程式和執行緒的區別

42、 junit中before和beforeclass區別

43、 單例手寫

44、 觸發器的作用是什麼?

45、 Static****區域性變數與全域性變數的區別,編譯後對映檔案是否包含此類變數的地址?

46、 用JAVA實現一種排序。(要寫出具體的演算法實現,不要簡單的呼叫Arrays.sort方法)。

47、 Java中如何實現多繼承關係?

48、 怎麼進行陣列排序?

49、 當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?

50、 請用java程式碼(或虛擬碼)實現字串的反轉,如:輸入abcde,輸出edcba。

Java基礎面試題整理-50題(附答案)

面試題答案資料獲取方式

 加群即可獲取 群號:923116658 

點選連結加入群聊【Java架構解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb 、

還有Java工程化、高效能及分散式、高效能、高架構、zookeeper、效能調優、Spring、MyBatis、Netty原始碼分析和大資料等多個知識點高階進階乾貨的直播免費學習許可權及相關視訊資料

相關文章