2019年_BATJ大廠面試題總結-順豐篇

1.Hashmap底層

答案:https://blog.csdn.net/suifeng629/article/details/82179996

2.hashmap和hashtable區別?

答案:https://blog.csdn.net/fxkcsdn/article/details/81487933

3.Hashmap是線程安全的嗎爲什麼不安全?

答案:https://blog.csdn.net/weixin_43092168/article/details/89791106
https://blog.csdn.net/chisunhuang/article/details/79041656

4.MySQL 索引,引擎,主從讀寫分離

主從配置、讀寫分離
在實際的生產環境中,由單臺Mysql作爲獨立的數據庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高併發等各個方面。因此,一般來說都是通過 主從複製(Master-Slave)的方式來同步數據,再通過讀寫分離(MySQL-Proxy)來提升數據庫的併發負載能力 這樣的方案來進行部署與實施的。
主從複製原理:
主庫(Master)開啓二進制日誌(binlog,記錄所有數據庫操作的日誌);主庫授權一個賬號給從庫(Slave),從庫作爲主庫的一個客戶端訪問主庫的二進制日誌,記錄到自己的中繼日誌(Relay Log)中;從庫的SQL線程會檢測自己的中繼日誌,並執行;

具體執行過程:
(1)在Slave服務器上執行start slave命令開啓主從複製開關,開始進行主從複製。
(2)此時,Slave服務器的IO線程會通過在master上已經授權的複製用戶權限請求連接Master服務器,並請求從執行binlog日誌文件中的指定位置(日誌文件名和位置就是在配置主從複製服務時執行change master命令指定的)之後開始發送binlog日誌內容。
(3)Master服務器接收來自Slave服務器的IO線程的請求後,其上負責複製的IO線程會根據Slave服務器的IO線程請求的信息分批讀取指定binlog日誌文件指定位置之後的binlog日誌信息,然後返回給Slave端的IO線程。
(4)當Slave服務器的IO線程獲取到Master服務器上IO線程發送的日誌內容、日誌文件及位置點後,會將binlog日誌內容依次寫到Slave端自身的Relay Log(即中繼日誌)文件(Mysql-relay-bin.xxx)的最末端,並將新的binlog文件名和位置記錄到master-info文件中,以便下一次讀取master端新binlog日誌時能告訴Master服務器從新binlog日誌的指定文件及位置開始讀取新的binlog日誌內容
(5)Slave服務器端的SQL線程會實時檢測本地Relay Log 中IO線程新增的日誌內容,然後及時把Relay LOG 文件中的內容解析成sql語句,並在自身Slave服務器上按解析SQL語句的位置順序執行應用這樣sql語句,並在relay-log.info中記錄當前應用中繼日誌的文件名和位置點

讀寫分離(主寫從讀)
從服務器只負責讀,主服務器負責寫操作、
實現方式:
1. 程序上判斷(開發者自己寫)
2. 使用中間件,MySQL- Proxy是實現"讀寫分離(Read/Write Splitting)"的一個軟件。基本的原理是讓主數據庫處理寫操作(insert、update、delete),而從數據庫處理查詢操作(select)。而數據庫的一致性則通過主從複製來實現。所以說主從複製是讀寫分離的基礎。
詳解:https://blog.csdn.net/fsx2550553488/article/details/80575698

5.redis數據類型,自己用到了什麼?

數據類型:
1.String(字符串)。
2.Hash(哈希),鍵值對結構。
3.list(列表),列表的值有序可重複。
4.set(集合),集合值無序不可重複。
5.sort set(有序集合),集合值有序不可重複。
redis使用場景:
會話緩存(Session Cache)
全頁緩存(FPC)
排行榜/計數器
Redis在內存中對數字進行遞增或遞減的操作實現的非常好。
redis優點
(1) 速度快,因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

6.給你三個線程a b c b依賴a的結果 c依賴b的結果,你怎麼實現?

答案:https://www.cnblogs.com/scar1et/p/11900641.html

7.手撕算法 給定排序數組中找出第一個等於target值的索引,沒有返回-1

答案:https://blog.csdn.net/weixin_42047723/article/details/93721826

8.子類重寫父類拋出異常的方法,能否繼承比父類更高級別的異常類?

見下方示例代碼:

import java.io.*;
 
public class Father {
	public void father_function() throws IOException {
		new File("a.txt");
	}
}
 
class Son extends Father {
	@Override
	public void father_function() throws Exception {
		new File("b.txt");
	}
}
 
class Test {
	public static void main(String[] args) {
		Father fs = new Son();
		try {
			fs.father_function();
		}catch (IOException ie) {
			System.out.println("發生了異常");
		}
	}
}

代碼說明:

定義了一個類,類名爲Father,Father中包含一個普通實例方法,但是該方法會拋出IOException
定義了一個Father類的子類:Son,該類重寫了父類Father的方法,但是子類重寫方法後選擇了拋出一個更大的異常
定義了一個Test類,包含一個main方法
Test類中創建了一個Son類對象(也即Father類的子類對象),然後使用try…catch…語句將fs.father_function();這條會拋出異常的語句包圍,並使用了IOException對象對當前可能產生的異常進行捕

結果: 程序編譯失敗

原因分析:

1、在java多態機制中,對象引用fs在編譯時期是屬於父類類型也即Father類型,但是在運行時fs屬於子類類型,也就是Son類型

2、也就是說在編譯的時候,編譯器發現catch中的IOException完全能將父類方法中拋出的異常捕獲,因此編譯通過,但是在運 行時期,由於fs變成了子類類型,子類重寫的方法拋出的異常是Exception,顯然IOException不能捕獲這個比它更大的異 常,因此在運行時期也就出現失敗

總結:這個示例也就演示了一個道理,在java中,子類重寫父類的方法時,子類如果選擇拋出異常,那麼拋出的異常類型不能大於父類的異常類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章