1. 程式人生 > >2018java基礎面試題

2018java基礎面試題

1、&和&&的區別

答:?&是位運算子,表示按位與運算,&&是邏輯運算子,表示邏輯與(and)

2、Collection 和 Collections的區別

答:?Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作

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

答:?陣列沒有length()這個方法,有length的屬性。String有有length()這個方法

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

答:?方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded的方法是可以改變返回值的型別

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

答:?Set裡的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等 equals()和==方法決定引用值是否指向同一物件equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值

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

答:?會執行,在return前執行

7、int 和 Integer 有什麼區別

答:?Java 提供兩種不同的型別:引用型別和原始型別(或內建型別)。Int是java的原始資料型別,Integer是java為int提供的封裝類。Java為每個原始型別提供了封裝類。原始型別封裝類,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用型別和原始型別的行為完全不同,並且它們具有不同的語義。引用型別和原始型別具有不同的特徵和用法,它們包括:大小和速度問題,這種型別以哪種型別的資料結構儲存,當引用型別和原始型別用作某個類的例項資料時所指定的預設值。物件引用例項變數的預設值為 null,而原始型別例項變數的預設值與它們的型別有關

8封裝,繼承,多型和抽象。
封裝給物件提供了隱藏內部特性和行為的能力。物件提供一些能被其他物件訪問的方法來改變它內部的資料。
多型是程式語言給不同的底層資料型別做相同的介面展示的一種能力。一個多型型別上的操作可以應用到其他型別的值上面。

繼承給物件提供了從基類獲取欄位和方法的能力

抽象是把想法從具體的例項中分離出來的步驟
9.什麼是Java虛擬機器?為什麼Java被稱作是“平臺無關的程式語言”?

Java虛擬機器是一個可以執行Java位元組碼的虛擬機器程序。Java原始檔被編譯成能被Java虛擬機器執行的位元組碼檔案。

Java被設計成允許應用程式可以執行在任意的平臺,而不需要程式設計師為每一個平臺單獨重寫或者是重新編譯。Java虛擬機器讓這個變為可能,因為它知道底層硬體平臺的指令長度和其他特性。

10.JDK和JRE的區別是什麼?

Java執行時環境(JRE)是將要執行Java程式的Java虛擬機器。它同時也包含了執行applet需要的瀏覽器外掛。Java開發工具包(JDK)是完整的Java軟體開發包,包含了JRE,編譯器和其他的工具(比如:JavaDoc,Java偵錯程式),可以讓開發者開發、編譯、執行Java應用程式。

自動裝箱

自動裝箱是Java編譯器在基本資料型別和對應的物件包裝型別之間做的一個轉化。比如:把int轉化成Integer,double轉化成double,等等。反之就是自動拆箱。

11.什麼是值傳遞和引用傳遞?

物件被值傳遞,意味著傳遞了物件的一個副本。因此,就算是改變了物件副本,也不會影響源物件的值。

物件被引用傳遞,意味著傳遞的並不是實際的物件,而是物件的引用。因此,外部對引用物件所做的改變會反映到所有的物件上。

12.Iterator和ListIterator的區別是什麼?

Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。

Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。

ListIterator實現了Iterator介面,幷包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。

13.HashMap和Hashtable有什麼區別?

HashMap和Hashtable都實現了Map介面,因此很多特性非常相似。但是,他們有以下不同點:

HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。

Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單執行緒環境,而Hashtable適合於多執行緒環境。

HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。

一般認為Hashtable是一個遺留的類。

14.Enumeration介面和Iterator介面的區別有哪些?

Enumeration速度是Iterator的2倍,同時佔用更少的記憶體。但是,Iterator遠遠比Enumeration安全,因為其他執行緒不能夠修改正在被iterator遍歷的集合裡面的物件。同時,Iterator允許呼叫者刪除底層集合裡面的元素,這對Enumeration來說是不可能的。

15.HashSet和TreeSet有什麼區別?

HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是O(1)。

另一方面,TreeSet是由一個樹形的結構來實現的,它裡面的元素是有序的。因此,add(),remove(),contains()方法的時間複雜度是O(logn)。

16.JVM的永久代中會發生垃圾回收麼?

垃圾回收不會發生在永久代,如果永久代滿了或者是超過了臨界值,會觸發完全垃圾回收(Full GC)。如果你仔細檢視垃圾收集器的輸出資訊,就會發現永久代也是被回收的。這就是為什麼正確的永久代大小對避免Full GC是非常重要的原因。請參考下Java8:從永久代到元資料區

17.Java中的兩種異常型別是什麼?他們有什麼區別?

Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。不受檢查的異常不需要在方法或者是建構函式上宣告,就算方法或者是建構函式的執行可能會丟擲這樣的異常,並且不受檢查的異常可以傳播到方法或者是建構函式的外面。相反,受檢查的異常必須要用throws語句在方法或者是建構函式上宣告。這裡有Java異常處理的一些小建議。

參考:http://www.wityx.com/post/534_1_1.html

18.throw和throws有什麼區別?

throw關鍵字用來在程式中明確的丟擲異常,相反,throws語句用來表明方法不能處理的異常。每一個方法都必須要指定哪些異常不能處理,所以方法的呼叫者才能夠確保處理可能發生的異常,多個異常是用逗號分隔的。

19.異常處理的時候,finally程式碼塊的重要性是什麼?

無論是否丟擲異常,finally程式碼塊總是會被執行。就算是沒有catch語句同時又丟擲異常的情況下,finally程式碼塊仍然會被執行。最後要說的是,finally程式碼塊主要用來釋放資源,比如:I/O緩衝區,資料庫連線。

20.PreparedStatement比Statement有什麼優勢?

PreparedStatements是預編譯的,因此,效能會更好。同時,不同的查詢引數值,PreparedStatement可以重用。

21.什麼時候使用CallableStatement?用來準備CallableStatement的方法是什麼?

CallableStatement用來執行儲存過程。儲存過程是由資料庫儲存和提供的。儲存過程可以接受輸入引數,也可以有返回結果。非常鼓勵使用儲存過程,因為它提供了安全性和模組化。

22.資料庫連線池是什麼意思?

像開啟關閉資料庫連線這種和資料庫的互動可能是很費時的,尤其是當客戶端數量增加的時候,會消耗大量的資源,成本是非常高的。可以在應用伺服器啟動的時候建立很多個數據庫連線並維護在一個池中。連線請求由池中的連線提供。在連線使用完畢以後,把連線歸還到池中,以用於滿足將來更多的請求。

23.解釋下Servlet的生命週期。

Servlet生命週期可以分成四個階段:載入和例項化、初始化、服務、銷燬。

  當客戶第一次請求時,首先判斷是否存在Servlet物件,若不存在,則由Web容器建立物件,而後呼叫init()方法對其初始化,此初始化方法在整個Servlet生命週期中只調用一次。

  完成Servlet物件的建立和例項化之後,Web容器會呼叫Servlet物件的service()方法來處理請求。

  當Web容器關閉或者Servlet物件要從容器中被刪除時,會自動呼叫destory()方法。

24.doGet()方法和doPost()方法有什麼區別?

doGet:GET方法會把名值對追加在請求的URL後面。因為URL對字元數目有限制,進而限制了用在客戶端請求的引數值的數目。並且請求中的引數值是可見的,因此,敏感資訊不能用這種方式傳遞。

doPOST:POST方法通過把請求引數值放在請求體中來克服GET方法的限制,因此,可以傳送的引數的數目是沒有限制的。最後,通過POST請求傳遞的敏感資訊對外部客戶端是不可見的。

25.HTTP響應的結構是怎麼樣的?

HTTP響應由三個部分組成:

狀態碼(Status Code):描述了響應的狀態。可以用來檢查是否成功的完成了請求。請求失敗的情況下,狀態碼可用來找出失敗的原因。如果Servlet沒有返回狀態碼,預設會返回成功的狀態碼HttpServletResponse.SC_OK。

HTTP頭部(HTTP Header):它們包含了更多關於響應的資訊。比如:頭部可以指定認為響應過期的過期日期,或者是指定用來給使用者安全的傳輸實體內容的編碼格式。如何在Serlet中檢索HTTP的頭部看這裡。

主體(Body):它包含了響應的內容。它可以包含HTML程式碼,圖片,等等。主體是由傳輸在HTTP訊息中緊跟在頭部後面的資料位元組組成的。

26.什麼是cookie?session和cookie有什麼區別?

cookie是Web伺服器傳送給瀏覽器的一塊資訊。瀏覽器會在本地檔案中給每一個Web伺服器儲存cookie。以後瀏覽器在給特定的Web伺服器發請求的時候,同時會發送所有為該伺服器儲存的cookie。下面列出了session和cookie的區別:

無論客戶端瀏覽器做怎麼樣的設定,session都應該能正常工作。客戶端可以選擇禁用cookie,但是,session仍然是能夠工作的,因為客戶端無法禁用服務端的session。

在儲存的資料量方面session和cookies也是不一樣的。session能夠儲存任意的Java物件,cookie只能儲存String型別的物件。

27.什麼是HTTP隧道?

HTTP隧道是一種利用HTTP或者是HTTPS把多種網路協議封裝起來進行通訊的技術。因此,HTTP協議扮演了一個打通用於通訊的網路協議的管道的包裝器的角色。把其他協議的請求掩蓋成HTTP的請求就是HTTP隧道。

28.sendRedirect()和forward()方法有什麼區別?

sendRedirect()方法會建立一個新的請求,而forward()方法只是把請求轉發到一個新的目標上。重定向(redirect)以後,之前請求作用域範圍以內的物件就失效了,因為會產生一個新的請求,而轉發(forwarding)以後,之前請求作用域範圍以內的物件還是能訪問的。一般認為sendRedirect()比forward()要慢。

29.JSP有什麼優點?

下面列出了使用JSP的優點:

JSP頁面是被動態編譯成Servlet的,因此,開發者可以很容易的更新展現程式碼。

JSP頁面可以被預編譯。

JSP頁面可以很容易的和靜態模板結合,包括:HTML或者XML,也可以很容易的和產生動態內容的程式碼結合起來。

開發者可以提供讓頁面設計者以類XML格式來訪問的自定義的JSP標籤庫。

開發者可以在元件層做邏輯上的改變,而不需要編輯單獨使用了應用層邏輯的頁面。

30、Servlet和CGI的區別。
與cgi的區別在於servlet處於伺服器程序中,它通過多執行緒方式執行其service方法,一個例項可以服務於多個請求,並且其例項一般不會銷燬,而CGI對每個請求都產生新的程序,服務完成後就銷燬,所以效率上低於servlet。

31、final, finally, finalize的區別。?
final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示總是執行。

finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。

參考http://www.wityx.com/post/36_1_1.html

32、垃圾回收的優點和原理。並考慮2種回收機制。
Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得Java程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃圾回收機制, Java中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低級別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
52、請說出你所知道的執行緒同步的方法。
wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。
sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。
Allnotity():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。