JAVAEE面試題精選101
-
JAVA基礎
-
==和equals方法究竟有什麼區別?
1). equals方法比較兩個物件的內容
2). ==比較兩個物件是否是同一物件,或者說物件在記憶體中的首地址是否相同
應用:(1) 對於基本資料型別,"=="比較的是兩者的值是否相等
(2) 對於引用資料型別,=="比較的是引用的地址是否相同,物件預設的equals方法和==一樣
(3) 對於String,Integer等包裝類都重寫了equals方法,比較的是內容是否相
-
靜態變數和例項變數的區別?
1). 靜態變數屬於類,該類不生產物件,通過類名就可以呼叫靜態變數。
2). 例項變數屬於該類的物件,必須產生該類物件,才能呼叫例項變數。 -
Overload和Override的區別?
java中的方法過載發生在同一個類裡面兩個或者是多個方法的方法名相同但是引數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,引數列表和返回型別。覆蓋者可能不會限制它所覆蓋的方法的訪問。
-
abstract class和interface有什麼區別?
java提供和支援建立抽象類和介面。它們的實現有共同點,不同點在於:
介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個介面,但是隻能繼承一個抽象類
類如果要實現一個介面,它必須要實現介面宣告的所有方法。但是,類可以不實現抽象類宣告的所有方法, 當然,在這種情況下,類也必須得宣告成是抽象的
抽象類可以在不提供介面方法實現的情況下實現介面。
Java介面中宣告的變數預設都是final的。抽象類可以包含非final的變數。
Java介面中的成員函式預設是public的。抽象類的成員函式可以是private,protected或者是public。
介面是絕對抽象的,不可以被例項化。抽象類也不可以被例項化,但是,如果它包含main方法的話是可以被呼叫的
-
String,StringBuffer與StringBuilder的區別?
String是字串常量,final修飾;StringBuffer字串變數(執行緒安全); StringBuilder 字串變數(執行緒不安全).
String和StringBuffer
String和StringBuffer主要區別是效能:String是不可變物件,每次對String型別進行操作都等同於產生了一個新的String物件,然後指向新的String物件.所以儘量不在對String進行大量的拼接操作,否則會產生很多臨時物件,導致GC開始工作,影響系統性能.
StringBuffer是對物件本身操作,而不是產生新的物件,因此在通常在有大量拼接的情況下我們建議使用StringBuffer.
但是需要注意現在JVM會對String拼接做一定的優化: String s="This is only "+"simple"+"test"會被虛擬機器直接優化成String s="This is only simple test",此時就不存在拼接過程.
StringBuffer和StringBuilder
StringBuffer是執行緒安全的可變字串,其內部實現是可變陣列.StringBuilder是java 5.0新增的,其功能和StringBuffer類似,但是非執行緒安全.因此,在沒有多執行緒問題的前提下,使用StringBuilder會取得更好的效能.
-
執行時異常與一般異常有何異同?
異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常
-
深拷貝和淺拷貝的區別是什麼?
淺拷貝:被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺拷貝僅僅複製所考慮的物件,而不復制它所引用的物件。
深拷貝:被複制物件的所有變數都含有與原來的物件相同的值,而那些引用其他物件的變數將指向被複制過的新物件,而不再是原有的那些被引用的物件。換言之,深拷貝把要複製的物件所引用的物件都複製了一遍。
-
equals()和hashcode()的聯絡?
hashCode()是Object類的一個方法,返回一個雜湊值.如果兩個物件根據equal()方法比較相等,那麼呼叫這兩個物件中任意一個物件的hashCode()方法必須產生相同的雜湊值. 如果兩個物件根據eqaul()方法比較不相等,那麼產生的雜湊值不一定相等(碰撞的情況下還是會相等的.)
-
conllection和conllections的區別?
Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
-
list和set的區別?
(1). List,Set都是繼承自Collection接口
(2). List特點:元素有放入順序,元素可重複 ,Set特點:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
(3). List介面有三個實現類:LinkedList,ArrayList,Vector ,Set介面有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
-
ArrayList和Vector的區別?
1). ArrayList在記憶體不夠時預設是擴充套件50% + 1個,Vector是預設擴充套件1倍。
2). Vector提供indexOf(obj, start)介面,ArrayList沒有。
3). Vector屬於執行緒安全級別的,但是大多數情況下不使用Vector,因為執行緒安全需要更大的系統開銷。 -
ArrayList,Vector, LinkedList的儲存效能和特性?
ArrayList 和Vector是採用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,都允許直接序號索引元素,但是插入資料要設計到陣列元素移動等記憶體操作,所以索引資料快插入資料慢,Vector由於使用了synchronized方法(執行緒安全)所以效能上比ArrayList要差,LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行向前或向後遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快!
-
HashMap和Hashtable的區別?
1).hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。
2).hashMap允許空鍵值,而hashTable不允許。3).hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
-
set集合如何保證不重複?
主要是要判斷set集合中是否有重複的元素,規則如下:
1)、判斷兩個物件的hashCode是否相等 。
如果不相等,認為兩個物件也不相等,完畢
如果相等,轉入2)
(這一點只是為了提高儲存效率而要求的,其實理論上沒有也可以,但如果沒有,實際使用時效率會大大降低,所以我們這裡將其做為必需的。後面會重點講到這個問題。)
2)、判斷兩個物件用equals運算是否相等 。
如果不相等,認為兩個物件也不相等
如果相等,認為兩個物件相等(equals()是判斷兩個物件是否相等的關鍵) -
HashMap的實現原理?
HashMap基於hash原理,我們通過put()和get()方法儲存和獲取物件。當我們將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。HashMap使用LinkedList來解決碰撞問題,當發生碰撞了,物件將會儲存在LinkedList的下一個節點中。 HashMap在每個LinkedList節點中儲存鍵值對物件。
當兩個不同的鍵物件的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的LinkedList中。鍵物件的equals()方法用來找到鍵值對
-
TreeSet的原理以及使用?
1). TreeSet()是使用二叉樹的原理對新add()的物件按照指定的順序排序(升序、降序),每增加一個物件都會進行排序,將物件插入的二叉樹指定的位置。
2). Integer和String物件都可以進行預設的TreeSet排序,而自定義類的物件是不可以的,自己定義的類必須實現Comparable介面,並且覆寫相應的compareTo()函式,才可以正常使用。
-
程序和執行緒的區別?
一個程序是一個獨立(self contained)的執行環境,它可以被看作一個程式或者一個應用。而執行緒是在程序中執行的一個任務。Java執行環境是一個包含了不同的類和程式的單一程序。執行緒可以被稱為輕量級程序。執行緒需要較少的資源來建立和駐留在程序中,並且可以共享程序中的資源
-
建立執行緒的方式?
程序是執行著的應用程式,而執行緒是程序內部的一個執行序列。一個程序可以有多個執行緒。執行緒又叫做輕量級進程
-
執行緒有哪些狀態?
執行緒在執行過程中,可以處於下面幾種狀態:
就緒(Runnable):執行緒準備執行,不一定立馬就能開始執行。
執行中(Running):程序正在執行執行緒的程式碼。
等待中(Waiting):執行緒處於阻塞的狀態,等待外部的處理結束。
睡眠中(Sleeping):執行緒被強制睡眠。
I/O阻塞(Blocked on I/O):等待I/O操作完成。
同步阻塞(Blocked on Synchronization):等待獲取鎖。
死亡(Dead):執行緒完成了執行。
-
執行緒同步的方式有哪些?
1). synchronized關鍵字修飾的方法
2). synchronized關鍵字修飾的語句塊
3). 使用重入鎖Lock類實現執行緒同步
4). 使用ThreadLocal管理變數實現執行緒同步
5.) 使用阻塞佇列實現執行緒同步
6). 使用原子變數實現執行緒同步
-
如何保證幾個執行緒執行緒有序執行?
1). 共享物件鎖,可以保證每個方法只能同時有一個執行緒進入,配合wait和notifyall方法,可以啟動或者喚醒線程
2). 通過主執行緒Join()
-
java中wait和sleep方法有何不同?
1). 這兩個方法來自不同的類分別是Thread和Object
2). 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法
3). wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用
4). sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
-
執行緒之間是如何通訊的?
當執行緒間是可以共享資源時,執行緒間通訊是協調它們的重要的手段。Object類中wait()\notify()\notifyAll()方法可以用於執行緒間通訊關於資源的鎖的狀態
-
同步方法和同步塊,哪個是更好的選擇?
同步塊是更好的選擇,因為它不會鎖住整個物件(當然也可以讓它鎖住整個物件)。同步方法會鎖住整個物件,哪怕這個類中有多個不相關聯的同步塊,這通常會導致他們停止執行並需要等待獲得這個物件上的鎖
-
執行緒中同步和非同步的區別?
同步:A執行緒要請求某個資源,但是此資源正在被B執行緒使用中,因為同步機制存在,A執行緒請求不到,怎麼辦,A執行緒只能等待下去
非同步:A執行緒要請求某個資源,但是此資源正在被B執行緒使用中,因為沒有同步機制存在,A執行緒仍然請求的到,A執行緒無需等待
-
簡述Volatile變數?
用來確保將變數的更新操作通知到其他執行緒,保證了新值能立即同步到主記憶體,以及每次使用前立即從主記憶體重新整理。換句話說:volatile 變數在各個執行緒中是一致的
-
簡述執行緒區域性變數ThreadLocal?
ThreadLocal變數執行緒區域性變數是侷限於執行緒內部的變數,屬於執行緒自身所有,不在多個執行緒間共享,是一種實現執行緒安全的方式
-
簡述Java多執行緒中死鎖、活鎖、飢餓?
死鎖:死鎖發生在一個執行緒需要獲取多個資源的時候,這時由於兩個執行緒互相等待對方的資源而被阻塞
活鎖:的是執行緒不斷重複執行相同的操作,但每次操作的結果都是失敗的。儘管這個問題不會阻塞執行緒,但是程式也無法繼續執行
飢餓:指的執行緒無法訪問到它需要的資源而不能繼續執行時,引發飢餓最常見資源就是CPU時鐘周期
-
簡述Java多執行緒的悲觀鎖與樂觀鎖?
悲觀鎖:就是不管是否發生多執行緒衝突,只要存在這種可能,就每次訪問都加鎖,加鎖就會導致鎖之間的爭奪,有爭奪就會有輸贏,輸者等待。
樂觀鎖:獲得鎖後一直持有鎖以防本執行緒再次申請該鎖造成無謂的解鎖再加鎖開銷
-
簡述java垃圾回收機制?
Java 垃圾回收機制最基本的做法是分代回收。記憶體中的區域被劃分成不同的世代,物件根據其存活的時間被儲存在對應世代的區域中。一般的實現是劃分成3個世代:年輕、年老和永久。記憶體的分配是發生在年輕世代中的。當一個物件存活時間足夠長的時候,它就會被複制到年老世代中。對於不同的世代可以使用不同的垃圾回收演算法。進行世代劃分的出發點是對應用中物件存活時間進行研究之後得出的統計規律。一般來說,一個應用中的大部分物件的存活時間都很短。比如區域性變數的存活時間就只在方法的執行過程中。基於這一點,對於年輕世代的垃圾回收演算法就可以很有針對性.
-
如何判斷一個物件是否應該被回收?
這就是所謂的物件存活性判斷,常用的方法有兩種:1.引用計數法;2:物件可達性分析.由於引用計數法存在互相引用導致無法進行GC的問題,所以目前JVM虛擬機器多使用物件可達性分析演算法.
-
簡述JVM記憶體分配?
(1). 基本資料型別比變數和物件的引用都是在棧分配的
(2). 堆記憶體用來存放由new建立的物件和數組
(3). 類變數(static修飾的變數),程式在一載入的時候就在堆中為類變數分配記憶體,堆中的記憶體地址存放在棧中
(4). 例項變數:當你使用java關鍵字new的時候,系統在堆中開闢並不一定是連續的空間分配給變數,是根據零散的堆記憶體地址,通過雜湊演算法換算為一長串數字以表徵這個變數在堆中的"物理位置",例項變數的生命週期--當例項變數的引用丟失後,將被GC(垃圾回收器)列入可回收"名單"中,但並不是馬上就釋放堆中內存
(5). 區域性變數: 由宣告在某方法,或某程式碼段裡(比如for迴圈),執行到它的時候在棧中開闢記憶體,當局部變數一但脫離作用域,記憶體立即釋放
-
Java中常用的垃圾收集演算法?
(1). 標記-清除
(2). 標記-複製
(3). 標記-整理
(4). 分代回收
參考網站:http://www.cnblogs.com/cielosun/p/6674431.html
最好能簡單的描述一下,當然描述2種即可(自行百度)
-
System.gc()和Runtime.gc()的作用?
這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決於JVM的
-
finalize()方法什麼時候被呼叫以及作用?
在釋放物件佔用的記憶體之前,垃圾收集器會呼叫物件的finalize()方法。一般建議在該方法中釋放物件持有的資源。
-
簡述java類載入機制以及載入過程?
類從被載入到虛擬機器記憶體中開始,直到卸載出記憶體為止,它的整個生命週期包括了: 載入、驗證、準備、解析、初始化、使用和解除安裝 這7個階段。其中, 驗證、準備和解析這三個部分統稱為連線(linking)
載入:載入階段由類載入器在完成,主要作用如下:
- 獲取定義此類的二進位制位元組流
- 將這個位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結構
- 在Java堆中生成一個代表這個類的java.lang.Class對象
驗證: 驗證是連線階段的第一步,這一階段的目的是為了確保Class檔案的位元組流中包含的資訊符合當前虛擬機器的要求,並且不會危害虛擬機器自身的安全
準備:準備階段是為類的靜態變數分配記憶體並將其初始化為預設值,這些記憶體都將在方法區中進行分配
解析: 解析階段是虛擬機器將常量池內的符號引用替換為直接引用的過程
初始化:初始化階段是執行類構造器<clinit>()方法的過程
-
什麼是類載入器,類載入器有哪些?
類載入器用於完成類的載入。類載入器包括:根載入器(BootStrap)、擴充套件載入器(Extension)、系統載入器(System)和使用者自定義類載入器(java.lang.ClassLoader的子類)
-
能說出至少3到5種設計模式?
參考網站:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
-
能說出3種排序演算法的思想?
氣泡排序:http://www.cnblogs.com/jingmoxukong/p/4302718.html
快速排序:http://www.cnblogs.com/jingmoxukong/p/4302891.html
直接插入排序:http://www.cnblogs.com/jingmoxukong/p/4303270.html
- Java Web
- 簡述http協議?
-
==和equals方法究竟有什麼區別?
HTTP(超文字傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連線方式。http請求由三部分組成,分別是:請求行、訊息報頭、請求正文,響應也包含三部分:狀態行(包含HTTP版本、狀態碼、狀態碼的原因短語)、響應首部欄位、響應內容實體 |
-
Get和Post請求方式的區別?
(1). get位址列有引數顯示 post不會再位址列顯示引數(引數是放在了請求體)
(2). get不安全 post相對安全
(3). get限制大小 post理論上不限制
-
Servlet的生命週期?
1). 第一次請求的時候servlet被初始化,而且只初始化一次,所以tomcat容器中每一個servlet只有一個物件存在
2). 初始化後先呼叫init方法,只執行一遍
3). 每個請求,呼叫一遍service -> service -> doGet/doPost。以多執行緒的方式運行
4). 解除安裝前呼叫destroy方法
-
JSP和Servlet有哪些相同點和不同點,他們之間的聯絡是什麼?
JSP是Servlet技術的擴充套件,本質上就是Servlet的簡易方式。JSP編譯後是"類servlet"。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。JSP側重於檢視,Servlet主要用於控制邏輯
-
重定向和轉發的區別?
1). 重定向是客戶端行為,轉發是伺服器端行為
2). 重定向兩次請求兩次響應,轉發一次請求一次響應
3). 重定向路徑需要加工程名,轉發的路徑不需要加工程名.
4). 重定向可以跳轉到任意網站,轉發只能在伺服器內部進行轉發.
5). 重定向會導致request物件資訊丟失。轉發則不會
-
述JSP九大內建物件?
request:負責得到客戶端請求的資訊,對應型別:javax.servlet.http.HttpServletRequest
response:負責向客戶端發出響應,對應型別:javax.servlet.http.HttpServletResponse
session:負責儲存同一客戶端一次會話過程中的一些資訊,對應型別:javax.servlet.http.httpsession
out:負責管理對客戶端的輸出,對應型別:javax.serlvet.jsp.jspwriter
application:表示整個應用環境的資訊,對應型別:javax.servlet.servletcontext
config:表示ServletConfig,對應型別:javax.servlet.servletconfig
exception:表示頁面中發生的異常,可以通過它獲得頁面異常資訊,對應型別:java.lang.exception
pagecontext:表示這個JSP頁面上下文,對應型別:javax.servlet.jsp.pagecontext
page:表示當前JSP頁面本身
-
JSP的四種作用域?
1). page是代表一個頁面相關的物件和屬性。
2). request一個請求可能跨越多個頁面。
3). session一個web回話也可以經常跨域多個請求。
4). application是代表與整個web應用程式相關的物件和屬性。
-
JSP中靜態include與動態include的區別?
1). 靜態include:語法:<%@ include file="檔名" %>,相當於複製,編輯時將對應的檔案包含進來,當內容變化時,不會再一次對其編譯,不易維護。
2). 動態include:語法:<jsp:include page="檔名">,能夠自動檢查被包含檔案,當客戶端對JSP檔案進行請求時,會重新將對應的檔案包含進來,進行實時的更新。
-
cookie和session的作用、區別?
1). cookie資料儲存在客戶端,session資料儲存在服務端。
2). cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,相當重要的資料,應該使用session儲存到服務端。
3). session會在一定時間內保持在伺服器上,但是會佔用記憶體資源,當訪問的使用者過多,會加重伺服器的負載,考慮到減輕伺服器的壓力,可以將不重要的資料放在cookie中持久的儲存。
4). 單個cookie儲存的資料不能超過4k,很多瀏覽器都限制站點最多儲存20個cookie。
-
tomcat的優化經驗?
1). 去掉對web.xml的監視
2). 把JSP提前編輯成Servlet
3). 有富餘實體記憶體的情況下
4). 加大Tomcat使用的JVM記憶體。
-
如何防止表單重複提交?
1). JavaScript控制
2). 使用session實現令牌機制
-
過濾器有哪些作用,以及過濾器的生命週期?
生命週期:每個Filter在tomcat啟動時進行初始化,每個Filter只有一個例項對象
(1). Init:在伺服器啟動時會建立Filter實例
(2). doFilto:這個方法會在使用者每次訪問"目標資源"時執行
(3). destroy():伺服器關閉時銷燬Filter對象
作用:
(1). 驗證客戶是否來自可信網絡
(2). 對客戶提交的資料進行重新編碼
(3). 過濾掉客戶的某些不應該出現的詞匯
(4). 驗證使用者是否可以登錄
(5). 驗證客戶的瀏覽器是否支援當前的應用
(6). 記錄系統日志
-
詳細描述MVC?
基於java的web應用系統採用MVC設計模型,即用Model(模型)、View(檢視)和Controller(控制)分離設計,這是目前web應用服務系統的主流設定方向。
Model:處理業務邏輯的模組。
View:負責頁面顯示,顯示Model的處理結果給使用者,主要實現資料到頁面的轉換過程。
Controller:負責每個請求的分發,把Form資料傳遞給Model進行處理,處理完成後,把處理結果返回給相應的View顯示給用戶