1. 程式人生 > 其它 >面試覆盤

面試覆盤

5/28 面試覆盤

  1. Spring Boot 基礎註解 @springbootapplication 怎麼實現的

    springbootapplication 組合了@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan,

    @SpringBootConfiguration表明這個類是一個配置類,pring容器會在這裡尋找bean配置初始化的引數

    @EnableAutoConfiguration則表示讓Spring Boot根據類路徑中的jar包依賴為當前專案進行自動配置,自動配置

    @ComponentScan的可以配置註解掃描的包

    ompentscan註解就是之前ssm註解配置的<context:sacn />標籤

    springbootconfiguration註解,其實可以說就是spring宣告配置類的configuration註解

  2. Equals 和 == 的區別

    ==比較符比較的是其引用地址,使用equals大都是比較的其內容

    equals 比較流程

    • 是否同一物件

      • 是否是一個字串型別的物件

      • 比較長度

      • 拆分成char陣列

      • 比較char

  3. 如何實現使用者名稱的註冊和等錄

    加鹽 md5加密 存放鹽和加密結論 取鹽 加密傳輸後對比資料庫結論

  4. mvc的流程

    MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB元件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的元件實現。這些元件可以進行互動和重用。

    1.使用者傳送請求至前端控制器DispatcherServlet 2.DispatcherServlet收到請求呼叫處理器對映器HandlerMapping 3.處理器對映器根據請求url找到具體的處理器,生成處理器執行鏈HandlerExecutionChain(包括處理器物件和處理器攔截器)一併返回給DispatcherServlet。 4.DispatcherServlet根據處理器Handler獲取處理器介面卡HandlerAdapter執行HandlerAdapter處理一系列的操作,如:引數封裝,資料格式轉換,資料驗證等操作 5.執行處理器Handler(Controller,也叫頁面控制器)。 6.Handler執行完成返回ModelAndView 7.HandlerAdapter將Handler執行結果ModelAndView返回到DispatcherServlet 8.DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器 9.ViewReslover解析後返回具體View 10.DispatcherServlet對View進行渲染檢視(即將模型資料model填充至檢視中)。 11.DispatcherServlet響應使用者。

  5. Service層用什麼註解,

    2、資料庫表格對應的實體類及json封裝的實體類的搭建(entities) 3、資料互動層的搭建(Dao)@Data@Mapper 4、業務邏輯層的搭建(service)@Service 5、表現層的搭建(controller)@Controller @RestController

  6. 執行緒池的建立

    newCachedThreadPool建立可快取執行緒池、

    newFixedThreadPool建立定長執行緒池、

    newScheduledThreadPool建立定長執行緒池、

    newSingleThreadExecutor建立單執行緒化執行緒池。

  7. hashmap 和linkedhashmap 的區別

    hash值做下表 查詢快 插入相對慢一些

    linkedhashmap 有序 插入快

  8. 第三方工具

    阿帕奇的comment 包

    hutool 用於日期 bean管理 等等 MD5加密

  9. 反射的實現

    classforname()

    .getClass().getClassLoader()獲取ClassLoader物件,然後通過.getClass().getInterfaces()獲取它實現的所有介面,

  10. IOC AOP

    依賴注入 配置檔案寫bean autowired自動載入

    • Aspect(切面): Aspect 宣告類似於 Java 中的類宣告,在 Aspect 中會包含著一些 Pointcut 以及相應的 Advice。

    • Joint point(連線點):表示在程式中明確定義的點,典型的包括方法呼叫,對類成員的訪問以及異常處理程式塊的執行等等,它自身還可以巢狀其它 joint point。

    • Pointcut(切點):表示一組 joint point,這些 joint point 或是通過邏輯關係組合起來,或是通過通配、正則表示式等方式集中起來,它定義了相應的 Advice 將要發生的地方。

    • Advice(增強):Advice 定義了在 Pointcut 裡面定義的程式點具體要做的操作,它通過 before、after 和 around 來區別是在每個 joint point 之前、之後還是代替執行的程式碼。

    • Target(目標物件):織入 Advice 的目標物件.。

    • Weaving(織入):將 Aspect 和其他物件連線起來, 並建立 Adviced object 的過程

  11. 單例模式 懶漢和餓漢

    單例模式是一種常用的軟體設計模式,其定義是

    單例物件的類只能允許一個例項存在。

    許多時候整個系統只需要擁有一個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

    單例的實現主要是通過以下兩個步驟

    1. 將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;

    2. 在該類內提供一個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

    懶漢模式:

    優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。

    缺點:在類裝載的時候就完成例項化,沒有達到Lazy Loading的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。

    餓漢模式:

    延遲載入,即只有在真正使用的時候才會例項化一個物件並交給自己的引用。

    這種寫法起到了Lazy Loading的效果,但是隻能在單執行緒下使用。如果在多執行緒下,一個執行緒進入了if (singleton == null)判斷語句塊,還未來得及往下執行,另一個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式。

  12. 分表主鍵區分問題

    uuid 號段模式 雪花演算法:時間戳+工作機器+序列號 Leaf

  13. 設計模式

  14. linux命令

    ps 檢視系統程序執行緒

    pstree 檢視系統程序樹

    top 檢視系統程序執行緒執行情況

    tail 命令可用於檢視檔案的內容

    free 檢視記憶體及使用情況

    pwd(英文全拼:print work directory) 命令用於顯示工作目錄。

    cat 檢視配置檔案,或者是日誌檔案

    sort 對標準內容做排序

    df 檢視磁碟大小和佔用情況

    find 查詢檔案

    ping

    telnet

    nc netcat,可以用來看遠端某個埠是否開啟

    netstat 檢視本機的網路狀態

    curl 發起一個http請求,我一般都是用這個命令來驗證服務是否能正常訪問的

    dig 檢視域名的資訊

    yum|apt install

    wget

  15. 動態代理和靜態代

代理:給其他物件提供一個代理以控制對某個物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理。

靜態:由程式設計師建立代理類或特定工具自動生成原始碼再對其編譯。在程式執行前代理類的.class檔案就已經存在了。程式碼重複、加一個處理就要新增一個程式碼。靜態代理類只能為特定的介面(Service)服務。如想要為多個介面服務則需要建立很多個代理類。

動態:在程式執行時運用反射機制動態建立而成。AOP的實現

我們通過.getClass().getClassLoader()獲取ClassLoader物件,然後通過.getClass().getInterfaces()獲取它實現的所有介面,然後將targetObject包裝到實現了InvocationHandler介面的LogHandler物件中。通過newProxyInstance函式我們就獲得了一個動態代理物件。

我們可以通過LogHandler代理不同型別的物件,如果我們把對外的介面都通過動態代理來實現,那麼所有的函式呼叫最終都會經過invoke函式的轉發,因此我們就可以在這裡做一些自己想做的操作,比如日誌系統、事務、攔截器、許可權控制等。這也就是AOP(面向切面程式設計)的基本原理。

最大的好處是介面中宣告的所有方法都被轉移到呼叫處理器一個集中的方法中處理(InvocationHandler.invoke)。這樣,在介面方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態代理那樣每一個方法進行中轉。而且動態代理的應用使我們的類職責更加單一,複用性更強