【前言】別人都在你看不到的地方暗自努力,在你看獲得的地方,他們也和你同樣顯得不務正業,和你同樣會抱怨,而只有你本身相信這些都是真的,最後,也只有你一我的繼續不思進取 …… java
【下載】本人剛學習Java時總結的一些JavaSE常見面試題,偶爾在電腦中翻出,從新整理一下分享給須要的人,主要針對初級程序員。想要PDF完整版下載的,評論裏留言留下你的郵箱!程序員
41..比較一下Java和JavaSciprt?面試
答:其實Java和JavaScript最重要的區別是一個是靜態語言,一個是動態語言:算法
(1)基於對象和麪向對象:Java是一種真正的面向對象的語言,即便是開發簡單的程序,必須設計對象;JavaScript是種腳本語言,它能夠用來製做與網絡無關的,與用戶交互做用的複雜軟件。它是一種基於對象(Object-Based)和事件驅動(Event-Driven)的編程語言,於是它自己提供了很是豐富的內部對象供設計人員使用。數據庫
(2)解釋和編譯:Java的源代碼在執行以前,必須通過編譯。JavaScript是一種解釋性編程語言,其源代碼不需通過編譯,由瀏覽器解釋執行。(目前的瀏覽器幾乎都使用了JIT(即時編譯)技術來提高JavaScript的運行效率)編程
(3)強類型變量和類型弱變量:Java採用強類型變量檢查,即全部變量在編譯以前必須做聲明;JavaScript中變量是弱類型的,甚至在使用變量前能夠不做聲明,JavaScript的解釋器在運行時檢查推斷其數據類型。數組
(4)代碼格式不同。瀏覽器
42.Error和Exception有什麼區別?安全
答:①Error表示系統級的錯誤和程序沒必要處理的異常,是恢復不是不可能但很困難的狀況下的一種嚴重問題;好比內存溢出,不可能期望程序能處理這樣的狀況;網絡
②Exception表示須要捕捉或者須要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示若是程序運行正常,從不會發生的狀況。
43.try{}裏有一個return語句,那麼緊跟在這個try後的finally{}裏的代碼會不會被執行,何時被執行,在return前仍是後?
答:會執行,在方法返回調用者前執行。
44.throw和throws的區別、及處理方式?
答:(1)throw:用於拋出異常對象,後面跟的是異常對象;throw用在方法體內;
(2)throws:用於拋出異常類,後面跟的是異常類名,能夠跟多個,用逗號隔開。throws用在方法上
(3)異常處理方式:拋出throws、捕捉try - catch - finally。
(4)何時定義try,何時定義throws?
①功能內部若是出現異常,若是能夠處理,就用try;
②若是內部處理不了,就必須聲明出來,讓調用者處理。
45.編譯時異常和運行時異常的區別?
答:(1)編譯時異常在函數內被拋出,函數必須聲明,不然編譯失敗。
聲明的緣由:是須要調用者對該異常進行處理。必須進行處理,不然沒法編譯經過;(throws)
(2)運行時異常若是在函數內被拋出,在函數上不須要聲明。
不聲明的緣由:不須要調用者處理,運行時異常發生,已經沒法再讓程序繼續運行,因此,不讓調用處理的,直接讓程序中止,由調用者對代碼進行修正。(throw)
46.List、Set、Map是否繼承自Collection接口?
答:List、Set是,Map不是。Map是鍵值對映射容器,與List和Set有明顯的區別,而Set存儲的零散的元素且不容許有重複元素(數學中的集合也是如此),List是線性結構的容器,適用於按數值索引訪問元素的情形。
47.闡述ArrayList、Vector、LinkedList的存儲性能和特性?
答:(1)ArrayList:
①ArrayList底層是經過數組實現的,與LinkedList相比,查詢快,增刪慢;
②ArrayList的起始容量是10.當數組須要增加時,新的容量按以下公式得到:新容量=(舊容量*3)/2+1,也就是說每一次容量大概會增加50%。
(2)Vector:
①Vector:底層也是經過數組實現的,與ArrayList相比,它是同步的,線程安全的;通常狀況下:ArrayList適用於單線程,Vector適用於多線程。
②Vector的容量增加與「增加係數有關」,若指定了「增加係數」,且「增加係數有效(即,大於0)」;那麼,每次容量不足時,「新的容量」=「原始容量+增加係數」。若增加係數無效(即,小於/等於0),則「新的容量」=「原始容量x 2」。
(3)LinkedList:
①LinkedList底層是經過鏈表實現的,與ArrayList相比,查詢慢,增刪快;
②LinkedList在添加新元素時,先是在雙向鏈表中找到要插入節點的位置index;找到以後,再插入一個新節點。同時,雙向鏈表查找index位置的節點時,有一個加速動做:若index < 雙向鏈表長度的1/2,則從前向後查找;不然,從後向前查找。
48.簡述集合架構體系?
49.Collection和Collections的區別?
答:Collection是一個接口,它是Set、List等容器的父接口;Collections是個一個工具類,提供了一系列的靜態方法來輔助容器操做,這些方法包括對容器的搜索、排序、線程安全化等等。
50.List、Map、Set三個接口存取元素時,各有什麼特色?
答:(1)List以特定索引來存取元素,能夠有重複元素。Set不能存放重複元素(用對象的equals()方法來區分元素是否重複)。
(2)Map保存鍵值對(key-value pair)映射,映射關係能夠是一對一或多對一。
(3)Set和Map容器都有基於哈希存儲和排序樹的兩種實現版本,基於哈希存儲的版本理論存取時間複雜度爲O(1),而基於排序樹版本的實如今插入或刪除元素時會按照元素或元素的鍵(key)構成排序樹從而達到排序和去重的效果。
51.TreeMap和TreeSet在排序時如何比較元素?Collections工具類中的sort()方法如何比較元素?
答:(1)TreeSet要求存放的對象所屬的類必須實現Comparable接口,該接口提供了比較元素的compareTo()方法,當插入元素時會回調該方法比較元素的大小。
(2)TreeMap要求存放的鍵值對映射的鍵必須實現Comparable接口從而根據鍵對元素進行排序。
(3)Collections工具類的sort方法有兩種重載的形式,第一種要求傳入的待排序容器中存放的對象比較實現Comparable接口以實現元素的比較;第二種不強制性的要求容器中的元素必須可比較,可是要求傳入第二個參數,參數是Comparator接口的子類型(須要重寫compare方法實現元素的比較),至關於一個臨時定義的排序規則,其實就是經過接口注入比較元素大小的算法,也是對回調模式的應用(Java中對函數式編程的支持)。
5二、Thread類的wait( )和sleep( )的區別?
答:(1)所在類不一樣:wait( )是Object類中的方法;sleep( )是Tread類中的方法;
(2)slepp( )沒有釋放同步鎖,而wait( )釋放了同步鎖;
(3)slepp( )必須制定時間,而wait( )不用;
(4)slepp( )能夠在任何地方使用,而wait( )、notify( )、notifyAll( )只能在同步方法或同步代碼塊中使用;
(5)slepp( )必須捕獲異常,而wait( )、notify( )、notifyAll( )不用;
53.線程的sleep()方法和yield()方法有什麼區別?
答:① sleep()方法給其餘線程運行機會時不考慮線程的優先級,所以會給低優先級的線程以運行的機會;yield()方法只會給相同優先級或更高優先級的線程以運行的機會;
② 線程執行sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入就緒(ready)狀態;
③ sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常;
④ sleep()方法比yield()方法(跟操做系統CPU調度相關)具備更好的可移植性。
54.當一個線程進入一個對象的synchronized方法A以後,其它線程是否可進入此對象的synchronized方法B?
答:不能。其它線程只能訪問該對象的非同步方法,同步方法則不能進入。由於非靜態方法上的synchronized修飾符要求執行方法時要得到對象的鎖,若是已經進入A方法說明對象鎖已經被取走,那麼試圖進入B方法的線程就只能在等鎖池(注意不是等待池哦)中等待對象的鎖。
55.簡述線程的五種狀態?
答:(1)新建(new):當一個線程處於新建狀態時,它僅僅是一個空的線程對象,系統不爲它分配資源。Tread t = new Tread(new Runner());
(2)就緒(Runable):此時線程處在隨時能夠運行的狀態,在隨後的任意時刻,均可能進入運行狀態。t.star( );
(3)運行(Running):處於這個狀態的線程佔用CPU,執行程序代碼。
(4)阻塞(Blocked):阻塞狀態是指線程由於某些緣由放棄CPU,暫時中止運行,直到線程從新進入就緒狀態。wait、sleep、同步鎖被佔用;
(5)死亡(Dead):當線程退出run()方法時,就進入死亡狀態,該線程生命週期結束。可能正常執行完run()方法退出,也多是遇到異常。
56.建立多線程的兩種方式期區別?
答:(1)第一種方式:繼承Thread類,由子類重寫run方法。步驟以下:
①定義類繼承Thread類;
②目的是重寫run方法,將要執行的代碼都存儲到run方法中;
③經過建立Thread類的子類對象,建立線程對象;
④調用線程的start方法,開啓線程,並執行run方法。
(2)第二種方式:實現Runnable接口。步驟以下:
①定義類實現Runnable接口。
②覆蓋接口中的run方法(用於封裝線程要運行的代碼)。
③經過Thread類建立線程對象;
④將實現了Runnable接口的子類對象做爲實際參數傳遞給Thread類中的構造函數。
⑤調用Thread對象的start方法。開啓線程,並運行Runnable接口子類中的run方法。
(3)區別:
①繼承Thread :
好處:能夠直接使用Tread類中的方法,代碼簡單;
弊端:若是該類已有父類,就不能用這種方法了;
②實現Runnable接口:
好處:能夠避免單繼承的侷限性,即便本身的線程類有父類也不要緊;
弊端:不能直接使用Tread類中的方法,要先獲取線程對象,代碼複雜。
57.synchronized關鍵字的用法?
答:synchronized關鍵字能夠將對象或者方法標記爲同步,以實現對對象和方法的互斥訪問,能夠用synchronized(對象) { … }定義同步代碼塊,或者在聲明方法時將synchronized做爲方法的修飾符。在第60題的例子中已經展現了synchronized關鍵字的用法。
58.舉例說明同步和異步。
答:若是系統中存在臨界資源(資源數量少於競爭資源的線程數量的資源),例如正在寫的數據之後可能被另外一個線程讀到,或者正在讀的數據可能已經被另外一個線程寫過了,那麼這些數據就必須進行同步存取(數據庫操做中的排他鎖就是最好的例子)。當應用程序在對象上調用了一個須要花費很長時間來執行的方法,而且不但願讓程序等待方法的返回時,就應該使用異步編程,在不少狀況下采用異步途徑每每更有效率。事實上,所謂的同步就是指阻塞式操做,而異步就是非阻塞式操做。
59.啓動一個線程是調用run()仍是start()方法?
答:啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可運行狀態,這意味着它能夠由JVM調度並執行,這並不意味着線程就會當即運行。run()方法是線程啓動後要進行回調(callback)的方法。
60.什麼是線程池(thread pool)?
答:在面向對象編程中,建立和銷燬對象是很費時間的,由於建立一個對象要獲取內存資源或者其它更多資源。在Java中更是如此,虛擬機將試圖跟蹤每個對象,以便可以在對象銷燬後進行垃圾回收。因此提升服務程序效率的一個手段就是儘量減小建立和銷燬對象的次數,特別是一些很耗資源的對象建立和銷燬,這就是」池化資源」技術產生的緣由。線程池顧名思義就是事先建立若干個可執行的線程放入一個池(容器)中,須要的時候從池中獲取線程不用自行建立,使用完畢不須要銷燬線程而是放回池中,從而減小建立和銷燬線程對象的開銷。