资料整理面试
https://blog.csdn.net/bntX2jSQfEHy7/article/details/81187626
各大企業面試題:
https://blog.csdn.net/huangshulang1234/article/details/79102943
設計模式面試題:
https://blog.csdn.net/wu_ming0821/article/details/51838078
https://blog.csdn.net/zhousenshan/article/details/72808887
排序面試總結:
https://blog.csdn.net/sunxianghuang/article/details/51872360
百度:2017面試題
https://blog.csdn.net/pc123455/article/details/53319467
Redis的持久化:RDB與AOF
https://www.cnblogs.com/fixzd/p/9393990.html
Redis的高手總結:
https://blog.csdn.net/hjm4702192/article/details/80518856
最常見的面試題:
https://blog.csdn.net/Px01Ih8/article/details/81267503
應用場景:
Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。?
Redis:適用于對讀寫效率要求都很高,數據處理業務復雜和對安全性要求較高的系統(如新浪微博的計數和微博發布部分系統,對數據安全性、讀寫要求都很高)。
?
一、阿里巴巴面試
第一個:阿里面試都問什么? :(55分鐘)
01
1、開發中Java用了比較多的數據結構有哪些?
?
2、談談你對HashMap的理解,底層原理的基本實現,HashMap怎么解決碰撞問題的?
解決hash沖突的辦法
Java中hashmap的解決辦法就是采用的鏈地址法。
哈希表是由數組+鏈表組成的,一個長度為16的數組中,每個元素存儲的是一個鏈表的頭結點。那么這些元素是按照什么樣的規則存儲到數組中呢。一般情況是通過hash(key)%len獲得,也就是元素的key的哈希值對數組長度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存儲在數組下標為12的位置。
HashMap其實也是一個線性的數組實現的,所以可以理解為其存儲數據的容器就是一個線性數組。這可能讓我們很不解,一個線性的數組怎么實現按鍵值對來存取數據呢?這里HashMap有做一些處理。
首先HashMap里面實現一個靜態內部類Entry,其重要的屬性有?key , value, next,從屬性key,value我們就能很明顯的看出來Entry就是HashMap鍵值對實現的一個基礎bean,我們上面說到HashMap的基礎就是一個線性數組,這個數組就是Entry[],Map里面的內容都保存在Entry[]里面。
這些數據結構中是線程安全的嗎?假如你回答HashMap是線程安全的,接著問你有沒有線程安全的map,接下來問了conurren包。
HashMap是否是線程安全的,如何在線程安全的前提下使用HashMap,其實也就是HashMap,Hashtable,ConcurrentHashMap和synchronized Map的原理和區別。當時有些緊張只是簡單說了下HashMap不是線程安全的;Hashtable線程安全,但效率低,因為是Hashtable是使用synchronized的,
所有線程競爭同一把鎖;
而ConcurrentHashMap不僅線程安全而且效率高,因為它包含一個segment數組,將數據分段存儲,
給每一段數據配一把鎖,也就是所謂的鎖分段技術。當時忘記了synchronized Map和解釋一下HashMap為什么線程不安全。
HashMap在并發時可能出現的問題主要是兩方面,首先如果多個線程同時使用put方法添加元素,
而且假設正好存在兩個put的key發生了碰撞(hash值一樣),那么根據HashMap的實現,
這兩個key會添加到數組的同一個位置,這樣最終就會發生其中一個線程的put的數據被覆蓋。
第二就是如果多個線程同時檢測到元素個數超過數組大小*loadFactor,
這樣就會發生多個線程同時對Node數組進行擴容,都在重新計算元素位置以及復制數據,
但是最終只有一個線程擴容后的數組會賦給table,也就是說其他線程的都會丟失,并且各自線程put的數據也丟失
詳細解釋:
http://www.importnew.com/21396.html
3、對JVM熟不熟悉?簡單說說類加載過程,里面執行的哪些操作?問了GC和內存管理,平時在tomcat里面有沒有進行過相關的配置
?
4、然后問了http協議,get和post的基本區別,接著tcp/ip協議,三次握手,窗口滑動機制。
5、開發中用了那些數據庫?回答mysql,儲存引擎有哪些?然后問了我悲觀鎖和樂觀鎖問題使用場景、分布式集群實現的原理。
悲觀鎖和樂觀鎖:
定義: 悲觀鎖(Pessimistic Lock): 每次獲取數據的時候,都會擔心數據被修改,所以每次獲取數據的時候都會進行加鎖,確保在自己使用的過程中數據不會被別人修改,使用完成后進行數據解鎖。由于數據進行加鎖,期間對該數據進行讀寫的其他線程都會進行等待。樂觀鎖(Optimistic Lock): 每次獲取數據的時候,都不會擔心數據被修改,所以每次獲取數據的時候都不會進行加鎖,但是在更新數據的時候需要判斷該數據是否被別人修改過。如果數據被其他線程修改,則不進行數據更新,如果數據沒有被其他線程修改,則進行數據更新。由于數據沒有進行加鎖,期間該數據可以被其他線程進行讀寫操作。適用場景: 悲觀鎖:比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,數據發生沖突的可能性就會增大,為了保證數據的一致性,應用層需要不斷的重新獲取數據,這樣會增加大量的查詢操作,降低了系統的吞吐量。
6、然后問了我springmvc和mybatis的工作原理,有沒有看過底層源碼?
?
二、京東金融面試
02
1、Dubbo超時重試;Dubbo超時時間設置
https://www.cnblogs.com/binyue/p/5380322.html
2、如何保障請求執行順序
3、分布式事物與分布式鎖(扣款不要出現負數)
https://blog.csdn.net/peng_0129/article/details/80000564
4、分布式session設置
https://www.cnblogs.com/cxrz/p/8529587.html
5、執行某操作,前50次成功,第51次失敗a全部回滾b前50次提交第51次拋異常,ab場景分別如何設置Spring(傳播性)
6、Zookeeper有哪些應用用
https://www.cnblogs.com/liuwei6/p/6737908.html
7、JVM內存模型
8、數據庫垂直和水平拆分
9、MyBatis如何分頁;如何設置緩存;MySQL分頁
https://www.cnblogs.com/tenWood/p/6676331.html
邏輯分頁:mybatis內置的分頁是邏輯分頁;數據庫里有100條數據,要每頁顯示10條,mybatis先把100條數據取出來,放到內存里,從內存里取10條;雖然取出的是10條,但是性能不好,幾千條上萬條沒問題,數據量大性能就有問題了;小項目使用沒問題;正式的項目數據量都很大就不使用了;物理分頁: 開發的時候用的:拼sql,真正實現分頁;
?mysql的分頁;
一般情況下,客戶端通過傳遞 pageNo(頁碼)、pageSize(每頁條數)兩個參數去分頁查詢數據庫中的數據,在數據量較小(元組百/千級)時使用 MySQL自帶的?limit?來解決這個問題
10、熟悉IO么?與NIO的區別,阻塞與非阻塞的區別
面向Stream和面向BufferJava NIO和IO之間最大的區別是IO是面向流(Stream)的,NIO是面向塊(buffer)的,所以,這意味著什么?面向流意味著從流中一次可以讀取一個或多個字節,拿到讀取的這些做什么你說了算,這里沒有任何緩存(這里指的是使用流沒有任何緩存,接收或者發送的數據是緩存到操作系統中的,流就像一根水管從操作系統的緩存中讀取數據)而且只能順序從流中讀取數據,如果需要跳過一些字節或者再讀取已經讀過的字節,你必須將從流中讀取的數據先緩存起來。面向塊的處理方式有些不同,數據是先被 讀/寫到buffer中的,根據需要你可以控制讀取什么位置的數據。這在處理的過程中給用戶多了一些靈活性,然而,你需要額外做的工作是檢查你需要的數據是否已經全部到了buffer中,你還需要保證當有更多的數據進入buffer中時,buffer中未處理的數據不會被覆蓋阻塞IO和非阻塞IO所有的Java IO流都是阻塞的,這意味著,當一條線程執行read()或者write()方法時,這條線程會一直阻塞知道讀取到了一些數據或者要寫出去的數據已經全部寫出,在這期間這條線程不能做任何其他的事情java NIO的非阻塞模式(Java NIO有阻塞模式和非阻塞模式,阻塞模式的NIO除了使用Buffer存儲數據外和IO基本沒有區別)允許一條線程從channel中讀取數據,通過返回值來判斷buffer中是否有數據,如果沒有數據,NIO不會阻塞,因為不阻塞這條線程就可以去做其他的事情,過一段時間再回來判斷一下有沒有數據NIO的寫也是一樣的,一條線程將buffer中的數據寫入channel,它不會等待數據全部寫完才會返回,而是調用完write()方法就會繼續向下執行SelectorsJava NIO的selectors允許一條線程去監控多個channels的輸入,你可以向一個selector上注冊多個channel,然后調用selector的select()方法判斷是否有新的連接進來或者已經在selector上注冊時channel是否有數據進入。selector的機制讓一個線程管理多個channel變得簡單。
11、分布式session一致性
12、分布式接口的冪等性設計「不能重復扣款」
https://blog.csdn.net/wconvey/article/details/54601108
https://www.cnblogs.com/wxgblogs/p/6639272.html
?
三、美團面試
03
1、最近做的比較熟悉的項目是哪個?畫一下項目技術架構圖
2、JVM老年代和新生代的比例?
3、YGC和FGC發生的具體場景
4、jstack,jmap,jutil分別的意義?如何線上排查JVM的相關問題?
https://blog.csdn.net/qq_26653067/article/details/79728520
5、線程池的構造類的方法的5個參數的具體意義?
?
6、單機上一個線程池正在處理服務如果忽然斷電該怎么辦?(正在處理和阻塞隊列里的請求怎么處理)?
7、使用無界阻塞隊列會出現什么問題?
8、接口如何處理重復請求?
重復提交的問題
https://blog.csdn.net/js_sky/article/details/49303997
9、具體處理方案是什么?
10、如何保證共享變量修改時的原子性?
https://www.cnblogs.com/SirSmith/p/6014441.html
11、設計一個對外服務的接口實現類,在1,2,3這三個主機(對應不同IP)上實現負載均衡和順序輪詢機制(考慮并發)
?
總結
- 上一篇: 洛谷P3616 富金森林公园
- 下一篇: 区块链如何应用于保险行业