1. 程式人生 > >100道Java面試題收集整理及參考答案

100道Java面試題收集整理及參考答案

java面試題

不積跬步無以至千裏,這裏會不斷收集和更新Java基礎相關的面試題,目前已收集100題。

1.什麽是B/S架構?什麽是C/S架構

  1. B/S(Browser/Server),瀏覽器/服務器程序

  2. C/S(Client/Server),客戶端/服務端,桌面應用程序

2.你所知道網絡協議有那些?

HTTP:超文本傳輸協議
FTP:文件傳輸協議
SMPT:簡單郵件協議
TELNET:遠程終端協議
POP3:郵件讀取協議

3.Java都有那些開發平臺?

JAVA SE:主要用在客戶端開發
JAVA EE:主要用在web應用程序開發
JAVA ME:主要用在嵌入式應用程序開發

4.什麽是JVM?java虛擬機包括什麽?

JVM:java虛擬機,運用硬件或軟件手段實現的虛擬的計算機,Java虛擬機包括:寄存器,堆棧,處理器

5.Java是否需要開發人員回收內存垃圾嗎?

大多情況下是不需要的。Java提供了一個系統級的線程來跟蹤內存分配,不再使用的內存區將會自動回收

6.什麽是JDK?什麽是JRE?

JDK:java development kit:java開發工具包,是開發人員所需要安裝的環境

JRE:java runtime environment:java運行環境,java程序運行所需要安裝的環境

7.什麽是數據結構?

計算機保存,組織數據的方式

8.Java的數據結構有那些?

線性表(ArrayList)
鏈表(LinkedList)
棧(Stack)
隊列(Queue)
圖(Map)
樹(Tree)

9.什麽是OOP?

面向對象編程

10.什麽是面向對象?

世間萬物都可以看成一個對象。每個物體包括動態的行為和靜態的屬性,這些就構成了一個對象。

11.類與對象的關系?

類是對象的抽象,對象是類的具體,類是對象的模板,對象是類的實例

12.Java中有幾種數據類型

×××:byte,short,int,long
浮點型:float,double
字符型:char
布爾型:boolean

13.什麽是隱式轉換,什麽是顯式轉換

顯示轉換就是類型強轉,把一個大類型的數據強制賦值給小類型的數據;隱式轉換就是大範圍的變量能夠接受小範圍的數據;隱式轉換和顯式轉換其實就是自動類型轉換和強制類型轉換。

14.Char類型能不能轉成int類型?能不能轉化成string類型,能不能轉成double類型

Char在java中也是比較特殊的類型,它的int值從1開始,一共有2的16次方個數據;Char<int<long<float<double;Char類型可以隱式轉成int,double類型,但是不能隱式轉換成string;如果char類型轉成byte,short類型的時候,需要強轉。

15.什麽是拆裝箱?

拆箱:把包裝類型轉成基本數據類型
裝箱:把基本數據類型轉成包裝類型

16.Java中的包裝類都是那些?

byte:Byte
short:Short
int:Integer
long:Long
float:Float
double:Double
char:Character
boolean:Boolean

17.一個java類中包含那些內容?

屬性、方法、內部類、構造方法、代碼塊。

18.例如: if(a+1.0=4.0),這樣做好嗎?

不好,因為計算機在浮點型數據運算的時候,會有誤差,盡量在布爾表達式中不使用浮點型數據(if,while,switch中判斷條件不使用浮點型)

19.那針對浮點型數據運算出現的誤差的問題,你怎麽解決?

使用Bigdecimal類進行浮點型數據的運算

20.++i與i++的區別

++i:先賦值,後計算
i++:先計算,後賦值

21.程序的結構有那些?

順序結構
選擇結構
循環結構

22.數組實例化有幾種方式?

靜態實例化:創建數組的時候已經指定數組中的元素,

int[] a=new int[]{1,3,3}

動態實例化:實例化數組的時候,只指定了數組程度,數組中所有元素都是數組類型的默認值

23.Java中各種數據默認值

Byte,short,int,long默認是都是0Boolean默認值是falseChar類型的默認值是’’
Float與double類型的默認是0.0對象類型的默認值是null

24.Java常用包有那些?

Java.lang
Java.io
Java.sql
Java.util
Java.awt
Java.net
Java.math

25.Java最頂級的父類是哪個?

Object

26.Object類常用方法有那些?

Equals
Hashcode
toString
wait
notify
clone
getClass

27.java中有沒有指針?

有指針,但是隱藏了,開發人員無法直接操作指針,由jvm來操作指針

28.java中是值傳遞引用傳遞?

理論上說,java都是引用傳遞,對於基本數據類型,傳遞是值的副本,而不是值本身。對於對象類型,傳遞是對象的引用,當在一個方法操作操作參數的時候,其實操作的是引用所指向的對象。

29.假設把實例化的數組的變量當成方法參數,當方法執行的時候改變了數組內的元素,那麽在方法外,數組元素有發生改變嗎?

改變了,因為傳遞是對象的引用,操作的是引用所指向的對象

30.實例化數組後,能不能改變數組長度呢?

不能,數組一旦實例化,它的長度就是固定的

31.假設數組內有5個元素,如果對數組進行反序,該如何做?

創建一個新數組,從後到前循環遍歷每個元素,將取出的元素依次順序放入新數組中

32.形參與實參

形參:全稱為“形式參數”,是在定義方法名和方法體的時候使用的參數,用於接收調用該方法時傳入的實際值;實參:全稱為“實際參數”,是在調用方法時傳遞給該方法的實際值。

33.構造方法能不能顯式調用?

不能構造方法當成普通方法調用,只有在創建對象的時候它才會被系統調用

34.構造方法能不能重寫?能不能重載?

可以重寫,也可以重載

35.什麽是方法重載?

方法的重載就是在同一個類中允許同時存在一個以上的同名方法,只要它們的參數個數或者類型不同即可。在這種情況下,該方法就叫被重載了,這個過程稱為方法的重載(override)

36.內部類與靜態內部類的區別?

靜態內部類相對與外部類是獨立存在的,在靜態內部類中無法直接訪問外部類中變量、方法。如果要訪問的話,必須要new一個外部類的對象,使用new出來的對象來訪問。但是可以直接訪問靜態的變量、調用靜態的方法;

普通內部類作為外部類一個成員而存在,在普通內部類中可以直接訪問外部類屬性,調用外部類的方法。

如果外部類要訪問內部類的屬性或者調用內部類的方法,必須要創建一個內部類的對象,使用該對象訪問屬性或者調用方法。

如果其他的類要訪問普通內部類的屬性或者調用普通內部類的方法,必須要在外部類中創建一個普通內部類的對象作為一個屬性,外同類可以通過該屬性調用普通內部類的方法或者訪問普通內部類的屬性

如果其他的類要訪問靜態內部類的屬性或者調用靜態內部類的方法,直接創建一個靜態內部類對象即可。

37.Static關鍵字有什麽作用?

Static可以修飾內部類、方法、變量、代碼塊

Static修飾的類是靜態內部類

Static修飾的方法是靜態方法,表示該方法屬於當前類的,而不屬於某個對象的,靜態方法也不能被重寫,可以直接使用類名來調用。在static方法中不能使用this或者super關鍵字。

Static修飾變量是靜態變量或者叫類變量,靜態變量被所有實例所共享,不會依賴於對象。靜態變量在內存中只有一份拷貝,在JVM加載類的時候,只為靜態分配一次內存。

Static修飾的代碼塊叫靜態代碼塊,通常用來做程序優化的。靜態代碼塊中的代碼在整個類加載的時候只會執行一次。靜態代碼塊可以有多個,如果有多個,按照先後順序依次執行。

38.Final在java中的作用

Final可以修飾類,修飾方法,修飾變量。
修飾的類叫最終類。該類不能被繼承。
修飾的方法不能被重寫。
修飾的變量叫常量,常量必須初始化,一旦初始化後,常量的值不能發生改變。

39.Java中操作字符串使用哪個類?

String,StringBuffer,StringBuilder

40.StringBuffer,Stringbuilder有什麽區別?

StringBuffer與StringBuilder都繼承了AbstractStringBulder類,而AbtractStringBuilder又實現了CharSequence接口,兩個類都是用來進行字符串操作的。

在做字符串拼接修改刪除替換時,效率比string更高。

StringBuffer是線程安全的,Stringbuilder是非線程安全的。所以Stringbuilder比stringbuffer效率更高,StringBuffer的方法大多都加了synchronized關鍵字

41.String str=”aaa”,與String str=new String(“aaa”)一樣嗎?

不一樣的。因為內存分配的方式不一樣。
第一種,創建的”aaa”是常量,jvm都將其分配在常量池中。
第二種創建的是一個對象,jvm將其值分配在堆內存中。

42.String str=”aa”,String s=”bb”,String aa=aa+s;一種創建了幾個對象?

一共有兩個引用,三個對象。因為”aa”與”bb”都是常量,常量的值不能改變,當執行字符串拼接時候,會創建一個新的常量是” aabbb”,有將其存到常量池中。

43.將下java中的math類有那些常用方法?

Pow():冪運算
Sqrt():平方根
Round():四舍五入
Abs():求絕對值
Random():生成一個0-1的隨機數,包括0不包括1

44.String類的常用方法有那些?

charAt:返回指定索引處的字符
indexOf():返回指定字符的索引
replace():字符串替換
trim():去除字符串兩端空白
split():分割字符串,返回一個分割後的字符串數組
getBytes():返回字符串的byte類型數組
length():返回字符串長度
toLowerCase():將字符串轉成小寫字母
toUpperCase():將字符串轉成大寫字符
substring():截取字符串
format():格式化字符串
equals():字符串比較

45.判斷兩個對象是否相同,能使用equlas比較嗎?

不能。Equlas大多用來做字符串比較,要判斷基本數據類型或者對象類型,需要使用==

46.==與equlas有什麽區別?

==可以判斷基本數據類型值是否相等,也可以判斷兩個對象指向的內存地址是否相同,也就是說判斷兩個對象是否是同一個對象,Equlas通常用來做字符串比較。

47.如何將字符串反轉?

Stringbuilder或者stringbuffer的reverse方法

48.面向對象的語言有那些特征?

封裝、繼承、多態

49.Java中的繼承是單繼承還是多繼承

Java中既有單繼承,又有多繼承。對於java類來說只能有一個父類,對於接口來說可以同時繼承多個接口

50.什麽是重寫?什麽是重載?

重載和重寫都是java多態的表現。

重載叫override,在同一個類中多態的表現。當一個類中出現了多個相同名稱的方法,但參數個數和參數類型不同,方法重載與返回值無關

重寫叫overwrite,是字符類中多態的表現。當子類出現與父類相同的方法,那麽這就是方法重寫。方法重寫時,子類的返回值必須與父類的一致。如果父類方法拋出一個異常,子類重寫的方法拋出的異常類型不能小於父類拋出的異常類型。

51.構造方法能不能重載?能不能重寫?

可以重載,必須重寫

52.如果父類只有有參構造方法,那麽子類必須要重寫父類的構造方法嗎?

必須重寫

53.創建一個子類對象的時候,那麽父類的構造方法會執行嗎?

會執行。當創建一個子類對象,調用子類構造方法的時候,子類構造方法會默認調用父類的構造方法。

54.什麽是父類引用指向子類對象?

是java多態一種特殊的表現形式。創建父類引用,讓該引用指向一個子類的對象

55.當父類引用指向子類對象的時候,子類重寫了父類方法和屬性,那麽當訪問屬性的時候,訪問是誰的屬性?調用方法時,調用的是誰的方法?

子類重寫了父類方法和屬性,訪問的是父類的屬性,調用的是子類的方法

56.Super與this表示什麽?

Super表示當前類的父類對象
This表示當前類的對象

57.抽象的關鍵字是什麽?

Abstract

58.抽象類必須要有抽象方法嗎

不是必須。抽象類可以沒有抽象方法。

59.如果一個類中有抽象方法,那麽這個一定是抽象類?

包含抽象方法的類一定是抽象類

60.抽象類可以使用final修飾嗎?

不可以。定義抽象類就是讓其他繼承的,而final修飾類表示該類不能被繼承,與抽象類的理念違背了

61.普通類與抽象類有什麽區別?

普通類不能包含抽象方法,抽象類可以包含抽象方法
抽象類不能直接實例化,普通類可以直接實例化

62.什麽是接口?

接口就是某個事物對外提供的一些功能的聲明,是一種特殊的java類

63.JAVA為什麽需要接口?

接口彌補了java單繼承的缺點

64.接口有什麽特點?

接口中聲明全是public static final修飾的常量
接口中所有方法都是抽象方法
接口是沒有構造方法的
接口也不能直接實例化
接口可以多繼承

65.接口與抽象類有什麽區別?

抽象類有構造方法,接口沒有構造方法
抽象類只能單繼承,接口可以多繼承
抽象類可以有普通方法,接口中的所有方法都是抽象方法
接口的屬性都是public static final修飾的,而抽象的不是

66.Java中異常分為哪兩種?

編譯時異常
運行時異常

67.說幾個常見的編譯時異常類?

NullPointerException:空指針異常
ArrayIndexOutOfBoundsException:數組下標越界
NumberFormatException:數字轉換異常
IllegalArgumentException:參數不匹配異常
InstantiationException:對象初始化異常
ArithmeticException:算術異常

68.異常的處理機制有幾種?

異常捕捉:try…catch…finally,異常拋出:throws。

69.如何自定義一個異常

繼承一個異常類,通常是RumtimeException或者Exception

70.在異常捕捉時,如果發生異常,那麽try.catch.finally塊外的return語句會執行嗎?

會執行,如果有finally,在finally之後被執行,如果沒有finally,在catch之後被執行

71.Try.catch.finally是必須要存在的嗎?

Try塊必須存在,catch和finally可以不存在,但不能同時不存在

72.Thow與thorws區別

Throw寫在代碼塊內,throw後面跟的是一個具體的異常實例
Throw寫在方法前面後面,throws後面跟的是異常類,異常類可以出現多個

73.Error與Exception區別?

Error和Exception都是java錯誤處理機制的一部分,都繼承了Throwable類。

Exception表示的異常,異常可以通過程序來捕捉,或者優化程序來避免。

Error表示的是系統錯誤,不能通過程序來進行錯誤處理。

74.使用Log4j對程序有影響嗎?

有,log4j是用來日誌記錄的,記錄一些關鍵敏感的信息,通常會將日誌記錄到本地文件或者數據庫中。記錄在本地文件中,會有頻繁的io操作,會耗費一些系統資源。記錄在數據庫中,會頻繁地操作數據庫表,對系統性能也有一定的影響。但是為了程序安全以及數據的恢復或者bug的跟蹤,這點資源消耗是可以承受的。

75.Log4j日誌有幾個級別?

由低到高:debug、info、wran、error

76.除了使用new創建對象之外,還可以用什麽方法創建對象?

Java反射

77.Java反射創建對象效率高還是通過new創建對象的效率高?

通過new創建對象的效率比較高。通過反射時,先找查找類資源,使用類加載器創建,過程比較繁瑣,所以效率較低

78.Java中集合框架的有幾個?

Coillection、Map。

79.Collection接口下有那些集合框架?

List:線性表、Set:無序集合。

80.List接口有什麽特點?

順序存儲、可以有重復值。

81.Set接口有什麽特點

無須存儲、不能有重復值。

82.ArrayList與LinkedList有什麽區別?

ArrayList與LinkedList都實現了List接口。
ArrayList是線性表,底層是使用數組實現的,它在尾端插入和訪問數據時效率較高, 
Linked是雙向鏈表,他在中間插入或者頭部插入時效率較高,在訪問數據時效率較低

83.Array與ArrayList有什麽不一樣?

Array與ArrayList都是用來存儲數據的集合。ArrayList底層是使用數組實現的,但是arrayList對數組進行了封裝和功能擴展,擁有許多原生數組沒有的一些功能。我們可以理解成ArrayList是Array的一個升級版。

84.Map有什麽特點

以鍵值對存儲數據
元素存儲循序是無須的
不允許出現重復鍵

85.JDBC操作的步驟

加載數據庫驅動類
打開數據庫連接
執行sql語句
處理返回結果
關閉資源

86.在使用jdbc的時候,如何防止出現sql註入的問題。

使用PreparedStatement類,而不是使用Statement類

87.怎麽在JDBC內調用一個存儲過程

使用CallableStatement

88.是否了解連接池,使用連接池有什麽好處?

數據庫連接是非常消耗資源的,影響到程序的性能指標。連接池是用來分配、管理、釋放數據庫連接的,可以使應用程序重復使用同一個數據庫連接,而不是每次都創建一個新的數據庫連接。通過釋放空閑時間較長的數據庫連接避免數據庫因為創建太多的連接而造成的連接遺漏問題,提高了程序性能。

89.你所了解的數據源技術有那些?使用數據源有什麽好處?

Dbcp,c3p0等,用的最多還是c3p0,因為c3p0比dbcp更加穩定,安全;通過配置文件的形式來維護數據庫信息,而不是通過硬編碼。當連接的數據庫信息發生改變時,不需要再更改程序代碼就實現了數據庫信息的更新。

90.Java的io流分為哪兩種?

按功能來分

輸入流(input),輸出流(output)

按類型來分

字節流,字符流

91.常用io類有那些?

File
FileInputSteam,FileOutputStream
BufferInputStream,BufferedOutputSream
PrintWrite
FileReader,FileWriter
BufferReader,BufferedWriter
ObjectInputStream,ObjectOutputSream

92.字節流與字符流的區別

以字節為單位輸入輸出數據,字節流按照8位傳輸
以字符為單位輸入輸出數據,字符流按照16位傳輸

93.final、finalize()、finally

性質不同

  1. final為關鍵字;

  2. finalize()為方法;

  3. finally為區塊標誌,用於try語句中;

作用

  1. final為用於標識常量的關鍵字,final標識的關鍵字存儲在常量池中(在這裏final常量的具體用法將在下面進行介紹);

  2. finalize()方法在Object中進行了定義,用於在對象“消失”時,由JVM進行調用用於對對象進行垃圾回收,類似於C++中的析構函數;用戶自定義時,用於釋放對象占用的資源(比如進行I/0操作);

  3. finally{}用於標識代碼塊,與try{}進行配合,不論try中的代碼執行完或沒有執行完(這裏指有異常),該代碼塊之中的程序必定會進行;

94.抽象類和接口的區別?

抽象類:

  1. 抽象方法,只有行為的概念,沒有具體的行為實現。使用abstract關鍵字修飾,沒有方法體。子類必須重寫這些抽象方法。

  2. 包含抽象方法的類,一定是抽象類。

  3. 抽象類只能被繼承,一個類只能繼承一個抽象類。

接口:

  1. 全部的方法都是抽象方法,屬型都是常量

  2. 不能實例化,可以定義變量。

  3. 接口變量可以引用具體實現類的實例

  4. 接口只能被實現,一個具體類實現接口,必須實現全部的抽象方法

  5. 接口之間可以多實現

  6. 一個具體類可以實現多個接口,實現多繼承現象

95.線程同步的方法

  1. wait():讓線程等待。將線程存儲到一個線程池中。

  2. notify():喚醒被等待的線程。通常都喚醒線程池中的第一個。讓被喚醒的線程處於臨時阻塞狀態。

  3. notifyAll(): 喚醒所有的等待線程。將線程池中的所有線程都喚醒。

96.線程與進程的區別

進程是系統進行資源分配和調度的一個獨立單位,線程是CPU調度和分派的基本單位

進程和線程的關系:

  1. 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。

  2. 資源分配給進程,同一進程的所有線程共享該進程的所有資源。

  3. 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

  4. 線程是指進程內的一個執行單元,也是進程內的可調度實體。

線程與進程的區別:

  1. 調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位。

  2. 並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可以並發執行。

  3. 擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源。

  4. 系統開銷:在創建或撤銷進程的時候,由於系統都要為之分配和回收資源,導致系統的明顯大於創建或撤銷線程時的開銷。但進程有獨立的地址空間,進程崩潰後,在保護模式下不會對其他的進程產生影響,而線程只是一個進程中的不同的執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但是在進程切換時,耗費的資源較大,效率要差些。

97.&和&&的區別

&是位運算符。&&是布爾邏輯運算符,在進行邏輯判斷時用&處理的前面為false後面的內容仍需處理,用&&處理的前面為false不再處理後面的內容。

98.重載與重寫

  1. Overload為重載,Override為重寫方法的重寫和重載是Java多態性的不同表現。重寫是父類與子類之間多態性的一種表現,重載是一個類中多態性的一種表現。

  2. 如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Override)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。

  3. 如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overload)。
    重載的方法是可以改變返回值的類型。

99.如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的內存?

不會,在下一個垃圾回收周期中,這個對象將是可被回收的。

100.串行(serial)收集器和吞吐量(throughput)收集器的區別是什麽?

吞吐量收集器使用並行版本的新生代垃圾收集器,它用於中等規模和大規模數據的應用程序。而串行收集器對大多數的小應用(在現代處理器上需要大概100M左右的內存)就足夠了。


我有一個微信公眾號,經常會分享一些Java技術相關的幹貨;如果你喜歡我的分享,可以用微信搜索“Java團長”或者“javatuanzhang”關註。

100道Java面試題收集整理及參考答案