面試知識點總結

1、基礎

一、面向對象的特徵?java

面向對象的三個基本特徵是:封裝、繼承、多態。web

  • 封裝: 也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。
  • 繼承: 面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。
  • 多態: 同一行爲,經過不一樣的事物,能夠體現出來的不一樣的形態;使用多態的前提:1. 存在繼承或者實現關係;2. 子類或實現類必須重寫父類方法;3. 父類引用指向子類對象

二、抽象類和接口有什麼區別?spring

1)語法層面的區別:數據庫

  • 抽象類能夠提供成員方法的實現細節,而接口中只能存在public abstract 方法;
  • 抽象類中的成員變量能夠是各類類型的,而接口中的成員變量只能是public static final類型的;
  • 接口中不能含有靜態代碼塊以及靜態方法,而抽象類能夠有靜態代碼塊和靜態方法;
  • 一個類只能繼承一個抽象類,而一個類卻能夠實現多個接口。

2)設計層面的區別:編程

  • 抽象類是對一種事物的抽象,即對類抽象,而接口是對行爲的抽象。

三、說說反射的用途及實現?設計模式

  • 概念: 在運行狀態中,對於任意一個實體類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
  • 主要用途: 各種通用框架的功能實現上。
  • 實現: 經過 getClass();經過 Class.forName();使用類.class 類加載器實現,getClassLoader()

四、說說自定義註解的場景及實現數組

  • 概述: 註解其實就是代碼裏的特殊標記,它能夠用於替代配置文件,
  • 使用場景: 類屬性自動賦值;代替配置文件功能,像spring基於註解的配置;類屬性的校驗
  • 實現: java中有四種元註解:@Retention、@Inherited、@Documented、@Target
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@interface MyAnno{
    public String name() default "zhangsan";
    public String email() default "hello@example.com";
}
複製代碼
class  User{

    @MyAnno(name = "zhang")
    private String name;

    @MyAnno(name = "zhang@example.com")
    private String email;


    @MyAnno(name = "sayHelloWorld")
    public String sayHello(){
        return "";
    }
}
複製代碼

五、HTTP 請求的 GET 與 POST 方式的區別?瀏覽器

mp.weixin.qq.com/s?__biz=MzI…安全

六、session 與 cookie 區別?bash

  • COOKIE: 在網站中,http請求是無狀態的。也就是說即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據就能判斷當前用戶是哪一個了。cookie存儲的數據量有限,不一樣的瀏覽器有不一樣的存儲大小,但通常不超過4KB。所以使用cookie只能存儲一些小量的數據。

  • SESSION: session和cookie的做用有點相似,都是爲了存儲用戶相關的信息。不一樣的是,cookie是存儲在本地瀏覽器,而session存儲在服務器。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有必定的弊端,就是會佔用服務器的資源,但如今服務器已經發展至今,一些session信息仍是綽綽有餘的。

  • COOKIE和SESSION結合使用: 存儲在服務端:經過cookie存儲一個session_id,而後具體的數據則是保存在session中。若是用戶已經登陸,則服務器會在cookie中保存一個session_id,下次再次請求的時候,會把該session_id攜帶上來,服務器根據session_id在session庫中獲取用戶的session數據。就能知道該用戶究竟是誰,以及以前保存的一些狀態信息。

7. http與https的區別?

  • 主要區別:

    1)http是無狀態的超文本傳輸協議,是明文傳輸的;而https至關因而http協議+ssl/tls協議。他是經過證書認證的安全加密密文傳輸協議。

    2)兩種協議的的鏈接方式是徹底不一樣的,端口號也不一樣;http端口號是80;https是443.

  • 客戶端使用https方式與web服務器通訊時的步驟:

    1)客戶端使用https的url訪問web服務器;要求與web服務器之間創建ssl通道。

    2)web服務器收到請求後,會向客戶端發送一份網站證書(攜帶加密公鑰)。

    3)客戶端與web服務器協商ssl/tls加密等級。

    4)客戶端根據協商的加密等級,創建會話祕鑰,而後經過網站的公鑰對 密鑰進行加密,並傳輸給web服務器。

    5)web服務器根據手中的私鑰解析出會話密鑰。

    6)web服務器利用密鑰和客戶端通訊。

八、單例模式?

// 懶漢模式
public class Singleton{
    private Singleton () {}
    // 注意:須要關鍵字volatile修飾
    private volatile static Singleton singleton;
    // 注意:使用雙重檢驗鎖驗證
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized(Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }   
        
        return singleton;
    }
}
複製代碼
// 餓漢模式
public class Singleton{
    private Singleton (){}
    private static Singleton singleton = new Singleton();
    
    public static Singleton getInstance(){
        return singleton;
    }
}
複製代碼
// 兼顧懶漢和餓漢模式(使用內部類的形式,線程安全,還實現了懶加載)
public class Singleton(){
    private Singleton () {}
    private static class SingletonHolder{
        private static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance(){
        return SingleHolder.instance;
    }
}
複製代碼

九、volatile 修飾符的有過什麼實踐?

實踐一: volatile 修飾 64位的long 和 double 變量,使其能原子性的進行讀寫操做。由於這兩種類型的操做是分爲2部分的,第一次讀取一個32位的,而後再讀取剩下的32位的,這個過程並非原子性的。加上volatile關鍵字能夠實現原子性操做(加鎖)。

實踐二:volatile修飾符經過設置內存屏障,實現變量的可見性。

十、快速排序

public class SuperClass {

    public static void main(String[] args) {
        int [] arr = {11, 4, 30, 2, -1, 9, 6, 7, 99, 77};
        SuperClass superClass = new SuperClass();
        superClass.sort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 遞歸排序
     * @param arry
     */
    public void sort(int [] arry, int low, int high){
        int pos = 0;
        if (low < high){
            pos = findPos(arry, low, high);
            this.sort(arry, low, pos - 1);
            this.sort(arry, pos + 1, high);
        }
    }

    /**
     * 尋找臨界點
     * @param arr
     * @param low
     * @param high
     * @return
     */
    public int findPos(int [] arr, int low, int high){
        int val = arr[low];
        while (low < high){
            while (low < high && val <= arr[high]){
                high--;
            }
            arr[low] = arr[high];
            while (low < high && val >= arr[low]){
                low++;
            }
            arr[high] = arr[low];
        }
        // 找到第一個值,將第一個值做爲臨界點,將數組一分爲二
        arr[low] = val;
        return low;
    }
}
複製代碼

十一、說一下本身對 IOC 、AOP 的理解?

  • IOC(控制反轉),它和DI(依賴注入)實際上是兩個角度對同一件事的解釋,能夠簡單理解爲DI去實現ioc。控制反轉其實就至關是把獲取對象的控制反轉過來,將對象的建立和獲取交給ioc容器去完成。對象中只是被動的去接受依賴對象。獲取依賴對象的過程反轉了。
  • AOP(面向切面編程):是一種編程思想,經過分離橫切關注點來加強模塊性,在不改變現有代碼的狀況下,實現對功能的加強,動態的將代碼切入到指定的方法的編程思想。
事務管理、日誌的統一處理、權限的校驗、異常的處理都是能夠經過aop來進行統一處理。
複製代碼

十二、Spring 中用到了那些設計模式,講一下本身對於這些設計模式的理解?

  • 一、簡單工廠模式
  • 二、工廠模式
  • 三、單例模式
  • 四、適配器模式
  • 五、包裝器模式
  • 六、代理模式
  • 七、觀察者模式
  • 八、策略模式
  • 九、模版方法模式

1三、Spring Bean 的做用域和生命週期瞭解嗎?

  • 5種做用域:singleton、prototype、request、session、application做用域。

  • 生命週期:

-> 定義

-> 初始化(實現接口或配置init-method)

-> 使用

-> 銷燬(實現接口或配置destory-method)

1四、事務的特性?

事務:是指邏輯上的一組操做,這組操做不能被分割,要麼成功,要麼失敗。 四大特性:

  • 原子性:事務不能被分割,要麼所有執行,要麼所有不執行。
  • 一致性:事務執行先後,數據的必須保持完整性。
  • 隔離性:多個用戶在執行數據庫操做時,多個用戶的事務執行,之間是不能有任何干擾的。
  • 持久性:一個事務被提交以後,對數據庫的改變就是持久的。就算是數據庫發生故障,也不該該對其有任何影響。

1五、Spring 事務中的隔離級別?

如不考慮事務的隔離級別,則會引發髒讀、幻讀、不可重複讀。

  • 髒讀: 一個事務讀取了另外一個事務的還未提交的數據,一旦該事務回滾,則讀取的數據就無效。
  • 幻讀: 一個事務讀取了幾行記錄以後,另外一個事務插入了幾行數據,這時候幻讀就發生了,在以後的查詢中就會發現,有些記錄不是第一個事務插入的。
  • 不可重複讀: 在同一個事務中,由於是屢次讀取,有可能前一個讀取和後一個讀取的數據,由於另外一個事務的更新產生不一致的狀況。

1六、Spring 事務中的事務傳播行爲?

事務的傳播行爲:業務層方法之間的相互調用,事務的傳遞狀況。

2、進階

3、項目經驗

相關文章
相關標籤/搜索