1. 程式人生 > >Java面試通關祕籍(一)

Java面試通關祕籍(一)

1. 基礎篇

1.1 Java基礎

  • 面向物件的特徵:繼承、封裝和多型

    1.繼承: 多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那個類即可。

    好處:提高了程式碼的複用性。讓類與類之間產生了關係,提供了多型的前提。

    2.封裝: 隱藏物件的屬性和實現細節,僅對外提供公共訪問方式。

    好處:
    ①將變化隔離。
    ②便於使用。
    ③提高重用性。
    ④提高安全性。

    3.多型: 在同一個方法中,由於引數不同而導致執行效果各異的現象就是多型。
    前提條件:
    A:要有繼承關係。
    B:要有方法重寫。
    C:要有父類引用指向子類物件。

    小結:

    封裝即隱藏物件的屬性和實現細節,僅對外提供公共訪問方式,保證了模組具有較好的獨立性,使得程式維護修改較為容易。繼承提高了程式碼的複用性,多型提高程式碼的擴充套件性和可維護性。三者共同達到了一個目的:使得對應用程式的修改帶來的影響更加區域性化,程式更加健壯,而且易維護、更新和升級。

  • final, finally, finalize 的區別

    final:標識此變數為不可變,。對基本型別使用是不能改變的是他的數值。而對於物件引用,不能改變的是他的引用
    finally: 異常捕獲的一個程式碼塊,程式碼塊中的內容無論是否發生異常都會去執行,一般用來釋放資源
    finalize:垃圾回收機制,主要用來回收物件

  • Exception、Error、執行時異常與一般異常有何異同

    Throwable 是所有 Java 程式中錯誤處理的父類 ,有兩種子類: Error 和 Exception

    Error:屬於嚴重錯誤,JVM無法捕獲,也無法採取任何恢復手段。比如:記憶體溢位
    Exception :可以捕獲的,可以恢復程式正常執行
    執行時異常:執行時異常不要求我們必須捕獲,他是由虛擬機器接管,比如:空指標,除零異常
    一般異常:也即是checked exception,這種異常必須自己寫一大堆try catch塊去處理。比如:SQL異常,IO異常

  • 請寫出5種常見到的Runtime exception
    NullPointerException、ArrayIndexOutOfBoundsException 、ClassNotFoundException、ClassCastException、ArithmeticException(除零異常)、NegativeArraySizeException(當建立陣列時傳遞引數為負數)

  • int 和 Integer 有什麼區別,Integer的值快取範圍

    int為基本資料型別,Integer為int的包裝類,int預設值為0,而Integer預設值為null
    Integer快取範圍為 -128-127

    Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; 
    System.out.println(f1 == f2);  true
    System.out.println(f3 == f4);  false
  • 包裝類,裝箱和拆箱

    包裝類:一切皆物件,八種基本資料型別不是物件。把這八種基本資料型別包裝成每一個類,這樣每一個類就可以以物件的形式操作基本資料型別。

    裝箱:將基本資料型別變成包裝類稱為裝箱。

    拆箱:將包裝類的型別變為基本資料型別稱為拆箱。

  • String、StringBuilder、StringBuffer

    String類被final修飾,所以為不可變的,當字串拼接時他會重新建立一個新的物件,速度會很慢
    StringBuilder:執行緒不安全的,但是是最快的
    StringBuffer:執行緒安全的,速度僅此於StringBuilder

  • 過載和重寫的區別

    重寫方法的規則:(存在於子類與父類之間)
    1)引數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是過載。
    2)返回的型別必須一直與被重寫的方法的返回型別相同,否則不能稱其為重寫而是過載。
    3)訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
    4)重寫方法一定不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常。例如:
    父類的一個方法申明瞭一個檢查異常IOException,在重寫這個方法是就不能丟擲Exception,只能丟擲IOException的子類異常,可以丟擲非檢查異常。
    過載的規則:(存在於子類與父類之間、同類中)
    1)必須具有不同的引數列表;
    2)可以有不同的返回型別,只要引數列表不同就可以了;
    3)可以有不同的訪問修飾符;
    4)可以丟擲不同的異常;

  • 抽象類和介面有什麼區別

    1.抽象類可以有構造方法而介面不可以
    2.抽象中可以有普通方法,而介面中只能有抽象 方法
    3.抽象類中可以有普通變數,而介面中只能由常量
    4.抽象類中可以有靜態方法,而介面中不可以
    5.一個類可以實現多個介面,但只能繼承一個抽象類

  • 說說反射的用途及實現

    用途:它允許程式在執行時進行自我檢查,同時也允許對其內部成員進行操作。反射機制提供的功能主要有:得到一個物件所屬的類;獲取一個類的所有成員變數和方法;在執行時建立物件;在執行時呼叫物件的方法。
    實現: ①靜態代理 ②動態代理 ③ CGLB方法

  • 說說自定義註解的場景及實現

    場景:跟蹤程式碼的依賴性,實現代替配置檔案的功能
    實現: 使用@interface自定義註解,自動繼承了java.lang.annotation.Annotation介面,由編譯程式自動完成其他細節,在定義註解時,不能繼承其他註解或介面。

  • HTTP請求的GET與POST方式的區別

    1. Get請求會將引數顯示到位址列中,而POST請求不會
    2. GET後退按鈕/重新整理無害,POST資料會被重新提交
    3. GET能被快取,POST不能快取
    4. GET對資料長度有限制,當傳送資料時,GET 方法向 URL 新增資料;URL 的長度是受限制的
  • Session與Cookie區別

    cookie資料儲存在客戶端,session資料儲存在伺服器端。 詳情請點選這裡
    cookie一般用來儲存使用者的登入狀態,一些隱私資訊不能放到cookie中

  • 列出自己常用的JDK包

    java.lang、java.util、java.sql、java.math、java.io、java.net、java.text

  • MVC設計思想

    M:模型
    V:檢視
    C:控制
    點選檢視詳情

  • equals與==的區別
    ==

    比較的是變數(棧)記憶體中存放的物件的(堆)記憶體地址,用來判斷兩個物件的地址是否相同,即是否是指相同一個物件,如果是具體的阿拉伯數字的比較,值相等則為true

    equals

    用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷
    hashCode和equals方法的區別與聯絡

  • 什麼是Java序列化和反序列化,如何實現Java序列化?或者請解釋Serializable 介面的作用

    序列化:將java物件用二進位制表示出來,而且這個二進位制可以儲存到磁碟或進行網路傳輸而不會破壞其結構
    反序列化:將這個二進位制還原為java物件本身
    實現序列化:實現java.io.Serializable 介面
    Serializable 介面的作用:標識此物件可以被序列化

  • Object類中常見的方法,為什麼wait notify會放在Object裡邊?

    wait、hashCode、equals、toString、notify、clone、getClass

    簡單說:因為synchronized中的這把鎖可以是任意物件,所以任意物件都可以呼叫wait()和notify();所以wait和notify屬於Object。
    專業說:因為這些方法在操作同步執行緒時,都必須要標識它們操作執行緒的鎖,只有同一個鎖上的被等待執行緒,可以被同一個鎖上的notify喚醒,不可以對不同鎖中的執行緒進行喚醒。也就是說,等待和喚醒必須是同一個鎖。而鎖可以是任意物件,所以可以被任意物件呼叫的方法是定義在object類中。

  • JDK和JRE的區別

    JDK就是Java Development Kit.簡單的說JDK是面向開發人員使用的SDK,它提供了Java的開發環境和執行環境。SDK是Software Development Kit 一般指軟體開發包,可以包括函式庫、編譯程式等。
    JRE是Java Runtime Enviroment是指Java的執行環境,是面向Java程式的使用者,而不是開發者

    JDK = JRE + 開發工具

1.2 Java常見集合

  • List 和 Set 區別

    List底層使用陣列實現,可以重複,並且有序
    Set底層是用HashMap實現,無序且不可重複

  • Set和hashCode以及equals方法的聯絡

    Set集合為保證內部元素不重複,當呼叫add()方法時,先判斷此物件的hashCode是否在Set集合中已存在,如果不存在則直接新增進去,如果已存在則進一步判斷 equals 方法,判斷兩物件的值是否相同。

  • List 和 Map 區別

    List是單列集合,而Map是雙列集合,是通過鍵值對進行儲存

  • Arraylist 與 LinkedList 區別
    ArrayList :執行緒不安全,底層用陣列實現,按插入先後排序,隨機訪問快,插入與刪除慢。
    LinkedList :執行緒不安全的,底層基於連結串列的資料結構實現,訪問慢但插入元素與刪除元素比較快。LinkedList類實現了Queue介面,可當做佇列使用

  • ArrayList 與 Vector 區別
    ArrayList是執行緒不安全的,而Vector是執行緒安全的

  • HashMap 和 Hashtable 的區別

    HashMap是執行緒不安全的,他的鍵和值都可以為null
    Hashtable是執行緒安全的,他的鍵和值不可以為null

  • HashSet 和 HashMap 區別

    HashSet基礎AbstractSet 而 HashMap繼承 AbstractMap

  • HashMap 和 ConcurrentHashMap 的區別
    HashMap是執行緒不安全的,而ConcurrentHashMap是執行緒安全的,而且效率要大於Hashtable

  • HashMap和ArrayList的預設大小

    HashMap預設大小為 16 增量因子為 0.75
    ArrayList預設大小為 10 每次擴容為原來的1.5 倍

1.3 程序和執行緒

  • 執行緒和程序的概念、並行和併發的概念

執行緒:是程式執行流的最小單元,是系統獨立排程和分配CPU(獨立執行)的基本單位。

程序:是資源分配的基本單位。一個程序包括多個執行緒。

區別:
1.執行緒與資源分配無關,它屬於某一個程序,並與程序內的其他執行緒一起共享程序的資源。
2.每個程序都有自己一套獨立的資源(資料),供其內的所有執行緒共享。
3.不論是大小,開銷執行緒要更“輕量級”
4.一個程序內的執行緒通訊比程序之間的通訊更快速,有效。(因為共享變數)

併發:當有多個執行緒在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把CPU執行時間劃分成若干個時間段,再將時間 段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(Concurrent)。

並行:當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒時,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。

  • 建立執行緒的方式及實現

    實現Runnable介面、繼承Thead

程序間通訊的方式

說說 CountDownLatch、CyclicBarrier 原理和區別

說說 Semaphore 原理

說說 Exchanger 原理

ThreadLocal 原理分析,ThreadLocal為什麼會出現OOM,出現的深層次原理

講講執行緒池的實現原理

執行緒池的幾種實現方式

執行緒的生命週期,狀態是如何轉移的