1. 程式人生 > >java面試題及部分答案整理

java面試題及部分答案整理

  1. 談談你對java體系的理解?“java是解釋執行”,這句話是正確的嗎?
    java底層有jvm(java虛擬機器)來相容不同的作業系統,java執行前會編譯成jvm可以識別的位元組碼我們常說的class檔案,然後由jvm來解釋執行。
  2. 請對比Exception和Error,執行時異常與一般異常有什麼區別?
    Error :表示由 JVM 所偵測到的無法預期的錯誤,由於這是屬於 JVM 層次的嚴重錯誤 ,導致 JVM 無法繼續執行,因此,這是不可捕捉到的,無法採取任何恢復的操作,頂多只能顯示錯誤資訊。(IOException,SqlException)
    Exception :表示可恢復的例外,這是可捕捉到的。(NullPointerException)
  3. 談談final,finally,finalize有什麼不同?
    final: 修飾變量表示為常量,修飾方法不能被子類重寫,修飾類不能被繼承。
    finally: 捕獲異常後始終會執行 finally中的程式碼塊。
    finalize: 釋放需要被回收的物件
  4. 強引用,軟引用,弱引用有什麼區別?具體使用場景是什麼?
    強引用:(最常用)
    String str = “abc”;
    list.add(str);
    當記憶體空 間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤
    軟引用:
    軟引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果軟引用所引用的物件被垃圾回收,JAVA虛擬機器就會把這個軟引用加入到與之關聯的引用佇列中。
    如果弱引用物件回收完之後,記憶體還是報警,繼續回收軟引用物件
    弱引用: WeakReference
    如果虛引用物件回收完之後,記憶體還是報警,繼續回收弱引用物件
    虛引用:
    虛擬機器的記憶體不夠使用,開始報警,這時候垃圾回收機制開始執行System.gc(); String s = “abc”;如果沒有物件回收了, 就回收沒虛引用的物件
  5. 理解java字串,String,StringBuffer,StringBuilder有什麼區別?
    可變性
      String類中使用字元陣列儲存字串,private final char value[],所以string物件是不可變的。
      StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元陣列儲存字串,char[]value,這兩種物件都是可變的。
    執行緒安全性
      StringBuffer對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的。StringBuilder並沒有對方法進行加同步鎖,所以是非執行緒安全的。
    效能
      每次對String 型別進行改變的時候,都會生成一個新的String物件,然後將指標指向新的String 物件。StringBuffer每次都會對StringBuffer物件本身進行操作,而不是生成新的物件並改變物件引用。相同情況下使用StirngBuilder 相比使用StringBuffer 僅能獲得10%~15% 左右的效能提升,但卻要冒多執行緒不安全的風險。
    對於三者使用的總結:
    如果要操作少量的資料用 = String
    單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder
    多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer
  6. 談談java反射機制,動態代理是基於什麼原理?
    代理模式是一種常用的設計模式,其目的就是為其他物件提供一個代理以控制對某個真實物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理
    動態代理詳解連結
  7. int和Integer有什麼區別?Integer值的快取範圍是什麼?
    (1)Integer是int的包裝類;int是基本資料型別;
    (2)Integer變數必須例項化後才能使用;int變數不需要;
    (3)Integer實際是物件的引用,指向此new的Integer物件;int是直接儲存資料值 ;
    (4)Integer的預設值是null;int的預設值是0。
    Integer值的快取範圍是:-128-127
    JVM會自動維護八種基本型別的常量池,int常量池中初始化-128~127的範圍,所以當為Integer i=127時,在自動裝箱過程中是取自常量池中的數值,而當Integer i=128時,128不在常量池範圍內,所以在自動裝箱過程中需new 128,所以地址不一樣。
    a.當數值範圍為-128~127時:如果兩個new出來Integer物件,即使值相同,通過“==”比較結果為false,但兩個物件直接賦值,則通過“==”比較結果為“true,這一點與String非常相似。
    b.當數值不在-128~127時,無論通過哪種方式,即使兩個物件的值相等,通過“==”比較,其結果為false;
    c.當一個Integer物件直接與一個int基本資料型別通過“==”比較,其結果與第一點相同;
    d.Integer物件的hash值為數值本身;
  8. 對比Vector,ArrayList,LinkedList有何區別?
    vector執行緒同步。
    ArrayList 底層為線性表,執行緒非同步。獲取資料很方便,插入刪除,比較耗效能。
    LinkedList 底層為連結串列所以獲取資料效能較差,刪除,插入資料方便。
    集合面試指南
  9. 對比Hashtable,HashMap,TreeMap,談談你對HashMap的掌握?
    答案同上連結
  10. 如何保證集合是執行緒安全的?ConcurrentHashMap做了什麼?
    答案同上連結
  11. java NIO提供了哪些IO方式?看過NIO的原始碼嗎?如果讓你來改進NIO,會做什麼改進?
  12. 面向物件中的抽象類,介面的區別是什麼?
    1.介面的方法預設是public,所有方法在介面中不能有實現,抽象類可以有非抽象的方法
    2.介面中的例項變數預設是final型別的,而抽象類中則不一定
    3.一個類可以實現多個介面,但最多隻能實現一個抽象類
    4.一個類實現介面的話要實現介面的所有方法,而抽象類不一定
    5.介面不能用new例項化,但可以宣告,但是必須引用一個實現該介面的物件
    從設計層面來說,抽象是對類的抽象,是一種模板設計,介面是行為的抽象,是一種行為的規範。
  13. 說說你知道的設計模式?請動手實現單例模式,Spring,Mybatis使用了哪些設計模式?
    單例模式整合連結
  14. 理解java的鎖實現,Synchronized和ReentrantLock有什麼區別?有人說Synchronized最慢,這句話靠譜嗎?
  15. 一個執行緒連著呼叫start()兩次會出現什麼情況?談談執行緒的生命週期和狀態轉移。
  16. 什麼情況下java程式會產生死鎖?如何排除?
  17. java併發包提供了哪些併發類?使用這些資料結構解決過什麼併發問題?
  18. AtomicInteger底層實現原理是什麼?如何在自己的產品程式碼中應用CAS操作?
  19. java併發類庫提供的執行緒池有哪幾種?如何選擇?
  20. 什麼是類載入過程,雙親委派模型?
  21. 談談jvm記憶體區域劃分,如何監控和診斷jvm堆內和堆外記憶體使用?COM常見排查思路有哪些?
  22. GC收集器有哪些?常見的調優方法有哪些?
  23. 談談java記憶體模型(JMM),原子性,可見性,有序性是什麼?volatile的理解。
    記住jmm記憶體模型很容易理解
    答案分析連結
  24. AOP是什麼解決了什麼問題?
    切面程式設計可以將公共程式碼提取出來,減少業務程式碼侵入比如許可權校驗,日誌處理等。
    幾個比較重要的詞彙:
    Joinpoint(連線點): 類裡面可以被增強的方法,這些方法稱為連線點

Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義.

Advice(通知/增強):所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

Aspect(切面): 是切入點和通知(引介)的結合

Introduction(引介):引介是一種特殊的通知在不修改類程式碼的前提下, Introduction可以在執行期為類動態地新增一些方法或Field.
Target(目標物件):代理的目標物件(要增強的類)

Weaving(織入):是把增強應用到目標的過程.

把advice 應用到 target的過程

Proxy(代理):一個類被AOP織入增強後,就產生一個結果代理類