罕見的java面試題。本站提示廣大學習愛好者:(罕見的java面試題)文章只能為提供參考,不一定能成為您想要的結果。以下是罕見的java面試題正文
本文次要為大家整理Java罕見的面試題,供大家參考,詳細內容如下
1. Java中sleep和wait的區別
① 這兩個辦法來自不同的類辨別是,sleep來自Thread類,和wait來自Object類。
sleep是Thread的靜態類辦法,誰調用的誰去睡覺,即便在a線程裡調用b的sleep辦法,實踐上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。
② 鎖: 最次要是sleep辦法沒有釋放鎖,而wait辦法釋放了鎖,使得其他線程可以運用同步控制塊或許辦法。
sleep不出讓零碎資源;wait是進入線程等候池等候,出讓零碎資源,其他線程可以占用CPU。普通wait不會加時間限制,由於假如wait線程的運轉資源不夠,再出來也沒用,要等候其他線程調用notify/notifyAll喚醒等候池中的一切線程,才會進入就緒隊列等候OS分配零碎資源。sleep(milliseconds)可以用時間指定使它自動喚醒過去,假如時間不到只能調用interrupt()強行打斷。
Thread.sleep(0)的作用是“觸發操作零碎立即重新停止一次CPU競爭”。
③ 運用范圍:wait,notify和notifyAll只能在同步控制辦法或許同步控制塊外面運用,而sleep可以在任何中央運用。
synchronized(x){ x.notify() //或許wait() }
2. Java中HashMap和HashTable的區別
① 歷史緣由: Hashtable是給予陳腐的Dictonary類的, HashMap是Java1.2引進的Map接口的一個完成
② HashMap允許空的鍵值對, 而HashTable不允許
③ HashTable同步,而HashMap非同步,效率上比HashTable要高
3. 請簡述在異常當中,throw和throws有什麼區別
① throw代表舉措,表示拋出一個異常的舉措;throws代表一種形態,代表辦法能夠有異常拋出
② throw用在辦法完成中,而throws用在辦法聲明中
③ throw只能用於拋出一種異常,而throws可以拋出多個異常
4. 內存溢出和內存洩露的區別
內存溢出 out of memory,是指順序在請求內存時,沒有足夠的內存空間供其運用,呈現out of memory;比方請求了一個integer,但給它存了long才干存下的數,那就是內存溢出。
內存洩露 memory leak,是指順序在請求內存後,無法釋放已請求的內存空間,一次內存洩露危害可以疏忽,但內存洩露堆積結果很嚴重,無論多少內存,遲早會被占光。
memory leak會最終會招致out of memory!
內存溢出就是你要求分配的內存超出了零碎能給你的,零碎不能滿足需求,於是發生溢出。
內存走漏是指你向零碎請求分配內存停止運用(new),可是運用完了當前卻不出借(delete),後果你請求到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而零碎也不能再次將它分配給需求的順序。一個盤子用盡各種辦法只能裝4個果子,你裝了5個,後果掉倒地上不能吃了。這就是溢出!比如說棧,棧滿時再做進棧肯定發生空間溢出,叫上溢,棧空時再做退棧也發生空間溢出,稱為下溢。就是分配的內存缺乏以放下數據項序列,稱為內存溢出。
以發作的方式來分類,內存走漏可以分為4類:
① 常發性內存走漏。發作內存走漏的代碼會被屢次執行到,每次被執行的時分都會招致一塊內存走漏。
② 偶發性內存走漏。發作內存走漏的代碼只要在某些特定環境或操作進程下才會發作。常發性和偶發性是絕對的。關於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試辦法對檢測內存走漏至關重要。
③ 一次性內存走漏。發作內存走漏的代碼只會被執行一次,或許由於算法上的缺陷,招致總會有一塊僅且一塊內存發作走漏。比方,在類的結構函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存走漏只會發作一次。
④ 隱式內存走漏。順序在運轉進程中不停的分配內存,但是直到完畢的時分才釋放內存。嚴厲的說這裡並沒有發作內存走漏,由於最終順序釋放了一切請求的內存。但是關於一個服務器順序,需求運轉幾天,幾周甚至幾個月,不及時釋放內存也能夠招致最終耗盡零碎的一切內存。所以,我們稱這類內存走漏為隱式內存走漏。
從用戶運用順序的角度來看,內存走漏自身不會發生什麼危害,作為普通的用戶,基本覺得不到內存走漏的存在。真正有危害的是內存走漏的堆積,這會最終耗費盡零碎一切的內存。從這個角度來說,一次性內存走漏並沒有什麼危害,由於它不會堆積,而隱式內存走漏危害性則十分大,由於較之於常發性和偶發性內存走漏它更難被檢測到。
5. String,StringBuffer 和 StringBuilder的區別
①可變與不可變
String類中運用字符數組保管字符串,如下就是,由於有“final”修飾符,所以可以知道string對象是不可變的。
private final char value[];
StringBuilder與StringBuffer都承繼自AbstractStringBuilder類,在AbstractStringBuilder中也是運用字符數組保管字符串,如下就是,可知這兩種對象都是可變的。
char[] value;
②能否多線程平安
String中的對象是不可變的,也就可以了解為常量,顯然線程平安。
AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的根本操作,如expandCapacity、append、insert、indexOf等公共辦法。
StringBuffer對辦法加了同步鎖或許對調用的辦法加了同步鎖,所以是線程平安的。看如下源碼:
public synchronized StringBuffer reverse() { super.reverse(); return this; } public int indexOf(String str) { return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 辦法 }
StringBuilder並沒有對辦法停止加同步鎖,所以是非線程平安的。
③StringBuilder與StringBuffer共同點
StringBuilder與StringBuffer有公共父類AbstractStringBuilder(籠統類)。
籠統類與接口的其中一個區別是:籠統類中可以定義一些子類的公共辦法,子類只需求添加新的功用,不需求反復寫曾經存在的辦法;而接口中只是對辦法的聲明和常量的定義。
StringBuilder、StringBuffer的辦法都會調用AbstractStringBuilder中的公共辦法,如super.append(...)。只是StringBuffer會在辦法上加synchronized關鍵字,停止同步。
最後,假如順序不是多線程的,那麼運用StringBuilder效率高於StringBuffer。
6. 數組和鏈表的區別
二者都屬於一種數據構造
從邏輯構造來看:
① 數組必需事前定義固定的長度(元素個數),不能順應數據靜態地增減的狀況。當數據添加時,能夠超出原先定義的元素個數;當數據增加時,形成內存糜費;數組可以依據下標直接存取。
② 鏈表靜態地停止存儲分配,可以順應數據靜態地增減的狀況,且可以方便地拔出、刪除數據項。(數組中拔出、刪除數據項時,需求挪動其它數據項,十分繁瑣)鏈表必需依據next指針找到下一個元素。
從內存存儲來看:
①(靜態)數組從棧中分配空間,關於順序員方便疾速,但是自在度小。
②鏈表從堆中分配空間,自在度大但是請求管理比擬費事。
從下面的比擬可以看出,假如需求疾速訪問數據,很少或不拔出和刪除元素,就應該用數組;相反,假如需求常常拔出和刪除元素就需求用鏈表數據構造了。
7. ArrayList和LinkedList的區別
①ArrayList是完成了基於靜態數組的數據構造,LinkedList基於鏈表的數據構造。
②關於隨機訪問get和set,ArrayList覺得優於LinkedList,由於LinkedList要挪動指針。
③關於新增和刪除操作add和remove,LinedList比擬占優勢,由於ArrayList要挪動數據。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。