Java常見面試題(基礎)
明天夏天準備去面試一下關於人工智慧或者軟體開發的暑期實習生,所以 提前準備一下,在網上看到一些很好的面試題,所以轉載方便日後觀看。
JAVA常見面試題
1》:Java中的異常處理機制的簡單原理和應用
簡單原理:每當產生異常之後,如果沒有程式進行相應的處理,則程式出現中斷的現象,那麼,此時實際上一旦產生一個異常之後,JVM會丟擲一個異常類的例項物件,如果此時使用了try語句進行捕獲,則可以進行異常處理,如果沒有的話,則交給JVM進行處理,當try語句捕獲到了異常之後,會與catch中的異常類進行匹配,如果匹配成功,則使用此catch語句進行處理。
應用:簡單的引用,就是在所有有throws關鍵字的地方加入try…catch
如果按照一個標準做法的話,try、catch、finally、throw、throws關鍵字應該一起使用。
2》:垃圾回收的優點和原理。並考慮兩種回收機制。
優點和原理:將無用的物件空間進行釋放。
兩種回收:自動回收,手工呼叫System.gc()方法。呼叫System.gc()方法實際上相當於呼叫了RunTime.getRumTime().gc()方法。
3》:Error和Exception有什麼區別?
Error:表示是由JVM進行處理的,是JVM出錯。
Exception:是可以由程式進行處理的。使用try…catch進行處理.
4》:談談final,finally,finallize的區別.
Final是定義常量、方法、和類的,宣告的方法不能被覆寫、宣告的類不能被繼承。
Finally是異常的統一出口。
Finallize是垃圾回收前的收尾工作。是Object物件定義的。
5》:Anonymous Inner Class(匿名內部類)是否可以extends(繼承)其他類,是否可以implements(實現)Interface(介面)
允許繼承或實現,因為匿名內部類就是在抽象類和介面的基礎上發展起來的。
6》:Static Nested Class和Inner Class的不同。
使用static宣告的內部類就是外部類,可以通過外部類.內部類直接訪問。
普通的內部類是不能被外部所直接訪問的。需要通過外部類例項再找到內部類例項。
7》:HashMap和HashTable的區別
|-HashMap:是jdk1.2之後推出的,是新的類。
採用非同步處理方式,效能較高,但並非執行緒安全。
允許設定為null
|-HashTable:是Jdk1.0之後推出的,是舊的類
採用同步處理方式,效能較低,但是屬於執行緒安全。
不允許設定null,否則將出現NullPointException
8》:什麼時候用assert?
Jdk1.4之後增加的新關鍵字---assert,表示斷言,即程式執行到某個地方之後肯定是預計好的。
一般程式中很少使用assert
要想使用斷言,則必須使用-ea引數。
9》:GC是什麼?為什麼要有GC?
GC:垃圾收集
使用GC可以進行垃圾空間的釋放操作.
10》:String s = new String(“xyz”);建立了幾個String Object?
產生了兩個例項化物件,一個是匿名物件“xyz”,另外一個是通過關鍵字new例項化的。
11》:sleep()和wait()方法有什麼區別?
Sleep()是Thread定義的方法,表示執行緒的休眠,會自動喚醒。
Wait()是Object裡的方法,需要手工呼叫notify()或notifyAll()方法。
12》:Java中有沒有goto?
Goto屬於保留的關鍵字,Java中存在goto,只是無法使用。
13》:陣列中有沒有length()這個方法?String中有沒有length()這個方法?
陣列中存在length這個屬性,String中存在length()這個方法.
14》:Overload和Override的區別。Overload的方法是否可以改變返回值的型別?
Overload過載:在一個類中定義的若干方法。
所有的方法名稱相同,但是引數的個數或型別不同。
Override覆寫:在繼承的關係中
子類定義了與父類相同的方法,引數個數或型別最好完全一樣。注意訪問許可權不能更加嚴格。
Overload過載的時候不是靠返回值型別區分的,而是靠引數。
15》:Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還是equals()?他們有何區別?
依靠hashCode()和equals()兩個方法完成,==屬於地址比較,而equals()屬於內容比較。使用的是equals()方法。
16》:列舉出一些常見的runtime Exception。
NumberFormatException、ArrayOutIndexOfBoundException、NullPointerException、ClassCastException
17》:abstract Class和interface有什麼區別?
抽象類:1:由抽象方法和常量,變數、全域性常量、構造方法、普通方法組成。
2:使用abstract宣告。
3:子類要通過extends繼承抽象類,子類如果不是抽象類,則必須覆寫抽象類 的全部抽象方法。
4:存在單繼承侷限,一個子類只能繼承一個抽象類。
5:抽象類可以實現若干個介面
介面:1:全部由抽象方法和全域性常量組成。
2:使用interface宣告。
3:子類通過implements實現介面,子類如果不是抽象類,則必須覆寫抽象類中的全部抽象方法。
4:不存在單繼承侷限,一個子類可以同時實現多個介面。
5:介面不能繼承一個抽象類,但是允許繼承多個介面。
18》:啟動一個執行緒是用run()還是start()?
使用start()方法,因為要通知JVM進行PCU資源分配。
19》:try{}裡有一個return語句,那麼緊跟在try後的finally{}裡的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,在return之前執行,只要是finally{}的程式碼永遠會被執行。
20》:寫一個singleton出來。
核心就是構造方法私有化。
Public class Singleton{
Private static final Singleton sin = new Singleton();
Private Singleton(){}; //將構造方法私有化
Public static Singleton getInstance() {
Return sin;
}
}
在Java中有Runtime類、Class類屬於單例設計。
21》:編一段程式碼,實現在控制檯裡輸入一組數字後,排序在控制檯裡輸出。
假設數字中間使用“ ”進行分隔,既然可以排序,則可以
Public void queueIntArray() {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入一組資料");
String str = buf.readLine();
Set<Integer> set = new TreeSet<Integer>();
String[] s = str.split(" "); //進行拆分
for(String t : s) {
set.add(Integer.parseInt(t));
}
System.out.println("排序之後的結果是:");
for(Iterator<Integer> it = set.iterator(); it.hasNext();) {
System.out.print(it.next() + "\t");
}
}
22》:列出某資料夾下的所有檔案。
遞迴方法的呼叫
public static void main(String[] args) {
File file = new File("D:" + File.separator + "sse3.2");
fun(file);
}
public static void fun(File file) {
if(file.isDirectory()) {
File[] f = file.listFiles();
if(f != null) {
for(int i = 0; i < f.length; i ++) {
fun(f[i]);
}
}
} else {
System.out.println(file);
}
}
23》:char型變數中能不能儲存一箇中文漢字?為什麼?
可以存放,因為使用的是unicode編碼.
24》:多執行緒有幾中實現方法?都是什麼?同步有幾種實現方式?都是什麼?
多執行緒:兩種實現方式。繼承Thread類,實現Runnable介面。
1:Thread類是Runnable介面的子類。
2:使用Runnable介面可以實現資源共享的目的。
3:所有執行緒操作都必須通過Thread類的start()方法啟動。
同步:兩種實現方式:
1:同步程式碼塊:Synchronized(this){}
2:同步方法
25》:float型float f = 3.4是否正確?
不正確,因為預設情況下3.4是double型別的資料。
26》:String與StringBuffer的區別是什麼?
String不可以修改,String允許修改。
27》:Class.forName的作用?為什麼要用。
Class.forName屬於向容器中加入驅動程式,例如:JDBC中的使用。
28》:int和Integer有什麼別?
Int是基本資料型別,Integer是包裝類
在JDK1.5之後,可以實現自動裝箱及拆箱的操作
29》:用最有效的方法算出2乘以8等於幾?
使用移位操作:2<<3
30》:請說出類集框架的完整結構。
1:類集框架最大的介面:Collection、Map、Iterator
2:Collection存放單值
List:允許有重複內容
ArrayList:非同步處理,新的操作類,非執行緒安全
Vector:同步處理:舊的操作類,執行緒安全,支援Enumeration
Set:不允許有重複內容,靠hashCode()和equals()進行重複的驗證。
HashSet:無序排列
TreeSet:有序排列,按Comparable排序
3:Map:存放-對值
HashMap:新的類,非同步處理,非執行緒安全,允許有null
HashTable:新的類,同步處理,非執行緒安全,不允許有null
Properties:屬性操作類
TreeMap:有序排列,按key排序,根據Compariable制定排序規則。
4:Iterator:
迭代輸出,依靠Collection介面的iterator方法輸出,是新的輸出標準
5:Enumeration:舊的輸出。
31:是否允許繼承String類。
不允許,因為使用了final宣告。
32:String、Stringbuffer、Stringbuilder的區別是什麼?
string不可變的字串
stringbuilder可變的字串,非執行緒安全的
stringbuffer 可變的字串,執行緒安全的
Java Web常見面試題
1:JSP有哪些內建物件?作用分別是什麼?
一共有9個內建物件。
PageContext javax.servlet.jsp.PageContext
Request javax.servlet.http.HttpServletRequest
Response javax.servlet.http.HttpServletResponse
Session javax.servlet.http.HttpSession
Application javax.servlet.ServletContext àthis.getServletContext()
Config javax.servlet.ServletConfig
Exception java.lang.Throwable
Page java.lang.Object
Out javax.servlet.jsp.JspWriter
作用:
1:pageConext 表示頁容器 ->EL、標籤、上傳
2:request 伺服器端取得客戶端的資訊 :頭資訊、Cookie、請求引數
3:response 伺服器端迴應給客戶端的資訊 :Cookie、重定向
4:session 表示每一個使用者,使用者驗證登陸上
5:applcation 表示整個伺服器, getRealPath()
6:config 取得初始化引數,初始化引數 web.xml中配置。
7:exception 表示的是錯誤頁的處理操作
8:page 如同this一樣,表示的是整個jsp頁面。
9:out 輸出,但是儘量使用表示式輸出。
2》:JSP有哪些動作?作用分別是什麼?
所謂的動作實質上指的是標籤指令。
<jsp:include>:包含
<jsp:forward>:跳轉
<jsp:useBean>:使用userBean
<jsp:setProperty>:設定屬性,通過反射呼叫方法。
<jsp:getProperty>:取得屬性。
<jsp:plugin>:插入Applet程式的程式碼
3》:JSP中動態include與靜態include的區別?
動態include:<jsp:include>,如果包含的是動態頁面,則先編譯再處理。
靜態include:<%@ include%>,直接將內容先包含後處理。
4》:兩種跳轉的方式分別是什麼?有什麼區別?
伺服器端跳轉:<jsp:forward>,跳轉之後位址列不變,可以傳遞request屬性,實際上是對RequestDispatcher介面的封裝。
客戶端跳轉:response.sendRedirect(),跳轉之後位址列變化。
5》:請總結一下WEB開發中的會話跟蹤實現。
1、session,也是最常用的一種
2、cookie
3、地址重寫
4、隱藏域
6》:在WEB開發中需要處理HTML標記時,應該做什麼樣的處理,要篩選哪些字元(<,>,&,、)。
因為以上的標記都屬於HTML範疇的內容,所以必須進行轉義操作:<,>,",&apos,&
7》:說明JSP中errorPage的作用,應用範圍。
表示錯誤頁的操作,在一般的站點中,只要有一個程式出現了錯誤,就是產生了異常,則可以統一跳轉到一個頁面上進行顯示。那麼這種操作就屬於錯誤性的處理,但是簡單的錯誤頁基本上都是在JSP的開發中使用的。
要想進行錯誤頁的設定,需要滿足以下兩個條件:
1:在錯誤能夠處理的頁上的page指令中,增加:isErrorPage=“true”,表示處理錯誤。
2:在每一個頁面制定errorpage,指向isErrorPage為true的頁面。
如果現在希望配置一種全域性的錯誤處理的話,則可以在web.xml中進行配置。
<error-page>
<error-code>404</error-code>
<location>/errors.jsp</location>
</error-page>
<error-page>
<error-code>java.lang.NullPointerException</error-code>
<location>/errors.jsp</location>
</error-page>
一旦出現錯誤之後,會自動跳轉到指定的頁面中,但是這種跳轉,永遠是屬於伺服器端的跳轉。
8》:寫一段JDBC連線Oracle的程式,並實現資料查詢。
A:步驟
1:定義一系列的全域性常量:驅動程式,連線地址,使用者名稱,密碼。
2:載入驅動程式
3:連線資料庫
4:操作資料庫:更新或查詢
5:關閉資料庫
B:
Public static final String DRIVER = “oracle.jdbc.driver.OracleDriver”
Public static final String URL= “jdbc:oracle:thin:@localhost:1052:MLDN”
Public static final String USER = “zhj”;
Public static final String PWD = “zhj”;
Collection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String sql = “select name from emp”;
Class.forName(DRIVER);
Pst = conn.preparedStatement(sql);
Rs = pst.executeQuery();
While(rs.next()){
Int empNo = rs.getInt(1);
String eName = rs.getString(2);
}
Rs.close();
Pst.close();
Conn.close();
9》:簡述JSP中是如何實現分頁操作的。
真分頁:效能較高,是基於資料庫的操作。是從資料庫中取出部分資料進行顯示,所以效能很高,但是可一移植性低.
假分頁:效能較低,是將全部的結果查詢出來,之後依靠分頁演算法,只顯示部分資料。因為使用的是通用的語法,所以可移植性很高。
真分頁的原理:
1:定義一系列的變數:currentPage、lineSize、並通過查詢求出allRecords和計算出pageSize。 PageSize= (allRecord + lineSize – 1) / lineSize;
2:之後資料庫查詢語句中根據lineSize和currentPage進行資料的查詢。 Oracle中使用rownum,mysql中使用limit()
3:之後通過表單不斷的修改currentPage和lineSize就可以實現分頁顯示。
10》:介紹在JSP中如何使用JavaBean?
JavaBean的格式要求:必須有包、public class 宣告、屬性封裝、無參構造、setter、getter方法。
Import語句匯入或者通過<jsp:useBean>
11》:說一說servlet的生命週期
1:初始化:正常一次:對應init方法,有兩個init方法,其中一個是有ServletConfig物件,此方法存在,則無參不呼叫。正常情況下在第一次使用servlet的時候進行初始化操作,也可以配置 web.xml中在容器啟動的時候初始化。<load-on-startup>
2:服務:服務多次,所有的服務都由service方法分配,主要有doGet方法和doPost方法,分別處理doGet和doPost請求。
3:銷燬:正常一次,呼叫destory方法,如果servlet長時間不使用也會自動銷燬。
12》:servlet的forward()和redirect()的區別。
Forward是RequestDispatcher介面定義的,而redirect方法是response定義的。一個是伺服器跳轉,另一個是客戶端跳轉。
13》:MVC的各個部分都有哪些技術來實現,如何實現。
MVC:model、view、colltroller
|-Model:javabean:業務處理,資料處理。
|-view:顯示的jsp,最好不存在任何的scriptlet,可以使用標籤消除。
|-Controller:控制,接收View傳遞的內容和呼叫的Javabean,並根據javabean的處理結果進行跳轉。
實現原理:所有的jsp將內容提交給servlet,servlet接受這些內容並呼叫相應的javabean進行業務及資料的處理,一般javabean有專人負責開發,完成業務的操作流程,而servlet呼叫的只是介面,並根據這些介面的操作結果將內容交給JSP進行顯示。
14》:簡述國際化的實現原理
Local、屬性檔案,ResourceBoundle
國際化程式的實現,是根據本機的作業系統的語言型別,選擇不同的屬性檔案,所有程式的基本程式碼一樣。但是現實檔案不一樣。所以將內容作為屬性檔案出現之後,可以只顯示屬性檔案中的文字。
15》:描述JSP和Servlet的區別,共同點,各自應用的範圍。
先有servlet,再有jsp,servlet是java中嵌入HTML程式碼,而JSP是HTML中嵌入Java程式碼。
共同點:JSP可以完成的功能,Servlet都可以完成,但是對於過濾器,監聽器只能由servlet完成。
應用範圍:JSP用於顯示,而Servlet用於控制。
16》:簡述web.xml的應用。
屬於部署描述符,在整個Java中只要是容器都會存在部署描述符,此部署描述符可以控制整個WEB中各個元件的執行程式碼,也可以配置整個容器的狀態:<error-page><welcome-file-list><servlet><session-timeout>
<listener><filter>等等