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