2018年3月20日15時00分到酷家樂赴約Java實習現場面試,進行了接近2小時,記錄如下:
面試(40MIN)
自我介紹
多線程實現
- 繼承Thread類創建線程
- 實現Callable接口創建線程
- 實現Runnable接口創建新線程
流量削峯的一種解決方案
- MQ推送模式改爲定時或者批量拉取模式
- 消息接收方實現批量處理等方式
介紹Redis
基於C語言開發的一種非關係型數據庫,數據放在內存,使用RDB[快照]方式或者AOF[日誌]方式持久化。
Redis的優勢包括速度、對富數據類型的支持(String、Hash、List、Set、Zset)、原子性操作、通用性。
Redis使用場景(回答得不好)
- 緩存(* 熱數據 *)
- 共享Session
- 隊列 / 棧
- 位操作(* 大數據處理 *)
- 分佈式鎖與單線程機制(* 秒殺系統 *)
- 排行榜 / 計數器(* ZSet ZADD命令 *)
- 發佈 / 訂閱
Redis如何保證原子性(不會)
- 單個操作是原子性的
- 多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來
介紹對MyBatis的理解
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集,它可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJO 映射成數據庫中的記錄。
SpringMVC的核心
- 控制器核心類:DispatcherServlet
- 加載配置文件核心類:ContextLoaderListener
- 處理url映射核心類:BeanNameUrlHandlerMapping
- 處理視圖資源核心類:ResourceBundleViewResolver
- 方法動態調用核心類ParameterMethodNameResolver
介紹對Spring的理解
Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。
- IoC:控制反轉(Inversion of Control)和依賴注入(Dependecy Injection)廣義上講是同一個概念,具體的講:在Spring中創建被調用者的工作不再由調用者來完成,因此稱爲控制反轉。創建被調用者的工作由Spring來完成,然後注入調用者,因此也稱爲依賴注入。
- AOP:面向切面編程(AOP)在Spring中主要表現爲兩個方面 1. 面向切面編程提供聲明式事務管理 。2. Spring支持用戶自定義的切面。
Java 8新特性(答得不好)
主要有以下幾個新特性:
- 默認方法:在接口裏面有了一個實現的方法
- Lambda 表達式:Lambda允許把函數作爲一個方法的參數
- Stream API:把真正的函數式編程風格引入到Java中
- Date Time API:加強對日期與時間的處理
- Optional 類:Optional 類已成爲 Java 8 類庫的一部分,用來解決空指針異常
- 方法引用:可以直接引用已有Java類或對象的方法或構造器
- 新編譯工具:Nashorn引擎(一個新的JavaScript引擎)、 類依賴分析器
λ表達式的理解
流式數據處理
對RESTful的理解
URL定位資源,HTTP動詞描述操作
- GET 用來獲取資源
- POST 用來新建 / 更新資源
- PUT 用來更新資源
- DELETE 用來刪除資源
對微服務的瞭解
微服務架構風格是一種使用一套小服務來開發單個應用的方式,每個服務運行在自己的進程中,並使用輕量級機制通信(通常是HTTP API),這些服務能夠通過自動化部署機制來獨立部署、可以使用不同的編程語言實現、可以使用不同的數據存儲技術,並保持最低限度的集中式管理。
DiskLruCache海量圖片緩存
三級緩存:內存LruCache + 磁盤DiskLruCache + 網絡Retrofit 2
這是面試官問到本人以前做過的Android項目
遇到過什麼技術難題,最終如何解決的
有什麼需要問的
筆試(1H,共4道題,忘了一道)
給定一元素可重複的有序數組和一個值,找出數組內該值首次出現和最後出現的數組下標
- 不限時間複雜度
- 時間複雜度 < O(N)
可用改進的二分法解答:若當前單位的左右值均不等於給定值時命中。
給定一單向列表頭部,判斷隊列有無環路
- 不限空間複雜度
- 空間複雜度 < O(N)
可用雙指針追逐法解答:步長分別爲 k 和 k+1,某一步兩指針相遇則有環路。
遊戲道具:足夠大圓桌、足夠多黑白圍棋。遊戲規則:黑白方回合制落子,直至桌面無法再放一顆棋子,則最後落子方勝。如何保證必贏?
第一步佔圓心,然後與對方鏡像對稱下棋,能保證必贏。