Java開發崗位面試題歸類彙總,在微博看到的一篇文章,只有問題,沒有答案,我具體寫了一下每個問題大致的參考答案,僅供參考
一、Java基礎
1、String類爲什麼是final的
答:主要是爲了“效率” 和 “安全性” 的緣故。若 String允許被繼承, 由於它的被使用率很高, 可能會降低程序的性能,所以String被定義成final。Final可以修飾類、方法、屬性,分別代表類不可繼承,方法不可重寫,屬性值不可改變。其中對於屬性的修改,當final修飾基本數據類型,代表值不變。修飾引用類型代表指向對象不變。而static final指引用類型值和指向對象都不可變。
2、HashMap的源碼,實現原理、底層結構
答:HashMap直接繼承AbstractMap,基於哈希表的Map接口實現,此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。值得注意的是HashMap不是線程安全的,如果想要線程安全的HashMap,可以通過Collections類的靜態方法synchronizedMap獲得線程安全的HashMap。HashMap的底層主要是基於數組和鏈表來實現的,它之所以有相當快的查詢速度主要是因爲它是通過計算散列碼來決定存儲的位置。
3、說說你知道的幾個Java集合類:list、set、queue、map實現類
答:集合有兩個基本的接口,Collection和Map。Collction有幾個子接口:Set和List、Queue
Set:元素無序,不可重複的集合。HashSet(散列表)、TreeSet(紅黑樹)、LinkedHashSet等需要重寫(hashcode和equals方法,保證元素不可重)
List:元素有序、可重複的集合。LinkedList(雙向鏈表)和ArrayList底層實現是數組
Queue:隊列,常見的實現類有ArrayDeque等
Map:HashMap(Hash表)、HashTable(線程安全)和TreeMap(紅黑樹)http://cmsblogs.com
4、描述一下ArrayList和LinkedList各自實現和區別
答:ArrayList是由數組實現,適合查找
LinkedListjdk7之後是雙向鏈表,適合刪除、修改,效率比較高
5、Java中的隊列都有哪些,有什麼區別
答:java中的隊列的接口是Queue,分爲阻塞和非阻塞隊列,常用的隊列實現類有ArrayDueue等
6、反射中,Class.forName和classloader的區別
答:class.forName()前者除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。而classLoader只幹一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance纔會去執行static塊。
7、Java7、Java8的新特性
答; Java7:
1.switch可以接受string類型而不像以前僅僅是int;
2.異常catch可以一次處理完而不像以前一層層的surround;
3數值可以使用下劃線分隔;參考http://blog.csdn.net/chenleixing/article/details/47802653
Java8 參考我前面的文章
8、Java數組和鏈表兩種結構的操作效率,在哪些情況下(從頭開始,從結尾開始,從中間開始),哪些操作(插入、查找、刪除)的效率高
答:查找數組和鏈表的區別,自己理解
9、Java內存泄漏的問題調查定位:jmap,jstack的使用等等
答: jmap(查看內存),jstack(查看線程)參考:http://guafei.iteye.com/blog/1815222
10、string、stringbuilder、stringbuffer的區別
答:String不可變字符序列,string是值傳入,不是引用傳入。String類型中沒有append()方法,要追加字符串”+“即可。可以直接將字符串“test”複製給聲明的Stirng類的變量,而StringBuffer類的不行。String爲不可變對象,一旦被創建,就不能修改它的值;對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去。String是final類,即不能被繼承。
StringBuffer線程安全的可變字符序列 。 StringBuffer類的對象調用toString()方法將轉換爲String類型,是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象,它只能通過構造函數來建立。
StringBuilder非線程安全的可變字符序列 。 StringBuffer和StringBuilder這兩者的方法沒有很大區別。但在線程安全性方面,StringBuffer允許多線程進行字符操作。這是因爲在源代碼中StringBuffer的很多方法都被關鍵字 synchronized 修飾了,而StringBuilder沒有。 StringBuilder的效率比StringBuffer稍高,如果不考慮線程安全,StringBuilder應該是首選。另外,JVM運行程序主要的時間耗費是在創建對象和回收對象上。
11、hashtable和hashmap的區別
答:Hashtable底層實現是紅黑樹,是線程安全的,hashmap底層實現是hash表,即數組加鏈表的形式,非線程安全的。一般使用hashmap,他的效率一般比hashtable高。
12、異常的結構,運行時異常和非運行時異常,各舉例子
答:異常對象都是派生於Throwable類的一個實例,有兩個子類,error和Exception。
Error類層次結構描述了Java運行時系統的內部錯誤和資源耗盡錯誤。
Exception是程序本身可以處理的異常。 RuntimeException和 IOException等子類,可以分爲檢查異常和非檢查異常。
檢查異常,即非運行時異常,編譯器要求必須處置的異常, 除了Error,RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,否則編譯不會通過。
非檢查異常有:包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等
13、String類的常用方法
答:兩個類方法format和ValueOf,成員方法:charAt,CompareTo、length和toLowerCase、equals、toString等
14、Java的引用類型有哪幾種
答:類、對象和數組
15、抽象類和接口的區別
答:抽象類:不可以被實例化、抽象類具有構造器(凡是類都有構造器)、抽象方法所在的類一定是抽象類,抽象類中可以 抽象方法。Java中只支持單繼承,使用extends關鍵字。Abstract不能用來修飾屬性、構造器。不能有private、final和static修飾
接口:主要用來定義規範,解除耦合關係。接口中只能有常量和抽象方法,方法只能聲明(Java8,接口中能有方法體),接口只能用public修飾
16、Java的基礎類型和字節大小
答:java有8中基本類型,採用的是Unicode編碼方案,每個中文字符代表兩個字節
類型 |
字節 |
默認值 |
解釋 |
short |
2 |
0 |
|
int |
4 |
0 |
-2^32~2^32-1 |
long |
8 |
0 |
|
boolean |
1 |
false |
不能和其他類型相互轉換 |
float |
4 |
0.0 |
|
double |
8 |
0.0 |
|
char |
2 |
0 |
|
byte |
1 |
0 |
|
17、Hashtable,HashMap,ConcurrentHashMap底層實現原理和線程安全問題
答:Hashtable底層實現紅黑樹、線程安全
HashMap是hash表,非線程安全,比Hashtable效率高
ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成,Segment是一種可重入鎖ReentrantLock,線程安全。
18、如果不讓你用Java Jdk提供的工具,你自己實現一個Map,你怎麼做。可以說下hashMap的實現原理
答:參考http://www.cnblogs.com/xwdreamer/archive/2012/05/14/2499339.html
19、Hash衝突怎麼辦?哪些解決散列衝突的方法
答:對於hash衝突有四種解決方法:開放地址法、再散列、鏈地址法和建立一個公共溢出區
20、HashMap衝突很厲害,最差性能,你會怎麼解決,從O(n)提升到log(n)
答:定義好初始容量和負載因子。參考 http://www.2cto.com/kf/201505/399352.html
21、rehash:
答:主要是解決衝突的方法之一,當衝突過多,會重新利用第二個散列函數,這樣比較耗時
22、hashCode()與equals生成算法、方法怎麼重寫
答 :參考 http://blog.csdn.net/jiangwei0910410003/article/details/22739953