概述題
本人對網上的一些面試題作了一些整理,但願對你們面試有幫助
JAVA 基礎
1.如何在JVM虛擬機掛掉的時候,作一些操做,例如發郵件通知?我的總結
可使用Runtime裏面的addShutdownHook(Thread hook)方法,把JVM掛掉的時候所須要啓動的線程註冊到runtime中,就能夠幫你完成這個動做
2.HashSet 和HashMap的關係(深刻源碼) 我的總結
-
經過如下HashSet源碼能夠得知,HashSet 內部其實就是一個HashMap,但HashSet只是用到HashMap的key,而沒有用倒HashMap的value
-
-
-
-
-
-
-
3.String類爲何是final的。
-
String是全部語言中最經常使用的一個類。咱們知道在Java中,String是不可變的、final的。Java在運行時也保存了一個字符串池(String pool),這使得String成爲了一個特別的類。
-
-
-
-
只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現能夠在運行時節約不少heap空間,由於不一樣的字符串變量都指向池中的同一個字符串。但若是字符串是可變的,那麼
String interning將不能實現(譯者注:String interning是指對不一樣的字符串僅僅只保存一個,即不會保存多個相同的字符串。),由於這樣的話,若是變量改變了它的值,那麼其它指向這個值的變量的值也會一塊兒改變。
-
若是字符串是可變的,那麼會引發很嚴重的安全問題。譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來得到數據庫的鏈接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。由於字符串是不可變的,因此它的值是不可改變的,不然黑客們能夠鑽到空子,改變字符串指向的對象的值,形成安全漏洞。
-
由於字符串是不可變的,因此是多線程安全的,同一個字符串實例能夠被多個線程共享。這樣便不用由於線程安全問題而使用同步。字符串本身即是線程安全的。
-
類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個值被改爲了myhacked.Connection,那麼會對你的數據庫形成不可知的破壞。
-
由於字符串是不可變的,因此在它建立的時候hashcode就被緩存了,不須要從新計算。這就使得字符串很適合做爲
Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵每每都使用字符串。
4.HashMap的源碼,實現原理,底層結構
參考:http://blog.csdn.net/vking_wang/article/details/14166593
http:
5.反射中,Class.forName和classloader的區別
轉自:http://www.linuxidc.com/Linux/2014-01/94895.htmhtml
-
Java中
class.forName和classLoader均可用來對類進行加載。前者除了將類的.class文件加載到jvm中以外,還會對類進行解釋,執行類中的static塊。而classLoader只幹一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance纔會去執行static塊。Class.forName(name, initialize, loader)帶參函數也可控制是否加載static塊。而且只有調用了newInstance()方法採用調用構造函數,建立類的對象 示例代碼以下:
-
-
package com.blueray.java.test;
-
-
public class ClassLoaderTest {
-
-
-
-
-
public static void main(String[] args) {
-
ClassLoader classLoader=StaticSample.class.getClassLoader();
-
-
System.out.println(
"Before load class");
-
Class clazz=classLoader.loadClass(StaticSample.class.getName());
-
System.out.println(
"After load class.");
-
System.out.println(
"executing newInstance");
-
-
}
catch (ClassNotFoundException e) {
-
-
}
catch (InstantiationException e) {
-
-
-
}
catch (IllegalAccessException e) {
-
-
-
-
-
-
-
-
-
-
package com.blueray.java.test;
-
-
public class StaticSample {
-
-
System.out.println(StaticSample.class.getName()+
" is loading the static block");
-
-
-
System.out.println(
"StaticSample Constructor is executing.");
-
-
-
-
-
-
-
-
-
-
-
com.blueray.java.test.StaticSample is loading the static block
-
StaticSample Constructor is executing.
6.說說你知道的幾個Java集合類:list、set、queue、map實現類
參考:http://www.cnblogs.com/LittleHann/p/3690187.html?utm_source=tuicool&utm_medium=referral
7.描述一下ArrayList和LinkedList各自實現和區別
轉自:http://www.importnew.com/6629.html
-
LinkedeList和ArrayList都實現了List接口,可是它們的工做原理卻不同。它們之間最主要的區別在於ArrayList是可改變大小的數組,而LinkedList是雙向連接串列(doubly LinkedList)。ArrayList更受歡迎,不少場景下ArrayList比LinkedList更爲適用。這篇文章中咱們將會看看LinkedeList和ArrayList的不一樣,並且咱們試圖來看看什麼場景下更適宜使用LinkedList,而不用ArrayList。
-
-
-
-
LinkedList和ArrayList的差異主要來自於
Array和LinkedList數據結構的不一樣。若是你很熟悉Array和LinkedList,你很容易得出下面的結論:
-
-
1) 由於Array是基於索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的。Array獲取數據的時間複雜度是O(1),可是要刪除數據倒是開銷很大的,由於這須要重排數組中的全部數據。
-
-
2) 相對於ArrayList,LinkedList插入是更快的。由於LinkedList不像ArrayList同樣,不須要改變數組的大小,也不須要在數組裝滿的時候要將全部的數據從新裝入一個新的數組,這是ArrayList最壞的一種狀況,時間複雜度是O(n),而LinkedList中插入或刪除的時間複雜度僅爲O(1)。ArrayList在插入數據時還須要更新索引(除了插入數組的尾部)。
-
-
3) 相似於插入數據,刪除數據時,LinkedList也優於ArrayList。
-
-
4) LinkedList須要更多的內存,由於ArrayList的每一個索引的位置是實際的數據,而LinkedList中的每一個節點中存儲的是實際的數據和先後節點的位置。
-
-
什麼場景下更適宜使用LinkedList,而不用ArrayList
-
-
我前面已經提到,不少場景下ArrayList更受歡迎,可是還有些狀況下LinkedList更爲合適。譬如:
-
-
1) 你的應用不會隨機訪問數據。由於若是你須要LinkedList中的第n個元素的時候,你須要從第一個元素順序數到第n個數據,而後讀取數據。
-
-
2) 你的應用更多的插入和刪除元素,更少的讀取數據。由於插入和刪除元素不涉及重排數據,因此它要比ArrayList要快。
-
-
以上就是關於ArrayList和LinkedList的差異。你須要一個不一樣步的基於索引的數據訪問時,請儘可能使用ArrayList。ArrayList很快,也很容易使用。可是要記得要給定一個合適的初始大小,儘量的減小更改數組的大小。
8.Java中的隊列都有哪些,有什麼區別
轉自:http://blog.itpub.net/143526/viewspace-1060365/
9.Java七、Java8的新特性
轉自:http://blog.csdn.net/zhongweijian/article/details/9258997
10.Java數組和鏈表兩種結構的操做效率,在哪些狀況下(從開頭開始,從結尾開始,從中間開始),哪些操做(插入,查找,刪除)的效率高
參考:http://blog.csdn.net/a19881029/article/details/22695289
11.Java內存泄露的問題調查定位:jmap,jstack的使用等等
參考:http:
12.string、stringbuilder、stringbuffer區別
參考:http:
13.hashtable和hashmap的區別
參考:http://www.cnblogs.com/carbs/archive/2012/07/04/2576995.html
14.異常的結構,運行時異常和非運行時異常,各舉個例子
參考:http:
15.String 類的經常使用方法
轉自:http:
16.Java 的引用類型有哪幾種
參考:http://blog.csdn.net/coding_or_coded/article/details/6603549
17.抽象類和接口的區別
參考:http:
18.java的基礎類型和字節大小
參考:http://www.cnblogs.com/doit8791/archive/2012/05/25/2517448.html
-
Java基本類型共有八種,基本類型能夠分爲三類,字符類型
char,布爾類型boolean以及數值類型byte、short、int、long、float、double。數值類型又能夠分爲整數類型byte、short、int、long和浮點數類型float、double。JAVA中的數值類型不存在無符號的,它們的取值範圍是固定的,不會隨着機器硬件環境或者操做系統的改變而改變。實際上,JAVA中還存在另一種基本類型void,它也有對應的包裝類 java.lang.Void,不過咱們沒法直接對它們進行操做。8 中類型表示範圍以下:
-
-
byte:8位,最大存儲數據量是255,存放的數據範圍是-128~127之間。
-
-
short:16位,最大數據存儲量是65536,數據範圍是-32768~32767之間。
-
-
int:32位,最大數據存儲容量是2的32次方減1,數據範圍是負的2的31次方到正的2的31次方減1。
-
-
long:64位,最大數據存儲容量是2的64次方減1,數據範圍爲負的2的63次方到正的2的63次方減1。
-
-
float:32位,數據範圍在3.4e-45~1.4e38,直接賦值時必須在數字後加上f或F。
-
-
double:64位,數據範圍在4.9e-324~1.8e308,賦值時能夠加d或D也能夠不加。
-
-
boolean:只有true和false兩個取值。
-
-
char:16位,存儲Unicode碼,用單引號賦值。
19.Hashtable,HashMap,ConcurrentHashMap底層實現原理與線程安全問題
參考:http:
20.若是不讓你用Java Jdk提供的工具,你本身實現一個Map,你怎麼作。
http://www.cnblogs.com/xwdreamer/archive/2012/05/14/2499339.html
21.Hash衝突怎麼辦?哪些解決散列衝突的方法?
參考:http:
22.HashMap衝突很厲害,最差性能,你會怎麼解決?從O(n)提高到log(n)
參考:http://www.2cto.com/kf/201505/399352.html
理解了hashmap的實現,聰明的人確定已經知道怎麼更加高性能的使用hashmap。不過在此以前仍是先說明下初始容量和負載因子的含義。
Hashmap的設想是在O(1)的時間複雜度存取數據,根據咱們的分析,在最壞狀況下,時間複雜度極可能是o(n),但這確定極少出現。可是某個鏈表中存在多個元素仍是有至關大的可能的。當hashmap中的元素數量越接近數組長度,這個概率就越大。爲了保證hashmap的性能,咱們對元素數量/數組長度的值作了上限,此值就是負載因子。當比值大於負載因子時,就須要對內置數組進行擴容,從而提升讀寫性能。但這也正是問題的所在,對數組擴容,代價較大,時間複雜度時O(n)。
故咱們在hashmap須要存放的元素數量能夠預估的狀況下,預先設定一個初始容量,來避免自動擴容的操做來提升性能。
23.何時ReHash
參考:http://www.tuicool.com/articles/qqyENz
24.hashCode() 與 equals() 生成算法、方法怎麼重寫
1.hibernate和ibatis的區別
轉自:http://blog.csdn.net/cdh1213/article/details/5967405
-
-
-
-
hibernate 是當前最流行的o/r mapping框架,它出身於sf.net,如今已經成爲jboss的一部分了。
-
ibatis 是另一種優秀的o/r mapping框架,目前屬於apache的一個子項目了。
-
相對hibernate「o/r」而言,ibatis是一種「sql mapping」的orm實現。
-
hibernate對數據庫結構提供了較爲完整的封裝,hibernate的o/r mapping實現了pojo 和數據庫表之間的映射,以及sql 的自動生成和執行。程序員每每只需定義好了pojo 到數據庫表的映射關係,便可經過hibernate 提供的方法完成持久層操做。程序員甚至不須要對sql 的熟練掌握, hibernate/ojb 會根據制定的存儲邏輯,自動生成對應的sql 並調用jdbc 接口加以執行。
-
而ibatis 的着力點,則在於pojo 與sql之間的映射關係。也就是說,ibatis並不會爲程序員在運行期自動生成sql 執行。具體的sql 須要程序員編寫,而後經過映射配置文件,將sql所需的參數,以及返回的結果字段映射到指定pojo。
-
使用ibatis 提供的orm機制,對業務邏輯實現人員而言,面對的是純粹的java對象。
-
這一層與經過hibernate 實現orm 而言基本一致,而對於具體的數據操做,hibernate會自動生成sql 語句,而ibatis 則要求開發者編寫具體的sql 語句。相對hibernate而言,ibatis 以sql開發的工做量和數據庫移植性上的讓步,爲系統設計提供了更大的自由空間。
-
-
1.ibatis很是簡單易學,hibernate相對較複雜,門檻較高。
-
-
3.當系統屬於二次開發,沒法對數據庫結構作到控制和修改,那ibatis的靈活性將比hibernate更適合
-
4.系統數據處理量巨大,性能要求極爲苛刻,這每每意味着咱們必須經過通過高度優化的sql語句(或存儲過程)才能達到系統性能設計指標。在這種狀況下ibatis會有更好的可控性和表現。
-
5.ibatis須要手寫sql語句,也能夠生成一部分,hibernate則基本上能夠自動生成,偶爾會寫一些hql。一樣的需求,ibatis的工做量比hibernate要大不少。相似的,若是涉及到數據庫字段的修改,hibernate修改的地方不多,而ibatis要把那些sql mapping的地方一一修改。
-
6.以數據庫字段一一對應映射獲得的po和hibernte這種對象化映射獲得的po是大相徑庭的,本質區別在於這種po是扁平化的,不像hibernate映射的po是能夠表達立體的對象繼承,聚合等等關係的,這將會直接影響到你的整個軟件系統的設計思路。
-
7.hibernate如今已是主流o/r mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強於ibatis。
2.講講mybatis的鏈接池
參考:http:
3.spring框架中須要引用哪些jar包,以及這些jar包的用途
參考:http:
4.springMVC的原理
參考:http:
5.springMVC註解的意思
參考:http:
6. spring中beanFactory和ApplicationContext的聯繫和區別
-
-
-
1. BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係,負責bean的聲明週期。
-
2. ApplicationContext除了提供上述BeanFactory所能提供的功能以外,還提供了更完整的框架功能:
-
-
-
b. 資源訪問:Resource rs = ctx. getResource(「classpath:config.properties」), 「file:c:/config.properties」
-
c. 事件傳遞:經過實現ApplicationContextAware接口
-
3. 經常使用的獲取ApplicationContext的方法:
-
FileSystemXmlApplicationContext:從文件系統或者url指定的xml配置文件建立,參數爲配置文件名或文件名數組
-
ClassPathXmlApplicationContext:從classpath的xml配置文件建立,能夠從jar包中讀取配置文件
-
WebApplicationContextUtils:從web應用的根目錄讀取配置文件,須要先在web.xml中配置,能夠配置監聽器或者servlet來實現
-
-
<listener-
class>org.springframework.web.context.ContextLoaderListener</listener-class>
-
-
-
<servlet-name>context</servlet-name>
-
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
-
<load-on-startup>1</load-on-startup>
-
-
這兩種方式都默認配置文件爲web-inf/applicationContext.xml,也可以使用context-param指定配置文件
-
-
<param-name>contextConfigLocation</param-name>
-
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
-
7.spring注入的幾種方式
參考:http://developer.51cto.com/art/201207/348019.htm
8.spring如何實現事物管理的
參考:http:
9.springIOC
參考:http:
10.hibernate中的1級和2級緩存的使用方式以及區別原理(Lazy-Load的理解)
參考:http:
11.Hibernate的原理體系架構,五大核心接口,Hibernate對象的三種狀態轉換,事務管理
參考:http://www.cnblogs.com/shysunlove/archive/2012/11/21/2780240.html
多線程
1.Java建立線程以後,直接調用start()方法和run()的區別
參考:http:
2.經常使用的線程池模式以及不一樣線程池的使用場景
參考:http:
3.newFixedThreadPool此種線程池若是線程數達到最大值後會怎麼辦,底層原理
參考:http:
4.多線程之間通訊的同步問題,synchronized鎖的是對象,衍伸出和synchronized相關不少的具體問題,例如同一個類不一樣方法都有synchronized鎖,一個對象是否能夠同時訪問。或者一個類的static構造方法加上synchronized以後的鎖的影響。
參考:http://www.cnblogs.com/shipengzhi/articles/2223100.html
5.瞭解可重入鎖的含義,以及ReentrantLock 和synchronized的區別
http://outofmemory.cn/java/java.util.concurrent/synchronized-locks-Lock-ReentrantLock
6.同步的數據結構,例如concurrentHashMap的源碼理解以及內部實現原理,爲何他是同步的且效率高
參考:http:
7.atomicinteger和Volatile等線程安全操做的關鍵字的理解和使用
參考:http://www.cnblogs.com/dolphin0520/p/3920373.html
8.線程間通訊,wait和notify
參考:http://www.2cto.com/kf/201502/376021.html
10.場景:在一個主線程中,要求有大量(不少不少)子線程執行完以後,主線程才執行完成。多種方式,考慮效率
參考:http:
11.進程和線程的區別
參考:http:
12.什麼叫線程安全
線程安全:若是你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。若是每次運行結果和單線程運行的結果是同樣的,並且其餘的變量的值也和預期的是同樣的,就是線程安全的。或者說:一個類或者程序所提供的接口對於線程來講是原子操做或者多個線程之間的切換不會致使該接口的執行結果存在二義性,也就是說咱們不用考慮同步的問題
13.線程的幾種狀態
參考:http:
14.併發、同步的接口或方法
轉自:http://blog.csdn.net/woshisap/article/details/43119569
-
-
-
與每次須要時都建立線程相比,線程池能夠下降建立線程的開銷,這也是由於線程池在線程執行結束後進行的是回收操做,而不是真正的
-
-
-
-
-
-
ReentrantLock提供了tryLock方法,tryLock調用的時候,若是鎖被其餘線程持有,那麼tryLock會當即返回,返回結果爲
false,若是鎖沒有被
-
-
其餘線程持有,那麼當前調用線程會持有鎖,而且tryLock返回的結果是
true,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
保證了同一個變量在多線程中的可見性,因此它更可能是用於修飾做爲開關狀態的變量,由於
volatile保證了只有一份主存中的數據。
-
-
-
-
-
-
private AtomicInteger counter = new AtomicInteger();
-
-
-
-
return counter.incrementAndGet();
-
-
-
-
-
-
return counter.decrementAndGet();
-
-
-
-
-
-
AtomicInteger內部經過JNI的方式使用了硬件支持的CAS指令。
-
-
-
-
它是java.util.concurrent包中的一個類,它主要提供的機制是當多個(具體數量等於初始化CountDown時的count參數的值)線程都到達了預期狀態
-
-
或完成預期工做時觸發事件,其餘線程能夠等待這個事件來出發本身後續的工做,等待的線程能夠是多個,即CountDownLatch是能夠喚醒多個等待
-
-
的線程的,到達本身預期狀態的線程會調用CountDownLatch的countDown方法,而等待的線程會調用CountDownLatch的await方法
-
-
-
-
循環屏障,CyclicBarrier能夠協同多個線程,讓多個線程在這個屏障前等待,直到全部線程都到達了這個屏障時,再一塊兒繼續執行後面的動做。
-
-
CyclicBarrier和CountDownLatch都是用於多個線程間的協調的,兩者的一個很大的差異是,CountDownLatch是在多個線程都進行了latch.countDown
-
-
後纔會觸發事件,喚醒await在latch上的線程,而執行countDown的線程,執行完countDown後,會繼續本身線程的工做;
-
-
CyclicBarrier是一個柵欄,用於同步全部調用await方法的線程,而且等全部線程都到了await方法,這些線程才一塊兒返回繼續各自的工做,由於使用CyclicBarrier的線程都會阻塞在await方法上,因此在線程池中使用CyclicBarrier時要特別當心,若是線程池的線程 數過少,那麼就會發生死鎖了,
-
-
CyclicBarrier能夠循環使用,CountDownLatch不能循環使用。
-
-
-
-
是用於管理信號量的,構造的時候傳入可供管理的信號量的數值,信號量對量管理的信號就像令牌,構造時傳入個數,總數就是控制併發的數量。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Exchanger,從名字上講就是交換,它用於在兩個線程之間進行數據交換,線程會阻塞在Exchanger的exchange方法上,直到另外一個線程也到了
-
-
同一個Exchanger的exchange方法時,兩者進行交換,而後兩個線程會繼續執行自身相關的代碼。
-
-
-
-
-
-
Future<HashMap> future = getDataFromRemote2();
-
-
-
-
HashMap data = (HashMap)future.get();
-
-
-
-
private Future<HashMap> getDateFromRemote2() {
-
-
return threadPool.submit(new Callable<HashMap>() {
-
-
-
-
return getDataFromRemote();
-
-
-
-
-
-
-
-
思路:調用函數後立刻返回,而後繼續向下執行,急須要數據時再來用,或者說再來等待這個數據,具體實現方式有兩種,一個是用Future,另外一個
-
-
15.HashMap 是否線程安全,爲什麼不安全。 ConcurrentHashMap,線程安全,爲什麼安全。底層實現是怎麼樣的。
參考:http:
16.J.U.C下的常見類的使用。 ThreadPool的深刻考察; BlockingQueue的使用。(take,poll的區別,put,offer的區別);原子類的實現
http:
參考:http:
17.簡單介紹下多線程的狀況,從創建一個線程開始。而後怎麼控制同步過程,多線程經常使用的方法和結構
參考:http://www.infoq.com/cn/articles/java-memory-model-4/
19.實現多線程有幾種方式,多線程同步怎麼作,說說幾個線程裏經常使用的方法
參考:http:
http://www.cnblogs.com/psjay/archive/2010/04/01/1702465.html
http:
20.進程間的通信
網絡通訊
1. http是無狀態通訊,http的請求方式有哪些,能夠本身定義新的請求方式麼
參考:http:
2. socket通訊,以及長鏈接,分包,鏈接異常斷開的處理
參考:http://developer.51cto.com/art/201202/318163.htm