面試重點彙總

Hashcode()

1.hashcode值從何來:
通過hash函數/算法求得hash值,該值在hash表中的位置就是hashcode;
2.hashcode的用途
hashcode主要爲了查找的快捷性,hashcode是用來確定散列存儲結構中對象的地址;
3.hashcode與equals
兩點:(1)equlas相等,hashcode必定相同;(2)hashcode相同,兩個對象不一定相同,只能說明兩個對象在散列表中存儲的位置相同;
4.爲什麼重寫equlas方法,也建議重寫hashcode方法
只重寫equlas方法,不能保證equlas相等時,hashcode相等;
5.當對象爲String時equlas與“==”的區別
equlas比較的是字符串內容,==比較是否爲同一個對象;

Hashmap

1.數據結構
基於數組和鏈表實現,“鏈表散列"結構,底層是數組,數組每一項又是一個鏈表或者紅黑樹;存儲內容是key-value的映射,可以接受null值;
2.哈希衝突
當存儲的數據變多時,就會發生哈希衝突(hash位置相同)。
如何解決哈希衝突?
Java中是通過開散列的方式解決哈希衝突,即"鏈表散列”,當發生衝突時會將該元素放到鏈表中(鏈表的長度爲常數,實際查詢時間複雜度爲O(1)性能較高)。當鏈表元素超過8時,就需要引進紅黑樹,此時紅黑樹的查詢效率高於鏈表(不使用二叉樹是因爲在特定條件下查詢效率和鏈表一樣,而紅黑樹可以通過左旋右旋和變色保持平衡);
3.加載因子
也成負載因子,數據量與存儲容量之間的比值,Java中當負載因子超過7.5時,就會擴容resize;
4.hashMap中hash的算法
hashcode值高16位異獲低16位的值;
5.hashmap、hashTable、ConcurrentHashmap
hashmap沒有用到synchronize,不是線程安全,單線程效率高;
hashTable使用synchronize,鎖住整張hash表來保證線程安全,併發效率低;
ConcurrentHashmap使用分段鎖(默認將hash表分爲16個桶,鎖住一個桶是其他桶仍可訪問,併發效率提升顯而易見),線程安全,效率高(默認提升16倍);
6.map與set
map接口下有hashmap和treemap類,set下有hashset,不同點在於hashmap是key-value鍵值對存儲,hashset是以key值存儲,treemap也是以鍵值對存儲但是以key值來排序存儲。

集合框架

1.stack繼承vector;
2.set與map上文已述;
3.Linklist基於鏈表,Arraylist基於數組;
4.prorityQueue優先級隊列,不能以null作爲值(因爲要用equals吧)基於大跟堆小跟堆的實現,默認是最小堆;

網絡

五層
物理層(設備間的物理連接,發送原始的bit流),數據鏈路層(通過數據報,即幀保證物理上的可靠傳輸),網絡層(通過網絡狀況裝包來尋找數據傳輸的最佳路徑),傳輸層(通過TCP可靠傳輸,UDP不可靠傳輸,確定發送端和接收端),應用層(處理髮送數據和接受數據);
TCP與UDP的區別
1.TCP是面向連接的,UDP是無連接的;
2.TCP是面向字節流的,通過滑動窗口控制發送和接受的數據量,UDP是面向數據報的,UDP沒有擁塞控制和流量控制;
3.TCP是可靠傳輸的,保證數據到達。UDP是不可靠傳輸,不會因網絡擁擠而降低傳輸速率,因此會丟失數據,但是比較適用某些場景,比如實時通話,視頻等。
4.TCP的首部長,UDP首部短,因此TCP比UDP更耗資源;
5.TCP只能一對一傳輸數據;UDP可以一對一,一對多,多對多,多對一;
TCP的可靠性
1.什麼是可靠性:
處理數據是否到達;
數據不出錯(UDP也可保證);
數據有序;
不重複;
可以流量控制;
數據包大小可控;
2.如何保證:和上方一一對應
序列號-確認應答-超時重傳(發送緩衝區保證超時重傳的數據儲存)
效驗和
序列號(接受緩衝區用來存儲暫時未處理的信息)
序列號
滑動窗口/流量控制/擁塞控制
mss:確定最大發送數據量
滑動窗口
主要包括:
1.最大可連續發送數據量
2.對方確認應答
3.數據段
互之間的作用是:
通過對方可接受的最大數據量,可以確定不用等待對方ACK發送多少數據,被確認應答的數據會在發送緩衝區被刷新掉;
窗口越大,網絡吞吐率越高(單次傳輸數據量);
延遲應答
收到數據時,暫時不確認應答,等待上200ms後再應答;
原因:延遲應答後接收的數據量變多,即ACK較大,此時確認應答,窗口變大,網絡吞吐率高;
捎帶應答
發送其他數據時可以捎帶上ACK;
粘包問題
原因:接受的數據是有序排列起來的字節流數據,並不知道某段數據的開始和結束位置;
解決方法:
1.數據按照固定包大小發送和接收,拆分數據也按照固定包大小拆;
2.在包頭部聲明數據的長度即開始和結束位置;(Content-Length)
3.用特定分隔符來分割數據;(空行/r/n)
面向字節流
創建一個sockt同時在內核中創建了發送緩衝區和接受緩衝區,進行read讀和write寫;
同時有發送緩衝區和接受緩衝區的也稱爲全雙工
連接管理
1.why:需要溝通序列號等信息;2.生命週期建立連接,發送數據,關閉連接;3.作用:需要溝通序列號,窗口大小等;
三次揮手
A發送syn,B收到並回復ACK,A收到並回復ACK;
必須是三次的原因:
1.第一次:服務端確定客戶端的發送數據能力;
2.第二次:客戶端確定服務端端的接受能力和發送能力;
3.第三次:服務端確定客戶端的接收數據能力;
四次揮手
主動關閉:
一次揮手:A發送FIN包進入FIN_WAIT_1狀態,
二次揮手:B收到後回ACK,A收到ACK進入FIN_WAIT_2,
三次揮手:B發送FIN包,A收到B發的FIN包,
三次揮手:發送響應ACK進入TIME_WAIT狀態;
同時關閉:同時發FIN並且收到對方的FIN包回ACK,收到ACK進入TIME_WAIT狀態;
被動關閉:收FIN,發ACK進入CLOSE_WAIT狀態,發送FIN並關閉程序,進入LAST_ACK狀態等待最後的響應ACK;
IP和MAC
MAC從物理層和數據鏈路層確定某一臺電腦,主要解決在局域網內確定一臺機器,IP從傳輸層解決端到端的問題。
五元組
源IP地址+源端口號+目的IP地址+目的端口號+協議;
(例192.1.1.1 +1234+121.1.1.1+80+TCP)
DNS
域名解析系統,相當於一個巨大的電話本,當你訪問一個網站的時候,需要DNS解析域名爲Ip地址,如果本地hosts文件有該域名的映射關係,則完成解析,如果沒有就問上一級域,以此類推訪問到根DNS系統,它能查詢到所有的域名是屬於哪一個頂級ip的,然後反饋給你,如果該頂級IP也無法解析,則詢問下一級依次類推直到找到該域名的主機;
HTTP
超文本傳輸協議,作用於應用層,基於TCP的可靠性的,它是一種無狀態的協議,即不保存訪問信息的,但是當登錄購物等需要等需要登陸的網站時,需要保存登錄信息,這使就引進了cookies和session了,cookies用於本地保存登錄信息,session主要用於服務端查詢並確定客戶端的信息,HTTP的請求格式:1.請求行(包含請求方法(get/post),URL(唯一資源標識),請求協議版本(HTTP/1.0))。2,請求頭,包含接受的響應類型,寫入服務器的cookies信息,host端口號等。3,請求體,get方法沒有消息體,post方法將數據放在消息體中。然後會收到響應頭(協議版本,狀態碼,狀態信息),響應頭(內容格式,編碼類型,字節數等),響應體(主要以key=value形式顯示,之間用&號連接)
cookies和session的區別
cookies用於客戶端的,session用於服務器的;cookies可以設置保存時間,可以是永久保存的,session的存活週期短,一般是瀏覽器開啓,關閉;服務器會處理來自客戶端的cookies信息,並將其解析爲可以識別的字段,查詢該字段的session信息。cookies主要作用是保存客戶端的登錄信息,session只要是用來保持會話的;
狀態碼
200:成功
302:頁面跳轉
304:頁面內容未改變
400:請求信息有誤
401:需要驗證用戶
403:服務器收到信息,但拒絕提供此服務
404:資源不存在
408:請求超時
500:服務器出現不可預期錯誤
503:服務器當前不能處理請求,請稍後重試
http和https的區別
1.http在應用層;https在傳輸層;
2.http無加密,是不安全的;https採用SSL加密,安全的;
3.http耗資源少;https由於要進行加密等操作,耗費資源多;
4.http爲80端口;https爲443;
get和post的區別
1.get主要用於請求服務器返回信息;post主要用於向服務發送寫入的信息;當然get也可用於寫入信息,但是向服務器發送私密信息,如登錄賬號密碼的時候用get是不安全的,因爲他會被瀏覽器儲存下來,而post不會;
2.get能被收藏爲書籤;post不行;
3.get能被緩存;post不行;
4.get將信息寫在url中且有長度限制,而post將消息寫在請求體中,無長度限制;
5.編碼類型不同;
6.get不需要考慮冪等性;post需要考慮冪等性(多次提交,結果正確,當多次請求時,若操作重複,服務器捕獲重複異常,並不作處理);

未完待續…敬請期待

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