這些Java面試題必須會-----魯迅

寫在前面

春天來了,萬物復甦的季節到了. 許多程序猿安奈不住生理需求,我要漲工資,我要跳槽. 畢竟金三銀四嘛. 那麼要從衆多的面試者中得到求職機會,咱們就要面對不少的面試題.java

程序猿是最煩面試題的.面試的公司也煩,面試的人也煩. 可是沒辦法.面試的人魚龍混雜,好多公司被理論啥都懂,代碼寫不出的人搞的就很傷.因此如今面試題也愈來愈難,愈來愈刁鑽.程序員

可是凡事都有雙面性,這樣就促使咱們看更多的面試題,掌握了更多的知識.不是嗎 !面試

先來點開胃的

1.訪問修飾符public,private,protected以及不寫時的區別?

訪問權限:
 修飾符       當前類     同包   子類    其餘包  
 public      √         √      √      √ 
 protected   √         √      √      × 
 default     √         √      ×      × 
 private     √         ×      ×      × 
 類的成員不寫訪問修飾符時,默認的是default.

2.Stirng是最基本的數據類型嗎?

答: 不是. 
  java中的基本數據類型就八種: byte, short, int, long, float, double, char,  
  boolean. 剩下的都是引用類型(reference type).

3.float f = 1.1; 正確嗎?

答: 不正確. 1.1是雙精度, 將雙精度賦值給浮點型,屬於向下轉型,會形成精度的丟失.若是要強制
 類型轉換,能夠寫成這樣 float f = (float)1.1; 或者 float f=1.1F;

4.short a = 1; a = a + 1 和 short a = 1 ; a += 1 有什麼區別?

答: 對於a = a + 1 由於1是int值類型,因此計算的結果是int,要賦值給short,須要強制類型裝
 換才能賦值給short.
     對於a += 1; 其至關於 a = (short)(a+1) ;其中已經作了強制類型裝換.

5.下面代碼打印結果?

Integer a = 100, b = 100, c = 130, d = 130 ; 
   System.out.println(a ==> b); 
   System.out.println(c == d);
   第一個是true,第二個是false. 
   由於a,b,c,d四個變量都是integer對象的引用,因此==比較的不是值,而是引用.若是整型字面
   量的值在-128到127之間,那麼不會new新的Integer對象,而是直接引用常量池中的Integer對
   象.

6.Java中如何跳出多重嵌套循環?

答:在最外層循環前加標記A,利用break A;能夠跳出循環

7.String類能夠被繼承嗎?

答:不能夠. 由於String類是final類.

8.String和StringBuilder,StringBuffer的區別?

答:String是隻讀字符串,String引用的字符串內容是不能被改變的.而StringBuffer和
 StringBuilder是可變字符串.StringBuilder和StringBuffer的用法相同, 區別是
 StringBuffer被synchronized修飾,效率比StringBuilder低

9.構造器是否能夠被重寫?

答: 構造器不能被繼承,所以不能被重寫,可是能夠被重載.

10.int a = 1; int b = 2; 怎麼讓a,b值交換?

答: a = a ^ b;
     b = a ^ b;
     a = a ^ b;

來點中級的

11.抽象類和接口的相同點和不一樣點.

答: 1.抽象類和接口都不能實例化對象,可是能夠定義抽象類和接口類型的引用. 
     2.繼承抽象類和實現接口都要對其中的抽象方法所有實現
     3.接口比抽象類更加抽象,抽象類中能夠定義構造器,能夠有抽象方法和具體方法.
     4.接口中方法所有都是抽象方法.
     5.抽象類中的成員能夠是private,protected,public,接口所有都是public
     6.抽象類中能夠定義成員變量,而接口中定義的成員變量實際上都是常量.
     7.有抽象方法的類必須聲明爲抽象類,而抽象類未必要有抽象方法.

12.java中會存在內存泄露嗎?

答:理論上java不會存在內存泄露的問題,應爲有垃圾回收機制(GC).然而在實際開發中,可能會存在
 無用但可達的對象,這些對象不能被GC回收,所以會致使內存泄露. 例如hibernated的Session中
 的對象屬於持久態,垃圾回收器不會回收這些對象,這些對象中有可能存在無用的垃圾對象.若是關閉
 不及時,一級緩存就可能致使內存泄露.

13.try{}裏面return, finally裏的代碼會不會執行,何時被執行?

答:會執行. 在方法返回給調用者前執行.由於若是存在finally代碼塊, try中的return語句不會
 立馬返回調用者,而是記錄下返回值待finally代碼塊執行完畢以後在返回.

14.List,Map,Set 三個接口存取元素時,各自有什麼特色?

答:List以特定的索引來存取元素,能夠有重複元素
    Set不能存放重複元素.
    Map保存鍵值對的映射,映射關係能夠是一對一或多對一.
    Set和Map容器都有基於哈希存儲和排序樹的兩種實現版本,基於哈希存儲理論存取時間複雜度是O(1).

15.Thread類中的sleep()和對象的wait()有什麼區別?

答:sleep()方法是線程類的靜態方法,調用此方法會讓當前線程暫停執行指定時間.將CPU時間片分
     給其餘線程,可是對象的鎖依然保持, 休眠時間結束會自動回覆到就緒狀態.
     wait()是Object類的方法,調用對象的wait()方法致使當前線程放棄對象的鎖,線程暫停執行,
     進入對象的等待池,只有調用對象的notify()方法或notifyAll()方法時,才能喚醒等待池中的
     線程進入等鎖池,若是線程從新得到對象的鎖就能夠進入就緒狀態

16.當一個線程進入一個對象的synchronized方法A以後,其它線程是否可進入此對象的synchronized方法B?

答::不能。其它線程只能訪問該對象的非同步方法,同步方法則不能進入。
 由於非靜態方法上的synchronized修飾符要求執行方法時要得到對象的鎖,若是已經進入A方法說
 明對象鎖已經被取走,那麼試圖進入B方法的線程就只能在等鎖池(注意不是等待池哦)中等待對象的鎖

17.說說synchronized關鍵字的用法?

答:synchronized關鍵字能夠將對象或者方法標記爲同步,以實現對對象和方法的互斥訪問,能夠用
 synchronized(對象) { … }定義同步代碼塊,或者在聲明方法時將synchronized做爲方法的修飾符

18.Java如何實現序列化,有什麼意義?

答:序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化
 後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。
 序列化是爲了解決對象流讀寫操做時可能引起的問題(若是不進行序列化可能會存在數據亂序的問題)
 要實現序列化,讓類實現Serializable接口.該接口是一個標識性接口,標註該類對象是可被序列
 化的,而後使用一個輸出流來構造一個對象輸出流並經過writeObject(Object)方法就能夠將實現對象寫出
 若是須要反序列化則能夠用一個輸入流創建對象輸入流,而後經過readObject方法從流中讀取對
 象。序列化除了可以實現對象的持久化以外,還可以用於對象的深度克隆

19.線程的sleep()方法和yield()方法有什麼區別?

答:sleep()方法給其餘線程運行機會時不考慮線程的優先級,所以會給低優先級的線程以運行的機會;
 yield()方法只會給相同優先級或更高優先級的線程以運行的機會; 
 線程執行sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入就緒(ready)狀態; 
 sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常;
 sleep()方法比yield()方法(跟操做系統CPU調度相關)具備更好的可移植性

20.說說你對同步和異步的理解.

答:若是系統中存在臨界資源(資源數量少於競爭資源的線程數量的資源),例如正在寫的數據之後
 可能被另外一個線程讀到,或者正在讀的數據可能已經被另外一個線程寫過了,那麼這些數據就必須進行
 同步存取(數據庫操做中的排他鎖就是最好的例子)
 當應用程序在對象上調用了一個須要花費很長時間來執行的方法,而且不但願讓程序等待方法的返回
 時,就應該使用異步編程,在不少狀況下采用異步途徑每每更有效率。事實上,所謂的同步就是指阻
 塞式操做,而異步就是非阻塞式操做。

好像這也不算高級

21.轉發(forward)和重定向(redirect)的區別?

答:forward是容器中控制權的轉向,是服務器請求資源,服務器直接訪問目標地址的URL,把那個
 URL 的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從
 哪兒來的,因此它的地址欄中仍是原來的地址
 redirect就是服務器端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,所以從瀏覽
 器的地址欄中能夠看到跳轉後的連接地址,很明顯redirect沒法訪問到服務器保護起來資源,可是
 能夠從一個網站redirect到其餘網站

22.說一說spring 中依賴注入和AOP的實現機制。

答:實現依賴注入的方式包括:構造器注入、設值注入和接口(回調)注入。Spring中能夠經過設值
 注入(setter方法注入)和構造器注入實現IoC,推薦使用的方式爲設值注入。
 實現AOP的方式包括:編譯時AOP(須要特殊的編譯器)、運行時AOP(代理模式)、加載時AOP(需
 要特殊的類加載器)。Spring中使用了運行時的AOP,主要經過代理的方式對原來的代碼進行加強實
 現。對於實現了接口的類,Spring經過Java的動態代理(請參考Proxy類和InvocationHandler
 接口)來進行加強;對於沒有實現接口的類,Spring使用第三方字節碼生成工具CGLIB,經過繼承
 的方式對原有代碼進行加強

23.什麼是ORM?

答:對象關係映射(Object-Relational Mapping,簡稱ORM)是一種爲了解決程序的面向對象
  模型與數據庫的關係模型互不匹配問題的技術;簡單的說,ORM是經過使用描述對象和數據庫之間映
  射的元數據(在Java中能夠用XML或者是註解),將程序中的對象自動持久化到關係數據庫中或者
  將關係數據庫表中的行轉換成Java對象,其本質上就是將數據從一種形式轉換到另一種形式。

24.簡述一下面向對象的"六原則一法則"

答: 單一職責原則:一個類只作它該作的事情。單一職責原則想表達的就是"高內聚"
 開閉原則:軟件實體應當對擴展開放,對修改關閉.要作到開閉有兩個要點:抽象是關鍵,一個系統
    中若是沒有抽象類或接口系統就沒有擴展點;
 封裝可變性,將系統中的各類可變因素封裝到一個繼承結構中,
 依賴倒轉原則: :面向接口編程,就是聲明方法的參數類型、方法的返回類型、變量的引用類型時,
 儘量使用抽象類型而不用具體類型,由於抽象類型能夠被它的任何一個子類型所替代
 里氏替換原則::任什麼時候候均可以用子類型替換掉父類型
 接口隔離原則:接口要小而專,毫不能大而全。接口也應該是高度內聚的.Java中的接口表明能力、
    表明約定、表明角色,可否正確的使用接口必定是編程水平高低的重要標識
 合成聚合複用原則:優先使用聚合或合成關係複用代碼

後記

對程序員來講,廣泛的是敲代碼和業務處理能力強於理論知識的.畢竟咱們是用鍵盤吃飯.可是,若是在一個行業作了五年以上.那麼這一個語言基本就寫透了.那麼在回頭看這些理論知識就so easy 了.程序員這個行業是與時進步的,要不斷的學習來充實本身,努力吧.spring

年輕人就要努力奮鬥-----------魯迅數據庫

相關文章
相關標籤/搜索