沒有什么套路,就是直接上干貨!!!最新Java面試題匯總整理連答案一塊兒分享給大家,希望對大家有幫助~
之后還會推出Java面試題系列文章,敬請關注!
按照技術模塊:Java熱點技術、多線程、微服務、JVM、Redis、消息隊列、SQL相關的面試題。不要走開,稍后更精彩!
1、面向對象的特點有哪些?
抽象、繼承、封裝、多態。
5、數組有沒有length()方法?String有沒有length()方法?
數組沒有length()方法,它有length屬性。
String有length()方法。
集合求長度用size()方法。
父類靜態成員和靜態代碼塊 -> 子類靜態成員和靜態代碼塊 -> 父類非靜態成員和非靜態代碼塊 -> 父類構造方法 -> 子類非靜態成員和非靜態代碼塊 -> 子類構造方法
11、String和StringBuilder、StringBuffer的區別?
- StringBuilder:適用於單線程下在字符緩沖區進行大量操作的情況(是線程不安全的)
- StringBuffer:適用多線程下在字符緩沖區進行大量操作的情況(一般很少)(是線程安全的)
- 首先說運行速度,或者說是執行速度,在這方面運行速度快慢為:StringBuilder > StringBuffer > String
15、ArrayList 和 LinkedList 有什么區別?
16、簡單介紹Java異常框架?Error與Exception有什么區別?
17、java中的throw 和 throws關鍵字有什么區別?
19、final, finally, finalize有什么區別?
22、如何判斷一個對象是否存活?(或者GC對象的判定方法)?
23、Java GC是在什么時候,對什么東西,做了什么事情?
29、簡述java內存分配與回收策率以及Minor GC和Major GC?
32、解釋一下鎖的一些基本概念:可重入鎖、可中斷鎖、公平鎖、讀寫鎖?
33、synchronized什么情況下會釋放鎖?
- 獲取鎖的線程執行完了該代碼塊,然后線程釋放對鎖的占有;
- 線程執行發生異常,此時JVM會讓線程自動釋放鎖。
- 調用wait方法,在等待的時候立即釋放鎖,方便其他的線程使用鎖.
36、Java CAS(Compare And Swap) 無鎖算法?
CAS(Compare And Swap) 無鎖算法: CAS是樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什么都不做。
37、線程池的作用有哪些?
線程池的作用: 在程序啟動的時候就創建若干線程來響應處理,它們被稱為線程池,里面的線程叫工作線程
- 降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。
- 提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
- 提高線程的可管理性。
常用線程池:ExecutorService 是主要的實現類,其中常用的有
- Executors.newSingleThreadPool(),
- newFixedThreadPool(),
- newCachedTheadPool(),
- newScheduledThreadPool()。
40、哪些項目中用到了Java反射機制?
- jdbc中有一行代碼:Class.forName('com.MySQL.jdbc.Driver.class').newInstance();
- 很多框架都用到反射機制,hibernate,struts都是用反射機制實現的。
42、你了解哪些設計模式,列舉幾個?jdk中用到了哪些設計模式?
47、簡單介紹原生jdbc執行sql過程?
- class.forName()加載數據驅動
- DriverManager.getConnection()獲取數據庫連接對象。
- 根據SQL或sql會話對象,有兩種方式Statement、PreparedStatement。
- 執行sql處理結果集,如果有參數就設置參數。
- 關閉結果集,關閉會話,關閉資源。
48、char 型變量中能不能存貯一個中文漢字,為什么?
char類型可以存儲一個中文漢字,因為Java中使用的編碼是Unicode,一個char類型占2個字節(16比特),所以放一個中文是沒問題的。
49、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
50、構造器(constructor)是否可被重寫(override)?
“Constructor(構造器)不能被繼承,所以不能被override(重寫),但是可以被overloading(重載)。
54、有了synchronized,還需要volatile做什么事?
(強烈推薦兩本書《 java並發編程的藝術》、《 深入理解Java虛擬機》)
Synchronized和Volatile的區別:
1、Volatile 僅能使用在變量級別;
Synchronized則可以使用在變量、方法、和同步代碼塊等類級別的。
2、Volatile僅能實現變量的修改可見性和有序性,並不能保證原子性(復合操作的原子性);
Synchronized則可以保證變量的可見性、有序性、原子性。
3、Volatile不會造成線程的阻塞;
Synchronized可能會造成線程的阻塞。
4、Volatile標記的變量不會被編譯器優化(因為這是由cpu指令完成);
Synchronized標記的變量可以被編譯器優化(JAVA1.6后性能優化很多)。
76、為什么要用Redis?
因為傳統的關系型數據庫如Mysql已經不能適用所有的場景了,比如秒殺的庫存扣減,APP首頁的訪問流量高峰等等,都對數據庫提出了更高的要求,所以引入了緩存中間件,目前市面上比較常用的緩存中間件有Redis 和 Memcached 不過中和考慮了他們的優缺點,最后選擇了Redis。
86、不用synchronized和lock能實現線程安全的單例嗎?
88、ArrayList和LinkedList和Vector的區別·
90、Arrays.asList獲得的List使用時需要注意什么
91、List和原始類型List之間的區別?
在編譯時編譯器不會對原始類型進行類型安全檢查,卻會對帶參數的類型進行檢查。