一. Java SE基礎知識點總結
1. Java的8種基本數據相關的知識點。
數據類型位數默認值包裝類
long640LLong
int320Integer
short16(short)0Short
byte8(byte)0Byte
char16\u0000Character
float320.0fFloat
double640.0dDouble
boolean—falseBoolean
解析:需要說明的是\u開頭的是一個Unicode碼的字符,每一個\u0000都代表了一個空格''。
2. switch能否用string做參數?
解析:switch的參數不可以是string。switch是用"="進行比較,而string沒有"="的概念,只有strcmp。
3. equals與==的區別。
解析:簡單理解,基本數據類型之間的比較,應該使用==,因為它們比較的是值。引用數據類型在用==進行比較的時候,比較的是它們在堆內存中的存放地址,而equals比較的是堆內存中存放的內容。[Object類中提供的equals()默認是比較地址的]
4. Object有哪些公用方法?
方法名稱類型描述
public Object()構造方法構造方法
public boolean equals(Object obj)普通方法對象比較
public int hashCode()普通方法取得Hash碼
public String toString()普通方法對象打印時調用
解析:Object類提供的hashCode()默認實現確實保證每個對象的hash碼不同(在對象的內存地址基礎上經過特定算法返回一個hash碼)。
5. Java的四種引用"強軟弱虛"以及用到的場景 [7][8][9][10]。
解析:現在首先思考一個問題,為什么引用還要分類呢?答案:合理的使用引用可以幫助垃圾回收器更好的管理Java內存。
強引用(Strong Reference):如果一個對象具有強引用,那垃圾回收器絕不會回收它。當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題。[使用最普遍的引用]
軟引用(Soft Reference):如果一個對象只具有軟引用,則內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。[通常用來實現內存敏感的高速緩存]
弱引用(Weak Reference):只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。[通常用于Debug、內存監視工具等程序中]
虛引用(Phantom Reference):如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。[通常用來跟蹤對象被垃圾回收的活動]
6. hashCode的作用 [11]。
解析:Java中的集合有2類,分別是List,Set。現在我們考慮Set,即元素不能重復。但是,如何判斷元素是否重復呢?容易想到的方法就是Object.equals()。現在會遇到一個問題,那就是當元素很多時,后添加到集合中的元素比較的次數就非常多。這樣hashCode就派上用場了,它返回一個對象存儲的物理地址(實際可能并不是這樣的,總之是對象唯一的標識符)。當Set要添加新元素時,首先調用這個元素的hashCode(),就能定位到它應該放置的位置。如果這個位置上沒有元素,它就可以直接存儲在這個位置上;如果這個位置上已經有元素了,
就調用它的equals()與新元素進行比較,如果相同就不存儲了,否則就散列其它的地址存儲。這樣一來實際調用equals()的次數就大大降低了,幾乎只需要一兩次。因此,如果兩個對象相同,那么它們的hashCode值一定要相同;如果兩個對象的hashCode相同,那么它們并不一定相同。
7. ArrayList、LinkedList、Vector的區別 [12]。
解析:
ArrayList和Vector可以看作數組,而LinkedList可以看作鏈表;
ArrayList屬于新的操作類,異步處理,非線程安全,只能使用Iterator,foreach輸出;
Vector屬于舊的操作類,同步處理,線程安全,只能使用Iterator,foreach,Enumeration輸出。
8. String、StringBuffer與StringBuilder的區別 [13]。
解析:
String:字符串常量;
StringBuffer:字符串變量,線程安全的操作類;
StringBuilder:字符串變量,非線程安全的操作類。
9. Map、Set、List、Queue、Stack等的相關知識點。
解析:類集對于Java開發極其重要,務必精通類集。Java中的類集相當于C++中的STL和Boost等類庫。
接口或類描述
Collection是存放一組單值的最大父接口,在新的開發標準中已經很少直接使用此接口進行操作了。
List是Collection接口的子接口,對其進行了大量的擴充,里面的內容是允許重復的。
Set是Collection接口的子接口,沒有對其進行擴充,里面的內容是不允許重復的。
Map是存放一對值的最大父接口,即接口中的每個元素都是一對的,以key—>value的形式保存。
Iterator集合的輸出接口,用于輸出集合中的內容,只能進行從前到后的單向輸出。
ListIterator是Iterator的子接口,可以進行由前向后或由后向前的雙向輸出。
Enumeration是最早的輸出接口,用于輸出指定集合中的內容。
SortedSet單指的排序接口,實現此接口的集合類,里面的內容可以使用比較器排序。
SortedMap存放一對值的排序接口,實現此接口的集合類,里面的內容按照key排序,使用比較器排序。
Queue隊列接口,此接口的子類可以實現隊列操作。
Map.EntryMap的內部接口,每個Map.Entry對象都保存著一對key->value的內容,每個Map接口中都保存有多個Map.Entry接口實例。
HashMap無序存放的,是新的操作類,key不允許重復。
Hashtable無序存放的,是舊的操作類,key不允許重復。
TreeMap可以排序的Map集合,按集合中的key排序,key不允許重復。
WeakHashMap若引用的Map集合,當集合中的某些內容不再使用時清除掉無用的數據,使用gc進行回收。
IdentityHashMapkey可以重復的Map集合。
Stackk可以完成先進后出的操作。
10. HashMap和Hashtable的區別。
解析:
比較點HashMapHashtable
推出時間JDK 1.2之后推出,屬于新的操作類JDK 1.0時推出,屬于舊的操作類
性能采用異步處理方式,性能更高使用同步處理方式,性能較低
線程安全屬于非線程安全的操作類屬于線程安全的操作類
空鍵允許將key設置為null
不允許將key設置為null,否則將出現Null Pointer Exception
11. HashMap和ConcurrentHashMap的區別及源碼分析。
解析:
HashMap因為采用的是異步處理方式,所以是非安全的操作類。
ConcurrentHashMap在多線程中是安全的操作類,那與Hashtable的區別是什么呢?Hashtable采用的是單個鎖,而它采用的是多個鎖,在并發控制方面比Hashtable更加的優化和高效。
至于HashMap和ConcurrentHashMap的源碼分析,推薦博客 [14][15]。
12. TreeMap、HashMap、LinkedHashMap的區別 [16]。
解析:java.util.Map接口有四個實現類,分別是HashMap,Hashtable,LinkedHashMap和TreeMap。
TreeMap:可以按照自然順序或自定義順序都key進行排序。
HashMap:在Map中插入、刪除和定位元素,它是最好的選擇。
LinkedHashMap:它是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現。
13. Collection與Collections的區別。
解析:
Collection是個java.util下的接口,它是各種集合結構(Set,List,Map等)的父接口。
Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
14. 在try catch finally中,如果try里有return,那么finally還會執行么 [17]?
解析:
任何執行try或者catch中的return語句之前,都會先執行finally語句;
如果finally中有return語句,那么程序就return了。因此,finally中的return是一定會被return的;
在finally中最好不要包含return,否則程序會提前退出,返回值不是try或catch中的返回值。
15. Excption與Error等相關的知識點。Out Of Memory(OOM)你遇到過哪些情況,Stack Over Flow(SOF)你遇到過哪些情況。
解析:
異常的最大父類是Throwable,它包含2個子類,分別是Exception,Error。Exception表示程序處理的異常,而Error表示JVM錯誤,一般不由程序開發人員處理;
Out Of Memory(OOM):引起OOM主要有2個原因,分別是內存泄漏和內存溢出(即堆溢出和棧溢出) [19][20]。
Stack Over Flow(SOF):(堆)棧溢出主要發生在遞歸的調用中 [21]。
OOM和SOF:遞歸調用可以導致棧溢出,不斷創建對象可以導致堆溢出。
16. Java面向對象的三個特征與含義。
解析:
封裝性:它是將類的一些敏感信息隱藏在類的類部,不讓外界直接訪問到,但是可以通過getter()和setter()間接訪問。
繼承性:子類通過一種方式來接受父類所有的公有的,受保護的成員變量和成員方法。
多態性:程序在運行的過程中,同一種類型在不同的條件下表現不同的結果,這種不定狀態的表現形式稱為多態性。
17. Override和Overload的含義和區別 [22]。
解析:方法的重寫(Override)和重載(Overload)是Java多態性的不同表現。
區別:重寫(Override)是父類與子類之間多態性的一種表現,而重載(Overload)是一個類中多態性的一種表現。如果在子類中定義某方法與其
重寫(Override):父類有相同的名稱和參數,我們說該方法被重寫 (Override)。子類的對象使用這個方法時,將調用子類中的定義,而父類中的定義如同被屏蔽了。
重載(Overload):如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載(Overload)。
18. interface與abstract類的區別。
解析:
區別點抽象類接口
定義包含一個抽象方法的類抽象方法和全局常量的集合
組成構造方法,抽象方法,普通方法,常量,變量常量,抽象方法
使用子類繼承抽象類(extends)子類實現接口(implements)
關系抽象類可以實現多個接口接口不能繼承抽象類,但是允許繼承多個接口
常見設計模型模板設計工廠設計,代理設計
對象都通過對象的多態性產生實例化對象
局限抽象類有單繼承的局限接口沒有此局限
實際作為一個模板作為一個標準或表示一種能力
選擇如果抽象類和接口都可以使用,則優先使用接口,避免單繼承的局限
特殊一個抽象類中可以包含多個接口,一個接口中可以包含多個抽象類
19. Static class 與non static class的區別 [23]。
解析:在Java中可以有靜態實例變量、靜態方法、靜態塊,當然也可以有靜態類,但是用static不能修飾頂級類,只能修飾內部類。
靜態內部類和非靜態內部類究竟有什么區別呢?
內部靜態類不需要有指向外部類的引用,因為用static聲明的靜態內部類變成了外部類,但是非靜態內部類需要持有對外部類的引用;
非靜態內部類能夠訪問外部類的靜態和非靜態成員(數據成員和成員函數),但是靜態內部類只能訪問外部類的靜態成員(數據成員和成員函數);
非靜態內部類不能脫離外部類實體被創建,但是非靜態內部類可以訪問外部類的數據和函數,因為它就在外部類里面;
如果在方法中定義的內部類要想訪問方法中的參數,那么必須在參數前加上final關鍵字。
20. Java多態的實現原理 [24]。
解析:
靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。
21. 實現多線程的兩種方法:Thread與Runable。
解析:
Thread類:它是在java.lang包中定義的,一個類只要繼承了Thread類,此類就稱為多線程實現類。在Thread子類中,必須明確地覆寫Thread類中的run(),因為此方法為線程的主體。
Runable接口:在Java中也可以通過實現Runnable接口的方式實現多線程,Runnable接口中只定義了一個抽象方法:public void run()。
區別:通過public class Thread extends Object implements Runnable發現,Thread類也是Runnable接口的子類,但是在Thread類中并沒有完全地實現Runnable接口中的run(),而是調用的Runnable接口中的run()。因此,如果通過繼承Thread類實現多線程,那么必須覆寫run()。實際上,Runnable接口相對于Thread類來說更適合多個相同程序代碼的線程去處理同一資源的情況。
22. 線程同步的方法:sychronized、lock、reentrantLock、Atomic等 [25][26]。
解析:synchronized是jvm虛擬機的關鍵字,在java.util.concurrent.locks命名空間中還有一個Lock接口,和Lock接口的實現類ReentrantLock(可重入鎖)。
如果資源競爭不是很激烈,偶爾會有同步的情形,那么synchronized是非常合適的選擇;
ReentrantLock提供了多樣化的同步,比如有可以被Interrupt的同步(synchronized的同步是不能被Interrupt的)等。如果資源競爭不是很激烈,那么它的性能稍微比synchronized差點兒。但是,當資源競爭很激烈的時候,synchronized是非常合適的選擇;
與ReentrantLock的情況類似,如果資源競爭不是很激烈,那么它的性能稍微比synchronized差點兒。但是,當資源競爭很激烈的時候,Atomic的性能會優于ReentrantLock一倍左右。但是,它也有一個缺點,那就是只能同步一個值。
23. 鎖的等級:對象鎖(方法鎖)、類鎖等相關知識點 [27]。
解析:簡單來說,就是兩個鎖的粒度不同。對象鎖的粒度是對象,而類鎖的對象是類。
對象鎖就是在一個類的方法前面加synchronized關鍵字(對象的方法);
類鎖就是在一個類的方法前面加synchronized static關鍵字(類的方法)。
24. 寫出生產者和消費者模式 [28]。
解析:
問題過程:生產者用于將消息放入緩沖區,而消費者用于從緩沖區中取出消息。問題出現在當緩沖區已經滿了,而此時生產者還想向其中放入一個新的數據項的情形,其解決方法是讓生產者此時進行休眠,等待消費者從緩沖區中取走了一個或者多個數據項后再去喚醒它。同樣地,當緩沖區已經空了,而消費者還想去取數據項,此時可以讓消費者進行休眠,等待生產者放入一個或者多個數據項時再喚醒它。問題本質:生產者和消費者模式考察的知識點是Java中的多線程,解決的問題是兩個進程如何共享同一個資源(緩沖區)。
(1)PublicResource.java如下所示:
1/**
2? * 生產者線程,功能是向緩沖區中放入數據項
3? */4publicclassProducerThreadimplementsRunnable{5privatePublicResource resource;67publicProducerThread(PublicResource resource) {8this.resource = resource;9}1011@Override12publicvoidrun() {13for(inti =0; i <10; i++) {14try{15Thread.sleep((long) (Math.random() *1000));16}catch(InterruptedException e) {17e.printStackTrace();18}19resource.increase();20}21}22}View Code
(2)ProducerThread.java如下所示:
1/**
2? * 生產者線程,功能是向緩沖區中放入數據項
3? */4publicclassProducerThreadimplementsRunnable{5privatePublicResource resource;67publicProducerThread(PublicResource resource) {8this.resource = resource;9}1011@Override12publicvoidrun() {13for(inti =0; i <10; i++) {14try{15Thread.sleep((long) (Math.random() *1000));16}catch(InterruptedException e) {17e.printStackTrace();18}19resource.increase();20}21}22}View Code
(3)ConsumerThread.java如下所示:
1publicclassConsumerThreadimplementsRunnable{2publicPublicResource resource;34publicConsumerThread (PublicResource resource) {5this.resource = resource;6}78@Override9publicvoidrun() {10for(inti =0; i <10; i++) {11try{12Thread.sleep((long) (Math.random() *1000));13}catch(InterruptedException e) {14e.printStackTrace();15}16resource.decrease();17}18}19}View Code
(4)ProducerConsumerTest如下所示:
1publicclassProducerConsumerTest{2publicstaticvoidmain(String[] args) {3PublicResource resource =newPublicResource();45newThread(newProducerThread(resource)).start();6newThread(newConsumerThread(resource)).start();7newThread(newProducerThread(resource)).start();8newThread(newConsumerThread(resource)).start();9newThread(newProducerThread(resource)).start();10newThread(newConsumerThread(resource)).start();11}12}View Code
25. ThreadLocal的作用 []。
解析:
ThreadLocal并不是一個Thread,而是一個Thread的局部變量。它的作用是為每個使用該變量的線程都提供一個變量的副本,每個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每個線程都完全擁有該變量一樣。[public class java.lang.ThreadLocal extends Object]
26. ThreadPool的作用 [29]。
解析:
ThreadPool顧名思義就是線程的容器,和數據庫中連接池的概念類似。它的作用是減少創建和銷毀線程的額外開銷,并且最大程度地利用線程。Java中自帶的線程池類:public class java.util.concurrent.ThreadPoolExecutor extends AbstractExecutorService。
27. Concurrent中的ArrayBlockingQueue、CountDownLatch等 [31]。
解析:
ArrayBlockingQueue:阻塞隊列是指一個指定長度的隊列,如果隊列滿了,那么添加新元素的操作會被阻塞等待,直到有空位為止。同樣,當隊列為空的時候,請求隊列元素的操作同樣會被阻塞等待,直到有可用元素為止。[public class java.util.concurrent.ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, Serializable]
CountDownLatch:可以看作是一個倒數計數的鎖,當計數為0時觸發特定的事件,這樣我們就可以讓主線程等待子線程的結束。[public class java.util.concurrent.CountDownLatch extends Object]
28. wait()和sleep()的區別。
解析:
sleep()來自Thread類,而wait()來自Object類;
sleep()必須捕獲異常,而wait()不需要捕獲異常;
sleep()不釋放同步鎖,而wait()釋放同步鎖。
29. Java NIO與IO的區別 [32]。
解析:
Java NIO是面向塊的,而Java IO是面向流的;
Java NIO是非阻塞的I/O,而Java IO是阻塞的I/O。
30. 反射機制相關的知識點。
解析:通過反射機制可以取得一個類所繼承的父類,實現的接口,類中的全部構造方法,全部的普通方法和全部的屬性。
31. List類型的變量能否直接賦值給List類型的變量 [33]。
解析:不能。因為泛型中不存在繼承關系。
32. Java 1.8的新特性 [34]。
33. 23種設計模式。
34. JNI的使用。
二. JVM基礎知識點總結
1. 內存模型以及分區,需要詳細到每個區放什么。
2. 堆里面的分區:Eden,survival from to,老年代,各自的特點。
3. 對象創建方法,對象的內存分配,對象的訪問定位。
4. GC的兩種判定方法:引用計數與引用鏈。
5. GC的三種收集方法:標記清除、標記整理、復制算法的原理與特點,分別用在什么地方,如果讓你優化收集方法,有什么思路?
6. GC收集器有哪些?CMS收集器與G1收集器的特點。
7. Minor GC與Full GC分別在什么時候發生?
8. 幾種常用的內存調試工具:jmap、jstack、jconsole。
9. 類加載的五個過程:加載、驗證、準備、解析、初始化。
10. 雙親委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。
11. 分派:靜態分派與動態分派。
三. 操作系統總結
1. 進程和線程的區別。
2. 死鎖的必要條件,怎么處理死鎖。
3. Window內存管理方式:段存儲,頁存儲,段頁存儲。
4. 進程的幾種狀態。
5. IPC幾種通信方式。
6. 什么是虛擬內存。
7. 虛擬地址、邏輯地址、線性地址、物理地址的區別。
四. 計算機網絡總結
1. OSI與TCP/IP各層的結構與功能,都有哪些協議。
2. TCP與UDP的區別。
3. TCP報文結構。
4. TCP的三次握手與四次揮手過程,各個狀態名稱與含義,TIMEWAIT的作用。
5. TCP擁塞控制。
6. TCP滑動窗口與回退N針協議。
7. Http的報文結構。
8. Http的狀態碼含義。
9. Http request的幾種類型。
10. Http1.1和Http1.0的區別。
11. Http怎么處理長連接。
12. Cookie與Session的作用于原理。
13. 電腦上訪問一個網頁,整個過程是怎么樣的:DNS、HTTP、TCP、OSPF、IP、ARP。
14. Ping的整個過程。ICMP報文是什么。
15. C/S模式下使用socket通信,幾個關鍵函數。
16. IP地址分類。
17. 路由器與交換機區別。
五. 數據結構和算法
1. 鏈表與數組。
2. 隊列和棧,出棧與入棧。
3. 鏈表的刪除、插入、反向。
4. 字符串操作。
5. Hash表的hash函數,沖突解決方法有哪些。
6. 各種排序:冒泡、選擇、插入、希爾、歸并、快排、堆排、桶排、基數的原理、平均時間復雜度、最壞時間復雜度、空間復雜度、是否穩定。
7. 快排的partition函數與歸并的Merge函數。
8. 對冒泡與快排的改進。
9. 二分查找,與變種二分查找。
10. 二叉樹、B+樹、AVL樹、紅黑樹、哈夫曼樹。
11. 二叉樹的前中后續遍歷:遞歸與非遞歸寫法,層序遍歷算法。
12. 圖的BFS與DFS算法,最小生成樹prim算法與最短路徑Dijkstra算法。
13. KMP算法。
14. 排列組合問題。
15. 動態規劃、貪心算法、分治算法。
16. 大數據處理:類似10億條數據找出最大的1000個數等。
六. 計算機組成原理總結
七. 數據庫原理總結
參考文獻:
[1] 面試心得與總結:http://www.nowcoder.com/discuss/3043
[2] 《Java開發實戰經典》
[3] 《Java編程思想》
[4] 《Java核心技術》(第8版)
[5] 《Java編程思想》
[6] 常見的數據庫基礎面試題大全:http://www.it165.net/database/html/201111/1146.html
[7] Java的四種引用:http://www.cnblogs.com/ymind/archive/2012/05/04/2483590.html
[8] Java中弱引用和軟引用的區別以及虛引用和強引用介紹:http://www.jb51.net/article/49085.htm
[9] Java中四種引用(強、軟、弱、虛):http://www.xuebuyuan.com/1772186.html
[10] 強引用、弱引用、軟引用、虛引用:http://my.oschina.net/ydsakyclguozi/blog/404389
[11] 關于hashCode()的作用:http://my.oschina.net/91jason/blog/306996
[12] ArrayList、LinkedList、Vector區別與用法:http://www.cnblogs.com/mgod/archive/2007/08/05/.html
[13] StringBuffer與StringBuilder區別:http://zhidao.baidu.com/link?url=OgV7TUaFr8h4wGP1uI7xA0Z2nB6S9ZdEw5rPFFFFtF-VX3Q_WEWchmISKeowomV2R5YQiMqW4Zb1astS-at5R_
[14] ConcurrentHashMap:http://www.cnblogs.com/yydcdut/p/3959815.html
[15] HashMap與ConcurrentHashMap的區別:http://blog.csdn.net/xuefeng0707/article/details/40834595
[16] HashMap,LinkedMap,TreeMap的區別:http://blog.sina.com.cn/s/blog_5ded2e5b01011pn5.html
[17] 有return的情況下try catch finally的執行順序:http://blog.csdn.net/kavensu/article/details/8067850
[18] 深入理解java異常處理機制:http://blog.csdn.net/hguisu/article/details/6155636
[19] 關于OOM的那些事兒:http://www.cnblogs.com/gaojing/archive/2012/10/30/2844938.html
[20] Java常見內存溢出(OOM)解決方案:http://www.tuicool.com/articles/myuQ7b
[21] Java內存溢出示例(堆溢出、棧溢出):http://www.jb51.net/article/49485.htm
[22] Overload與Override的區別:http://www.cnblogs.com/whgw/archive/2011/10/01/2197083.html