BAT经典面试题精简版(基础知识附答案)
文章目錄
- 目錄
- J2SE基礎(chǔ)
- JVM
- 操作系統(tǒng)
- TCP/IP
- 數(shù)據(jù)結(jié)構(gòu)與算法
目錄
J2SE基礎(chǔ)
九種基本數(shù)據(jù)類型的大小,以及他們的封裝類。
原始類型封裝類
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
Switch能否用string做參數(shù)?
在switch(expr1)中,expr1只能是一個整數(shù)表達式或者枚舉常量(更大字體),整數(shù)表達式可以是int基本類型或Integer包裝類型,由于,byte,short,char都可以隱含轉(zhuǎn)換為int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合switch的語法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類型,所以,它們不能作用于swtich語句中。
equals與的區(qū)別。
操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲的數(shù)值是否相同,要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否相等,只能用操作符。
如果一個類沒有自己定義equals方法,它默認的equals方法(從Object 類繼承的)就是使用操作符,也是在比較兩個變量指向的對象是否是同一對象,這時候使用equals和使用==會得到同樣的結(jié)果,如果比較的是兩個獨立的對象則總返回false。如果你編寫的類希望能夠比較該類創(chuàng)建的兩個實例對象的內(nèi)容是否相同,那么你必須覆蓋equals方法,由你自己寫代碼來決定在什么情況即可認為兩個對象的內(nèi)容是相同的。
Object有哪些公用方法?
Java的四種引用,強弱軟虛,用到的場景。
Hashcode的作用。
判斷兩個對象是否相等。
ArrayList、LinkedList、Vector的區(qū)別。
List的子類特點
ArrayList:
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢
線程不安全,效率高
Vector:
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢
線程安全,效率低
LinkedList:
底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢,增刪快
線程不安全,效率高
String、StringBuffer與StringBuilder的區(qū)別。
String類創(chuàng)建數(shù)值不會改變的對象。
StringBuffer類創(chuàng)建數(shù)值會改變的對象,并且可以同步,線程安全效率低。
StringBuilder類創(chuàng)建數(shù)值會改變的對象不可以同步,線程不安全效率高。
Map、Set、List、Queue、Stack的特點與用法。
List 以特定次序來持有元素,可有重復(fù)元素。
Set 無法擁有重復(fù)元素,內(nèi)部排序。
Map 保存key-value值,value可多值。
HashMap和HashTable的區(qū)別。
HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境。
HashMap和ConcurrentHashMap的區(qū)別,HashMap的底層源碼。
TreeMap、HashMap、LindedHashMap的區(qū)別。
Collection包結(jié)構(gòu),與Collections的區(qū)別。
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作。
try catch finally,try里有return,finally還執(zhí)行么?
可以
Excption與Error包結(jié)構(gòu)。OOM你遇到過哪些情況,SOF你遇到過哪些情況。
OOM:內(nèi)存溢出
SOF:堆溢出
Java面向?qū)ο蟮娜齻€特征與含義。
繼承、封裝、多態(tài)
Override和Overload的含義去區(qū)別。
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載O verloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫(Overriding)。子類的對象使用這個方法時,將調(diào)用子類中的定義,對它而言,父類中的定義如同被”屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
Interface與abstract類的區(qū)別。
一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類。
接口中的成員屬性都是公有的,而抽象類中的可以是各種類型。
Static class 與non static class的區(qū)別。
靜態(tài)類可以直接通過類來調(diào)用,非靜態(tài)類則只能通過類的實例來調(diào)用。
java多態(tài)的實現(xiàn)原理。
實現(xiàn)多線程的兩種方法:繼承Thread與實現(xiàn)Runable接口。
線程同步的方法:sychronized、lock、reentrantLock等。
鎖的等級:方法鎖、對象鎖、類鎖。
寫出生產(chǎn)者消費者模式。
ThreadLocal的設(shè)計理念與作用。
ThreadPool用法與優(yōu)勢。
Concurrent包里的其他東西:ArrayBlockingQueue、CountDownLatch等等。
wait()和sleep()的區(qū)別。
對象執(zhí)行wait()時,需要釋放對象鎖。而執(zhí)行sleep()時不用釋放對象鎖。
foreach與正常for循環(huán)效率對比。
Java IO與NIO。
傳統(tǒng)的IO在對數(shù)據(jù)進行處理時需要在操作系統(tǒng)中從內(nèi)核態(tài)轉(zhuǎn)換到用戶態(tài)然后再從用戶態(tài)轉(zhuǎn)換為內(nèi)核態(tài),中間消耗很多時間。
傳統(tǒng)IO示意圖:
NIO是New IO指 的是在對數(shù)據(jù)進行IO處理時,可以不用做狀態(tài)的轉(zhuǎn)換。如下圖所示:
NIO技術(shù)省去了將操作系統(tǒng)的read buffer拷貝到程序的buffer, 以及從程序buffer拷貝到socket buffer的步驟, 直接將 read buffer 拷貝到 socket buffer. java 的 FileChannel.transferTo() 方法就是這樣的實現(xiàn), 這個實現(xiàn)是依賴于操作系統(tǒng)底層的sendFile()實現(xiàn)的.
反射的作用和原理。
通過字節(jié)碼文件對象(指的就是類的全稱),去使用任意成員變量,構(gòu)造方法,成員方法
泛型常用特點,List能否轉(zhuǎn)為List。
解析XML的幾種方式的原理與特點:DOM、SAX、PULL。
Java與C++對比。
Java1.7與1.8新特性。
設(shè)計模式:單例、工廠、適配器、責(zé)任鏈、觀察者等等。
JNI的使用。
Java里有很多很雜的東西,有時候需要你閱讀源碼,大多數(shù)可能書里面講的不是太清楚,需要你在網(wǎng)上尋找答+案。
推薦書籍:《java核心技術(shù)卷I》《Thinking in java》《java并發(fā)編程》《effictive java》《大話設(shè)計模式》
JVM
內(nèi)存模型以及分區(qū),需要詳細到每個區(qū)放什么。
Java虛擬機運行時數(shù)據(jù)區(qū)域被分為五個區(qū)域:堆(Stack)、棧(Heap)、本地方法棧(Native Stack)、方法區(qū)(Method Area)、程序計數(shù)器(Program Count Register).
堆:我們創(chuàng)建的對象和數(shù)組就是存放在堆里面( Java Stack可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可。與Java Stack相關(guān)的還有Java的垃圾回收機制(GC),Java Stack是垃圾回收器管理的主要區(qū)域。Java Stack是一塊共享的區(qū)域,操作共享區(qū)域的成員就有了鎖和同步。)
棧:Java Heap是線程私有的,她的生命周期與線程相同。Java Heap描述的是Java方法執(zhí)行時的內(nèi)存模型,每個方法執(zhí)行時都會創(chuàng)建一個棧幀(Heap Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息(局部變量表存放了編譯期間的各種基本數(shù)據(jù)類型,對象引用等信息。)
本地方法棧:本地方法棧(Native Heap)與Java虛擬機站(Java Heap)所發(fā)揮的作用非常相似,他們之間的區(qū)別在于虛擬機棧為虛擬機棧執(zhí)行java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則為使用到Native方法服務(wù)。
**方法區(qū):**方法區(qū)(Method Area)與堆(Java Stack)一樣,是各個線程共享的內(nèi)存區(qū)域,它用于存儲虛擬機加載的類信息,常量,靜態(tài)變量,即時編譯器編譯后的代碼等數(shù)據(jù)
總結(jié):
1、 線程私有的數(shù)據(jù)區(qū)域有:
Java虛擬機棧(Java Heap)
本地方法棧(Native Heap)
2、 線程共有的數(shù)據(jù)區(qū)域有:
堆(Java Stack)
方法區(qū)
堆里面的分區(qū):Eden,survival from to,老年代,各自的特點。
對象創(chuàng)建方法,對象的內(nèi)存分配,對象的訪問定位。
GC的兩種判定方法:引用計數(shù)與引用鏈。
GC的三種收集方法:標記清除、標記整理、復(fù)制算法的原理與特點,分別用在什么地方,如果讓你優(yōu)化收集方法,有什么思路?
標記-清除算法(Mark-sweep)
標記出所有需要回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象
缺點:一個是效率問題,標記和清除兩個過程的效率都不高;
另一個是空間問題,標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會導(dǎo)致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動作。
復(fù)制算法(Copying)
1、將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。
2、當這一塊的內(nèi)存用完了,就將還存活著的對象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。
優(yōu)點:這樣使得每次都是對整個半?yún)^(qū)進行內(nèi)存回收,內(nèi)存分配時也就不用考慮內(nèi)存碎片等復(fù)雜情況,只要移動堆頂指針,按順序分配內(nèi)存即可,實現(xiàn)簡單,運行高效。只是這種算法的代價是將內(nèi)存縮小為了原來的一半,未免太高了一點。
缺點:復(fù)制收集算法在對象存活率較高時就要進行較多的復(fù)制操作,效率將會變低
GC收集器有哪些?CMS收集器與G1收集器的特點。
Minor GC與Full GC分別在什么時候發(fā)生?
幾種常用的內(nèi)存調(diào)試工具:jmap、jstack、jconsole。
類加載的五個過程:加載、驗證、準備、解析、初始化。
雙親委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
分派:靜態(tài)分派與動態(tài)分派。
JVM過去過來就問了這么些問題,沒怎么變,內(nèi)存模型和GC算法這塊問得比較多,可以在網(wǎng)上多找?guī)灼┛蛠砜纯础?/p>
推薦書籍:《深入理解java虛擬機》
操作系統(tǒng)
進程和線程的區(qū)別。
進程:可以看做是一個正在執(zhí)行的應(yīng)用程序。
線程:進程的執(zhí)行單元,可以看做是程序的某一個功能。(線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位,它被包含在進程之中,是進程中的實際運作單位)
死鎖的必要條件,怎么處理死鎖。
兩個線程互相等待對方的處理結(jié)果。線程在獲取鎖的時候聲明獲取鎖的順序。
Window內(nèi)存管理方式:段存儲,頁存儲,段頁存儲。
進程的幾種狀態(tài)。
(1)運行(running)態(tài):進程占有處理器正在運行。
(2)就緒(ready)態(tài):進程具備運行條件,等待系統(tǒng)分配處理器以便運行。
(3)等待(wait)態(tài):又稱為阻塞(blocked)態(tài)或睡眠(sleep)態(tài),指進程不具備運行條件,正在等待某個事件的完成。
除了三態(tài)模式外還有七態(tài)模式。
IPC<進程間通信(IPC,Inter-Process Communication)>幾種通信方式。
(1)、管道(pipe):管道可用于具有親緣關(guān)系的進程間的通信,是一種半雙工的方式,數(shù)據(jù)只能單向流動,允許一個進程和另一個與它有共同祖先的進程之間進行通信。
(2)、命名管道(named pipe):命名管道克服了管道沒有名字的限制,同時除了具有管道的功能外(也是半雙工),它還允許無親緣關(guān)系進程間的通信。命名管道在文件系統(tǒng)中有對應(yīng)的文件名。命名管道通過命令mkfifo或系統(tǒng)調(diào)用mkfifo來創(chuàng)建。
(3)、信號(signal):信號是比較復(fù)雜的通信方式,用于通知接收進程有某種事件發(fā)生了,除了進程間通信外,進程還可以發(fā)送信號給進程本身;linux除了支持Unix早期信號語義函數(shù)sigal外,還支持語義符合Posix.1標準的信號函數(shù)sigaction(實際上,該函數(shù)是基于BSD的,BSD為了實現(xiàn)可靠信號機制,又能夠統(tǒng)一對外接口,用sigaction函數(shù)重新實現(xiàn)了signal函數(shù))。
(4)、消息隊列:消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權(quán)限的進程可以向隊列中添加消息,被賦予讀權(quán)限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺
(5)、共享內(nèi)存:使得多個進程可以訪問同一塊內(nèi)存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設(shè)計的。往往與其它通信機制,如信號量結(jié)合使用,來達到進程間的同步及互斥。
(6)、內(nèi)存映射:內(nèi)存映射允許任何多個進程間通信,每一個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現(xiàn)它。
(7)、信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
(8)、套接字(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。
什么是虛擬內(nèi)存。
虛擬地址、邏輯地址、線性地址、物理地址的區(qū)別。
推薦書籍:《深入理解現(xiàn)代操作系統(tǒng)》
TCP/IP
TCP與UDP的區(qū)別。
UDP:數(shù)據(jù)打包,有限制,不連接,效率高,不可靠
TCP:建立數(shù)據(jù)通道,無限制,效率低,可靠
TCP報文結(jié)構(gòu)。
TCP的三次握手與四次揮手過程,各個狀態(tài)名稱與含義,TIMEWAIT的作用。
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是 面向連接的協(xié)議,也就是說在收發(fā)數(shù)據(jù)之前,必須先和對方建立連接,一個TCP連接必須要經(jīng)過三次“對話”才能建立起來,其中的過程非常復(fù)雜,只簡單的 描述下這三次對話的簡單過程:主機A向主機B發(fā)出連接請求數(shù)據(jù)包:“我想給你發(fā)數(shù)據(jù),可以嗎?”,這是第一次對話;主機B向主機A發(fā)送同意連接和要求同步 (同步就是兩臺主機一個在發(fā)送,一個在接收,協(xié)調(diào)工作)的數(shù)據(jù)包:“可以,你什么時候發(fā)?”,這是第二次對話;主機A再發(fā)出一個數(shù)據(jù)包確認主機B的要求同 步:“我現(xiàn)在就發(fā),你接著吧!”,這是第三次對話。三次“對話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步,經(jīng)過三次“對話”之后,主機A才向主機B正式發(fā)送數(shù) 據(jù)。
需要了解的信息:
ACK : TCP協(xié)議規(guī)定,只有ACK=1時有效,也規(guī)定連接建立后所有發(fā)送的報文的ACK必須為1
SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應(yīng)在響應(yīng)報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連接請求或連接接受報文。
FIN (finis)即完,終結(jié)的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放連接。
三次握手:
三次握手
**第一次握手:**主機A發(fā)送位碼為syn=1,隨機產(chǎn)生seq number=10001的數(shù)據(jù)包到服務(wù)器,主機B由SYN=1知道,A要求建立聯(lián)機,此時狀態(tài)為SYN_SENT;
**第二次握手:**主機B收到請求后要確認聯(lián)機信息,向A發(fā)送ack number=(主機A的seq+1),syn=1,ack=1,隨機產(chǎn)生seq=20001的包,此時狀態(tài)由LISTEN變?yōu)镾YN_RECV;
**第三次握手:**主機A收到后檢查ack number是否正確,即第一次發(fā)送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發(fā)送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功,雙方狀態(tài)ESTABLISHED。
完成三次握手,主機A與主機B開始傳送數(shù)據(jù)
各個狀態(tài)名稱與含義
CLOSED: 這個沒什么好說的了,表示初始狀態(tài)。
LISTEN: 這個也是非常容易理解的一個狀態(tài),表示服務(wù)器端的某個SOCKET處于監(jiān)聽狀態(tài),可以接受連接了。
SYN_RECV: 這個狀態(tài)表示接受到了SYN報文,在正常情況下,這個狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態(tài),很短暫,基本 上用netstat你是很難看到這種狀態(tài)的,除非你特意寫了一個客戶端測試程序,故意將三次TCP握手過程中最后一個ACK報文不予發(fā)送。因此這種狀態(tài) 時,當收到客戶端的ACK報文后,它會進入到ESTABLISHED狀態(tài)。
SYN_SENT: 這個狀態(tài)與SYN_RECV遙想呼應(yīng),當客戶端SOCKET執(zhí)行CONNECT連接時,它首先發(fā)送SYN報文,因此也隨即它會進入到了SYN_SENT狀 態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個報文。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報文。
ESTABLISHED:這個容易理解了,表示連接已經(jīng)建立了。
四次揮手圖示(TCP的關(guān)閉):
TCP連接是全雙工的,可以同時發(fā)送和接受數(shù)據(jù),關(guān)閉的時候要關(guān)閉這兩個方向的通道
第一次揮手:Client給Server發(fā)送FIN,請求關(guān)閉連接
第二次揮手:Server收到FIN之后給Client返回確認ACK,同時關(guān)閉Receive通道,Client收到對自己的FIN確認后,關(guān)閉Send通道
第三次揮手: Server關(guān)閉連接,給Client發(fā)送FIN
第四次揮手:Client收到后給Server回復(fù)ACK確認,同時Client關(guān)閉Receive通道,進入TIME_WAIT狀態(tài)。Server接收到Client對自己的FIN的確認ACK,關(guān)閉Send通道
? FIN_WAIT_1: 這個狀態(tài)要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對方的FIN報文。而這兩種狀態(tài)的區(qū)別 是:FIN_WAIT_1狀態(tài)實際上是當SOCKET在ESTABLISHED狀態(tài)時,它想主動關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報文,此時該SOCKET即 進入到FIN_WAIT_1狀態(tài)。而當對方回應(yīng)ACK報文后,則進入到FIN_WAIT_2狀態(tài),當然在實際的正常情況下,無論對方何種情況下,都應(yīng)該馬 上回應(yīng)ACK報文,所以FIN_WAIT_1狀態(tài)一般是比較難見到的,而FIN_WAIT_2狀態(tài)還有時常常可以用netstat看到。
FIN_WAIT_2:上面已經(jīng)詳細解釋了這種狀態(tài),實際上FIN_WAIT_2狀態(tài)下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對方,我暫時還有點數(shù)據(jù)需要傳送給你,稍后再關(guān)閉連接。
TIME_WAIT: 表示收到了對方的FIN報文,并發(fā)送出了ACK報文,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下,收到了對方同時帶 FIN標志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)。
CLOSING: 這種狀態(tài)比較特殊,實際情況中應(yīng)該是很少見,屬于一種比較罕見的例外狀態(tài)。正常情況下,當你發(fā)送FIN報文后,按理來說是應(yīng)該先收到(或同時收到)對方的 ACK報文,再收到對方的FIN報文。但是CLOSING狀態(tài)表示你發(fā)送FIN報文后,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文。什 么情況下會出現(xiàn)此種情況呢?其實細想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時close一個SOCKET的話,那么就出現(xiàn)了雙方同時發(fā)送FIN報 文的情況,也即會出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接。
CLOSE_WAIT: 這種狀態(tài)的含義其實是表示在等待關(guān)閉。怎么理解呢?當對方close一個SOCKET后發(fā)送FIN報文給自己,你系統(tǒng)毫無疑問地會回應(yīng)一個ACK報文給對 方,此時則進入到CLOSE_WAIT狀態(tài)。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對方,如果沒有的話,那么你也就可以 close這個SOCKET,發(fā)送FIN報文給對方,也即關(guān)閉連接。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。
LAST_ACK: 這個狀態(tài)還是比較容易好理解的,它是被動關(guān)閉一方在發(fā)送FIN報文后,最后等待對方的ACK報文。當收到ACK報文后,也即可以進入到CLOSED可用狀態(tài)了。
? 為什么建立連接協(xié)議是三次握手,而關(guān)閉連接卻是四次握手呢?
這 是因為服務(wù)端的LISTEN狀態(tài)下的SOCKET當收到SYN報文的建連請求后,它可以把ACK和SYN(ACK起應(yīng)答作用,而SYN起同步作用)放在一 個報文里來發(fā)送。但關(guān)閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,所以你可以未 必會馬上會關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報文 和FIN報文多數(shù)情況下都是分開發(fā)送的。
? 為什么TIME_WAIT狀態(tài)還需要等2MSL后才能返回到CLOSED狀態(tài)?
因為雖然雙方都同意關(guān)閉連接了,而且握手的4個報文也都發(fā)送完畢,按理可以直接回到CLOSED 狀態(tài)(就好比從SYN_SENT 狀態(tài)到ESTABLISH 狀態(tài)那樣),但是我們必須假想網(wǎng)絡(luò)是不可靠的,你無法保證你(客戶端)最后發(fā)送的ACK報文一定會被對方收到,就是說對方處于LAST_ACK 狀態(tài)下的SOCKET可能會因為超時未收到ACK報文,而重發(fā)FIN報文,所以這個TIME_WAIT 狀態(tài)的作用就是用來重發(fā)可能丟失的ACK報文。
? 關(guān)閉TCP連接一定需要4次揮手嗎?
不一定,4次揮手關(guān)閉TCP連接是最安全的做法。但在有些時候,我們不喜歡TIME_WAIT 狀態(tài)(如當MSL數(shù)值設(shè)置過大導(dǎo)致服務(wù)器端有太多TIME_WAIT狀態(tài)的TCP連接,減少這些條目數(shù)可以更快地關(guān)閉連接,為新連接釋放更多資源),這時我們可以通過設(shè)置SOCKET變量的SO_LINGER標志來避免SOCKET在close()之后進入TIME_WAIT狀態(tài),這時將通過發(fā)送RST強制終止TCP連接(取代正常的TCP四次握手的終止方式)。但這并不是一個很好的主意,TIME_WAIT 對于我們來說往往是有利的。
TCP擁塞控制。
TCP滑動窗口與回退N針協(xié)議。
Http的報文結(jié)構(gòu)。
Http的狀態(tài)碼含義。
Http request的幾種類型。
Http1.1和Http1.0的區(qū)別
HTTP 協(xié)議?
答: HTTP 超文本傳輸協(xié)議,是一個屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。
Http怎么處理長連接。
Cookie與Session的作用于原理。
電腦上訪問一個網(wǎng)頁,整個過程是怎么樣的:DNS、HTTP、TCP、OSPF、IP、ARP。
Ping的整個過程。ICMP報文是什么。
C/S模式下使用socket通信,幾個關(guān)鍵函數(shù)。
IP地址分類。
常見的三種為ABC
IP地址的組成:網(wǎng)絡(luò)號段+主機號段
A類:第一號段為網(wǎng)絡(luò)號段+后三段的主機號段
一個網(wǎng)絡(luò)號:256256256 = 16777216
B類:前二號段為網(wǎng)絡(luò)號段+后二段的主機號段
一個網(wǎng)絡(luò)號:256*256 = 65536
C類:前三號段為網(wǎng)絡(luò)號段+后一段的主機號段
一個網(wǎng)絡(luò)號:256
D類 224.0.0.1—239.255.255.254
E類 240.0.0.1—247.255.255.254
路由器與交換機區(qū)別。
網(wǎng)絡(luò)其實大體分為兩塊,一個TCP協(xié)議,一個HTTP協(xié)議,只要把這兩塊以及相關(guān)協(xié)議搞清楚,一般問題不大。
推薦書籍:《TCP/IP協(xié)議族》
數(shù)據(jù)結(jié)構(gòu)與算法
鏈表與數(shù)組。
隊列和棧,出棧與入棧。
鏈表的刪除、插入、反向。
字符串操作。
Hash表的hash函數(shù),沖突解決方法有哪些。
各種排序:冒泡、選擇、插入、希爾、歸并、快排、堆排、桶排、基數(shù)的原理、平均時間復(fù)雜度、最壞時間復(fù)雜度、空間復(fù)雜度、是否穩(wěn)定。
快排的partition函數(shù)與歸并的Merge函數(shù)。
對冒泡與快排的改進。
二分查找,與變種二分查找。
二叉樹、B+樹、AVL樹、紅黑樹、哈夫曼樹。
二叉樹的前中后續(xù)遍歷:遞歸與非遞歸寫法,層序遍歷算法。
圖的BFS與DFS算法,最小生成樹prim算法與最短路徑Dijkstra算法。
KMP算法。
排列組合問題。
動態(tài)規(guī)劃、貪心算法、分治算法。(一般不會問到)
大數(shù)據(jù)處理:類似10億條數(shù)據(jù)找出最大的1000個數(shù)…等等
算法的話其實是個重點,因為最后都是要你寫代碼,所以算法還是需要花不少時間準備,這里有太多算法題,寫不全,我的建議是沒事多在OJ上刷刷題(牛客網(wǎng)、leetcode等),劍指offer上的算法要能理解并自己寫出來,編程之美也推薦看一看。
推薦書籍:《大話數(shù)據(jù)結(jié)構(gòu)》《劍指offer》《編程之美》
總結(jié)
以上是生活随笔為你收集整理的BAT经典面试题精简版(基础知识附答案)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 立项报告
- 下一篇: Windows Server 2019