阿里P8Java架構師開放面試題集:資料+快取+併發等10大實戰技術
作為一個java後端老鳥,跌打滾爬多次被面試和麵試別人,總結了一些經驗,希望對大家有所幫助。 文末有整理好的面試檔案,可以免費獲取。

特別說明,僅僅針對工作兩年以上的java後端開發。以開發性題目為主。
資料結構相關
假設1億整數存放在一個txt檔案中,如何去重和排序?
思路:
1.面試者要評估一下一億整數的大小。一個int佔4個位元組,1億呢?
2.去重的資料結構有哪些?HashSet--->引申到HashMap--->ConcurrentHashMap
3.資料量增大到十億百億怎麼去重?
布隆過濾器,優點,缺點
4.其他方式?
資料庫distinct order by,txt怎麼匯入到資料庫?load
redis去重排序,redis的資料結構-->引申到其他資料結構 String,list,hash,set,sorted set,hyperloglog,geo
mongo去重排序,
....
演算法相關,主要考察程式碼能力
斐波那契數列(fabnacci)實現,首先介紹一下該演算法的思想

1.第一級別實現: 兩層遞迴
public static long fibonacci(int n){ if(n==0) return 0; else if(n==1) return 1; else return fibonacci(n-1)+fibonacci(n-2); }
問演算法複雜度及評估一下效能問題,提示可以優化。
2.第二級別:減少一層遞迴
public static void main(String[] args) { long tmp=0; // TODO Auto-generated method stub int n=10; Long start=System.currentTimeMillis(); for(int i=0;i System.out.print(fibonacci(i)+" "); } System.out.println("-------------------------"); System.out.println("耗時:"+(System.currentTimeMillis()-start)); } public static long fibonacci(int n) { long result = 0; if (n == 0) { result = 0; } else if (n == 1) { result = 1; tmp=result; } else { result = tmp+fibonacci(n - 2); tmp=result; } return result; }
問題 ,演算法複雜度,引導有沒有不用遞迴的?
3.無遞迴
public static long fibonacci(int n){ long before=0,behind=0; long result=0; for(int i=0;i result=0; before=0; behind=0; } else if(i==1){ result=1; before=0; behind=result; }else{ result=before+behind; before=behind; behind=result; } } return result; }
併發問題
給出一個普通的spring mvc controller,如下:
@Controllerpublic class WelcomeController { private final Logger logger = LoggerFactory.getLogger(WelcomeController.class); @Autowired private final HelloWorldService helloWorldService; @RequestMapping(value = "/", method = RequestMethod.GET) public String index(Map model) { logger.debug("index() is executed!"); model.put("title", helloWorldService.getTitle("")); model.put("msg", helloWorldService.getDesc()); return "index"; } }
問題:
執行緒模型是什麼?單執行緒
如何提升qps?執行緒池 executor
線上程池下如何控制併發?訊號量Semaphore或者計數器CountDownLatch
引申到: Java中的可重入鎖:synchronized 和 java.util.concurrent.locks.ReentrantLock
資料庫相關
場景: 一張表 test(a,b,c,e,f,g) 100w記錄 常用查詢條件 ab abc abe,如何提升查詢效率?
索引
複合索引的規則:最左原則。查詢條件ae走不走索引?
1000w,1億,十億以上條記錄查詢是否會有什麼不同?
多執行緒下如何保證資料一致性?樂觀鎖/悲觀鎖,應用場景不同點
設計模式相關
public class Test { @Test public void test() throws InterruptedException, ExecutionException { AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("sys.out"); Future future = executor.submit(new OutThread()); System.out.println(future.get()); System.out.println("Hello, World!"); Thread.sleep(10000 * 1000L); } static class OutThread implements Callable { public void run() { } @Override public String call() throws Exception { String ret = " i test callable"; for (int i = 0; i < 10; i++) { try { Thread.sleep(2 * 1000L); System.out.println("i sleep 1s"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return ret; } } }
5.1 看程式說明
5.2 引申到reactor模型
spring reactor
vert.x
akka
5.3 servlet 3 響應式程式設計
快取相關
如何設計實現LRU快取?
Least Recently Used,最近最少使用快取。
思路:
每個key 需要有value,最近的使用時間戳
面向物件思想,Node{key,value,timestamp}組成執行緒安全的連結串列ConcurrentLinkedQueue

設計相關
如何設計一個停車場系統?
思路:
1.user-case圖 涉及的人: 使用者(普通使用者/特權使用者),車(小汽車/貨車等),停車場普通管理員,停車場系統管理員,車位資訊
2. 功能: 使用者停車導航,繳費,歷史記錄;車包含車牌,型別和使用者關聯;停車場普通管理員提供停車車位,導航和收費,車位的維護;停車場系統管理員停車場利用率,收費情況,維護費用,盈利報表等
3. 關鍵點: 評估系統的費用,硬體的費用。
安全相關
如何設計一個安全的api介面給第三方使用?
1.http和https 證書
2.防篡改 md5,sha1,sha256 簽名
3.加密,對稱加密des和非對稱加密rsa
4.可以參考http://open.taobao.com/doc.htm?docId=73&docType=1 淘寶開發平臺
linux相關
一個日誌檔案約為10億行記錄,如何錯誤日誌?
grep 命令,sed命令
如何設計一個秒殺系統?
秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中一些稀缺或者特價商品,電商網站一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性,會吸引大量使用者前來搶購,並且會在約定的時間點同時在秒殺頁面進行搶購。
併發量分別在0~100,100~1000,1000~10000,10000~100000的設計方案,這些設計方案的不同點是什麼?相同點是什麼?
設計思路:
防火牆如何限流,黑板名單
CND
LB負載層
前端: 頁面靜態化 禁止重複提交
後端: 限流 削峰 非同步處理 預處理
參考架構方案:

最後針對上面的高頻常問面試題我還總結出了各大網際網路公司java程式設計師面試涉及到的絕大部分面試題及答案做成了文件和學習筆記檔案以及架構視訊資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高併發等架構技術資料),希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以後會有更多幹貨分享。
以上所有資料的獲取方式:
加入Java進階架構交流:805685193。
