更新時間:2020-05-20 15:43:08 來源:動力節點 瀏覽4477次
1.TreeSet/HashSet的區別。
顧名思義,首先是結構上的不同。TreeSet背后的結構是TreeMap,也就是紅黑樹,能夠實現自動排序。它通過equals方法或者compareTo方法進行內容的比較;HashSet背后是HashMap,key是無序的,只能做外部排序。既然是Hash,那么就要重寫其中對象的hashCode和equals方法。
另外,還有個細微的差別:HashSet可以接受null值,有且只有一個;TreeSet默認不可以接受null值,會直接拋出空指針異常。
2.HashMap如何解決沖突,擴容機制?
HashMap的內部結構其實是數組+鏈表(java8后如果長度大于8則轉換為紅黑樹)。HashMap初始化時,默認有16個hash槽。存入對象時,首先,通過對象的hashCode,定位到hash槽。如果多個對象同時落入同一個槽,那么就會使用鏈表解決本槽上的沖突。HashMap在創建時,會有一個負載因子。每次put操作,都會檢查當前容量是否會超出閾值(initailCapacity*loadFactor)。如果超出,則擴容為當前的兩倍。擴容后,數據需要重新散列,也就是transfer方法。
3.ConcurrentHashMap如何做到高并發的?
簡單點說,使用了分段鎖(分離鎖)。每一把鎖用于鎖住容器中的一部分數據,減少線程間對鎖的競爭。
4.線程池平常怎么用?
普通的場景,使用工廠類Executors創建就可以了。常用的有Single、Fixed、Cached三種。更多時候,為了更精細的控制,會直接對ThreadPoolExecutor類進行定制。
5.多個線程等待到某一節點然后統一放行有幾種實現方式?
最經典的就是CountDownLatch,主線程阻塞在await方法,每個線程調用countDown。可以解決一些經典的賽馬問題。還有一個變種就是CyclicBarrier。每個線程都阻塞在await方法,達到一定閾值集體放行。另外還可以使用一些較初級的api,比如Thread的join方法。Future的get方法等,復雜不推薦。
6.數據庫索引結構。
B+Tree,為了適應緩慢的磁盤而生的一種索引結構。必須保證按照索引的最左前綴查詢。Hash和HashMap類似,處理沖突的方式是鏈表。
7.select*fromtwherea=?andb>?orderbyclimit0,100如何加索引?
當orderby字段出現在where條件中時,才會利用索引而無需排序操作。其他情況,orderby不會出現排序操作。按照最左原則,我可以創建(a,b)的索引。
8.什么是聚簇索引和非聚簇索引?
一個表只能有一個聚簇索引。主索引文件和數據文件為同一份文件,默認的InnoDB就支持聚簇索引,B+Tree的葉子節點上的data就是數據本身。而MyISAM就不支持聚簇索引,它的葉子結點存放的不是數據本身,而是數據存放的地址。在文件結構上,會分為一個索引文件、一個數據文件。
9.了解CAP嗎?redis里的CAP是怎樣的?
Consistency一致性、Availability可用性、Partitiontolerance分區容錯。一般,都在C、A之間進行權衡。redis簡單主從模式側重于CP的,即對于一致性要求較高。redis-cluster,則屬于AP類型,更加強調可用性。
10.如何理解冪等?項目中接口的冪等是如何做的?
冪等是指多次執行,影響相同。比如大多數Post操作,重復提交訂單等,最終只會有一個訂單生成成功。還有一種情況就是消息,由于大多數MQ之保證atleastonce,所以消息有時會重復。
1)對于Post請求,我一般在請求成功后,強制跳轉到其他頁面,避免刷新提交。
2)復雜的操作一般使用流水號來實現。
3)某些不帶流水號的消息,處理的時候,就要進行多次校驗和check,甚至引入消息狀態表,來保證冪等。
以上就是動力節點java培訓機構的小編針對“2020年中級開發java面試題含答案”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習