Java面試——2021秋招面試問題

你使用過哪些設計模式,挑幾個重點講一講實現

1單例設計模式(餓漢式和懶漢式)

單例設計模式(餓漢模式)

public class Singleton {

    // 將自身實例化對象設置爲一個屬性,並用static、final修飾
    private static final Singleton instance = new Singleton();
    
    // 構造方法私有化
    private Singleton() {}
    
    // 靜態方法返回該實例
    public static Singleton getInstance() {
        return instance;
    }
}

單例設計模式要確保類在內存中只有一個對象,該對象例必須自動的創建,並對外提供。

優點:在系統中內存中已存在一個對象,因此可以節約系統資源,對於一些需要頻繁的創建和銷燬的對象的單例模式

缺點是:沒有抽象層,因此在在擴展上很難

單例設計模式的懶漢模式

public class Singleton {

    // 將自身實例化對象設置爲一個屬性,並用static修飾
    private static Singleton instance;
    
    // 構造方法私有化
    private Singleton() {}
    
    // 靜態方法返回該實例
    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

開發中: 餓漢式(線程安全) 面試中:在懶漢式(可能會出先線程安全的問題)

           懶加載(延遲加載)

           線程安全問題:

                  1 是否有多線程環境

                  2 是否有數據共享

                  3 是否有多條語句的工享數據

單例的設計模式應用(餓漢式的設計):

class RunTime {
    //餓漢式的設計
    private RunTime(){}
    private  static  RunTime currentRuntime=new RunTime();
    public static RunTime getCurrentRuntime(){
        return currentRuntime;
    }
}

2工廠模式(簡單工廠和抽象工廠)

簡單工廠模式(靜態工廠類):是一個具體的負責的創建的一個類。

3觀察者模式

MQ工作原理是的設計就是的觀者模式的

4適配器的模式

5裝飾器設計模式

雙重校驗鎖如何實現?(這裏我回答漏了voliate關鍵字)

Mybatis底層如何綁定參數?#{}和${}有什麼區別?

作用:實現創建一個接口後把mapper.xml由mybatis生成接口的實現類,通過調用接口對象就可以獲取 mapper.xml 中編寫的 sql.

實現步驟:編寫接口按照下圖規則

單點登陸如何實現的?

登入

什麼是單點登錄?單點登錄全稱Single Sign On(以下簡稱SSO),是指在多系統應用羣中登錄一個系統,便可在其他所有系統中得到授權而無需再次登錄,包括單點登錄與單點註銷兩部分。

相比於單系統登錄,sso需要一個獨立的認證中心,只有認證中心能接受用戶的用戶名密碼等安全信息,其他系統不提供登錄入口,只接受認證中心的間接授權。間接授權通過令牌實現,sso認證中心驗證用戶的用戶名密碼沒問題,創建授權令牌,在接下來的跳轉過程中,授權令牌作爲參數發送給各個子系統,子系統拿到令牌,即得到了授權,可以藉此創建局部會話,局部會話登錄方式與單系統的登錄方式相同。這個過程,也就是單點登錄的原理。

下面對上圖簡要描述

  1. 用戶訪問系統1的受保護資源,系統1發現用戶未登錄,跳轉至sso認證中心,並將自己的地址作爲參數
  2. sso認證中心發現用戶未登錄,將用戶引導至登錄頁面
  3. 用戶輸入用戶名密碼提交登錄申請
  4. sso認證中心校驗用戶信息,創建用戶與sso認證中心之間的會話,稱爲全局會話,同時創建授權令牌
  5. sso認證中心帶着令牌跳轉會最初的請求地址(系統1)
  6. 系統1拿到令牌,去sso認證中心校驗令牌是否有效
  7. sso認證中心校驗令牌,返回有效,註冊系統1
  8. 系統1使用該令牌創建與用戶的會話,稱爲局部會話,返回受保護資源
  9. 用戶訪問系統2的受保護資源
  10. 系統2發現用戶未登錄,跳轉至sso認證中心,並將自己的地址作爲參數
  11. sso認證中心發現用戶已登錄,跳轉回系統2的地址,並附上令牌
  12. 系統2拿到令牌,去sso認證中心校驗令牌是否有效
  13. sso認證中心校驗令牌,返回有效,註冊系統2
  14. 系統2使用該令牌創建與用戶的局部會話,返回受保護資源

  用戶登錄成功之後,會與sso認證中心及各個子系統建立會話,用戶與sso認證中心建立的會話稱爲全局會話,用戶與各個子系統建立的會話稱爲局部會話,局部會話建立之後,用戶訪問子系統受保護資源將不再通過sso認證中心,全局會話與局部會話有如下約束關係

  1. 局部會話存在,全局會話一定存在
  2. 全局會話存在,局部會話不一定存在
  3. 全局會話銷燬,局部會話必須銷燬

你可以通過博客園、百度、csdn、淘寶等網站的登錄過程加深對單點登錄的理解,注意觀察登錄過程中的跳轉url與參數。

註銷

單點登錄自然也要單點註銷,在一個子系統中註銷,所有子系統的會話都將被銷燬,用下面的圖來說明。

sso認證中心一直監聽全局會話的狀態,一旦全局會話銷燬,監聽器將通知所有註冊系統執行註銷操作。下面對上圖簡要說明

  1. 用戶向系統1發起註銷請求
  2. 系統1根據用戶與系統1建立的會話id拿到令牌,向sso認證中心發起註銷請求
  3. sso認證中心校驗令牌有效,銷燬全局會話,同時取出所有用此令牌註冊的系統地址
  4. sso認證中心向所有註冊系統發起註銷請求
  5. 各註冊系統接收sso認證中心的註銷請求,銷燬局部會話
  6. sso認證中心引導用戶至登錄頁面

springbean生命週期

實例化 Instantiation—》屬性賦值 Populate——》初始化 Initialization——》銷燬 Destruction

有幾種排序算法時間複雜度和空間複雜度分別是多少

1、http是否無狀態?如何有狀態?session和Cookies的區別。

http是一種的無狀態的。兩種用於保持HTTP狀態的技術就應運而生了,一個是 Cookie,而另一個則是 Session。

session:是一種將會話狀態保存在服務器端的技術。Cookie是一種在瀏覽器的技術。

Cookie :Web 服務器保存在用戶瀏覽器(客戶端)上的小文本文件,它可以包含有關用戶的信息。無論何時用戶鏈接到服務器,Web 站點都可以訪問 Cookie信息 。

存儲位置不同:session 存儲在服務器端;cookie 存儲在瀏覽器端。

安全性不同:cookie 安全性一般,在瀏覽器存儲,可以被僞造和修改。

容量和個數限制:cookie 有容量限制,每個站點下的 cookie 也有個數限制。

存儲的多樣性:session 可以存儲在 Redis 中、數據庫中、應用程序中;而 cookie只能存儲在瀏覽器中。

session 的工作原理是客戶端登錄完成之後,服務器會創建對應的 session,session 創建完之後,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務器時,都會帶sessionid,服務器拿到 sessionid 之後,在內存找到與之對應的 session 這樣就可以正常工作了。session 只是依賴cookie存儲 sessionid,如果cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保證 session 能正常使用。

2、http2.0特性?介紹一下http2.0。

1、完全採用二進制格式

2、多路複用:根據request的 id將request再歸屬到各自不同的服務端請求裏面,單個連接上同時進行多個業務單元數據的傳輸。

3、頭部壓縮

4、服務端推送

5、請求優先級

3、redis的數據結構。zset是什麼?如何實現的?

 

4、redis爲什麼快?內存+單線程。

 

5、如何設計分佈式鎖?利用redis的可重入鎖如何設計?

 

6、線程安全什麼意思?如何線程安全?

 

7、鎖的種類?公平鎖分公平鎖?redis分佈式鎖是否公平鎖?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章