java學習要點

做爲一個程序員,在找工做的過程當中,都會遇到筆試,而不少筆試裏面都包括java,尤爲是做爲一個Android開發工程師,java是必備技能之一.因此爲了筆試過程當中可以有一個不錯的成績,我在網上也找了好多關於java面試的題目.下面是整理的相關資料.參考做者jackfrued(簡書做者)hongdada(簡書做者).java

面向對象的特徵有哪些方面--面向對象的特徵主要有一下幾個方面:c++

抽象,繼承,封裝,多態

下面將一一解釋.抽象是將一類對象的共同特徵總結出來構造類的過程.包括數據抽象和行爲抽象兩部分.抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼.程序員

  • 繼承: 繼承是從已有類獲得繼承信息建立新類的過程,提供繼承信息的類被稱爲父類(基類或者超類);獲得繼承信息的類被稱爲子類或者派生類.繼承讓變化中的軟件系統有了必定的延續性.同時繼承也是封裝程序中可變因素的重要手段.(在這裏能夠參考閻宏博士的《Java與模式》或《設計模式精解》中關於橋樑模式的部分)
  • 封裝:一般認爲封裝是把數據和操做數據的方法綁定起來,對數據的訪問只能經過已經定義的窗口.面向對象的本質是將現實世界描繪成一系列徹底封閉自治的對象. 咱們在類中編寫的方法就是對實現細節的一種封裝. 咱們編寫一個類就是對數據和數據操做一種封裝. 封裝是隱藏一切能夠隱藏的東西,只向外界提供最簡單的編程接口. (就像咱們如今使用的不少東西,其實過程很複雜,可是到了咱們使用的那一步就是最簡單的了,由於把複雜的過程都封裝起來了,只給咱們最簡單的接口.)
  • 多態: 多態是指容許不一樣子類型的對象對同一消息作出不一樣的響應.能夠理解爲一樣的對象調用了一樣的方法可是實現了不一樣的功能.**多態又分爲編譯時的多態和運行時的多態.**若是將對象的方法視爲對象向外界提供的服務,那麼運行時的多態能夠解釋爲:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來講都是透明的(就像電動剃鬚刀是A系統,它的供電系統是B系統,B系統可使用電池供電或者用交流電,甚至還有多是太陽能,A系統只會經過B類對象調用供電的方法,但並不知道供電系統的底層實現是什麼,究竟經過何種方式得到了動力).
  • 方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定)
  • 方法重寫(override) 實現的是運行時的多態性(也稱爲後綁定) 運行時的多態是面向對象最精髓的東西,要實現多態須要作兩件事: 1). 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法); 2). 對象造型(用父類型引用引用子類型對象,這樣一樣的引用調用一樣的方法就會根據子類對象的不一樣而表現出不一樣的行爲)。

訪問修飾符public,private,protected,以及不寫(默認)時的區別?

修飾符| 當前類 |同 包 | 子 類 | 其餘包 | 訪問權限| public| √| √| √ | √|公開(外部類) protected| √| √| √| ×|受保護的 default| √| √| ×| ×|默認的(外部類) private| √| ×| ×| ×|私有的web

String是最基本的數據類型麼?

不是的,java中最基本的數據類型有八種:面試

數據類型 | 字節型 |短整型 |整型 |長整型 |浮點型 |雙精度 |字符型 |布爾型 | | 數據類型 |byte|short|int|long|float|double|char|boolean 所佔內存 |8|16|32|64|32|64|16|/ 除了基本類型(primitive type)和枚舉類型(enumeration type),剩下的都是引用類型(reference type)。正則表達式

爲何用枚舉實現的單例是最好的方式##

  • 枚舉寫法簡單public enum Singleton{ INSTANCE;;}
  • 枚舉本身處理序列化在序列化的時候Java僅僅是將枚舉對象的name屬性輸出到結果中,反序列化的時候則是經過java.lang.Enum的valueOf方法來根據名字查找枚舉對象。

##String 和 StringBuilder 的區別## String 類型和 StringBuffer 類型的主要性能區別其實在於: String 是不可變的對象。所以在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,而後將指針指向新的 String 對象,因此常常改變內容的字符串最好不要用 String ,由於每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了之後,JVM 的 GC 就會開始工做,影響性能,能夠考慮使用可變字符序列StringBuilder算法

float f=3.4;正確麼?

不正確,由於3.4是雙精度,將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting,也稱爲窄化)會形成精度損失,所以須要 強制類型轉換 float f =(float)3.4; 或者寫成float f =3.4F;sql

short s1 = 1; s1 = s1 + 1;有錯嗎? short s1 = 1; s1 += 1; 有錯嗎?

對於short s1 = 1; s1 = s1 + 1;因爲1是int類型,所以s1+1運算結果也是int 型,須要強制轉換類型才能賦值給short型。short s1 = 1;s1= (short)s1 +1;而short s1 = 1; s1 += 1;能夠正確編譯,由於s1+= 1;至關於s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。數據庫

Java 面試問題列表包含的相關主題:

  • 多線程,併發及線程基礎
  • 數據類型轉換的基本原則
  • 垃圾回收(GC)
  • Java 集合框架
  • 數組
  • 字符串
  • GOF 設計模式
  • SOLID (單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉)設計原則
  • 抽象類與接口
  • Java 基礎,如 equals 和 hashcode
  • 泛型與枚舉
  • Java IO 與 NIO
  • 經常使用網絡協議
  • Java 中的數據結構和算法
  • 正則表達式
  • JVM 底層
  • Java 最佳實踐
  • JDBC
  • Date, Time 與 Calendar
  • Java 處理 XML
  • JUnit
  • 編程

多線程、併發及線程的基礎問題

  • 1)Java 中能建立 volatile 數組嗎? 能,Java 中能夠建立 volatile 類型數組,不過只是一個指向數組的引用,而不是整個數組。個人意思是,若是改變引用指向的數組,將會受到 volatile 的保護,可是若是多個線程同時改變數組的元素,volatile 標示符就不能起到以前的保護做用了。編程

  • 2)volatile 能使得一個非原子操做變成原子操做嗎? 一個典型的例子是在類中有一個 long 類型的成員變量。若是你知道該成員變量會被多個線程訪問,如計數器、價格等,你最好是將其設置爲 volatile。爲何?由於 Java 中讀取 long 類型變量不是原子的,須要分紅兩步,若是一個線程正在修改該 long 變量的值,另外一個線程可能只能看到該值的一半(前 32 位)。可是對一個 volatile 型的 long 或 double 變量的讀寫是原子。

  • 3)volatile 修飾符的有過什麼實踐? 一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,所以對這兩種類型的讀是分爲兩部分的,第一次讀取第一個 32 位,而後再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復符的另外一個做用是提供內存屏障(memory barrier),例如在分佈式框架中的應用。簡單的說,就是當你寫一個 volatile 變量以前,Java 內存模型會插入一個寫屏障(write barrier),讀一個 volatile 變量以前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫以前,也能保證任何數值的更新對全部線程是可見的,由於內存屏障會將其餘全部寫的值更新到緩存。

  • 4)volatile 類型變量提供什麼保證? volatile 變量提供順序和可見性保證,例如,JVM 或者 JIT爲了得到更好的性能會對語句重排序,可是 volatile 類型變量即便在沒有同步塊的狀況下賦值也不會與其餘語句重排序。 volatile 提供 happens-before 的保證,確保一個線程的修改能對其餘線程是可見的。某些狀況下,volatile 還能提供原子性,如讀 64 位數據類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。

  • 5)10 個線程和 2 個線程的同步代碼,哪一個更容易寫? 從寫代碼的角度來講,二者的複雜度是相同的,由於同步代碼與線程數量是相互獨立的。可是同步策略的選擇依賴於線程的數量,由於越多的線程意味着更大的競爭,因此你須要利用同步技術,如鎖分離,這要求更復雜的代碼和專業知識。

  • 6)你是如何調用 wait()方法的? 使用 if 塊仍是循環?爲何?wait() 方法應該在循環調用,由於當線程獲取到 CPU 開始執行的時候,其餘條件可能尚未知足,因此在處理前,循環檢測條件是否知足會更好。下面是一段標準的使用 wait 和 notify 方法的代碼:java// The standard idiom for using the wait methodsynchronized (obj) {while (condition does not hold)obj.wait(); // (Releases lock, and reacquires on wakeup)... // Perform action appropriate to condition}參見 Effective Java 第 69 條,獲取更多關於爲何應該在循環中來調用 wait 方法的內容。

  • 7)什麼是多線程環境下的僞共享(false sharing)? 僞共享是多線程系統(每一個處理器有本身的局部緩存)中一個衆所周知的性能問題。僞共享發生在不一樣處理器的上的線程對變量的修改依賴於相同的緩存行,以下圖所示:

    這裏寫圖片描述
    僞共享問題很難被發現,由於線程可能訪問徹底不一樣的全局變量,內存中卻碰巧在很相近的位置上。如其餘諸多的併發問題,避免僞共享的最基本方式是仔細審查代碼,根據緩存行來調整你的數據結構。----------### 有經驗程序員的 Java 面試題

  • 8)什麼是 Busy spin?咱們爲何要使用它? Busy spin 是一種在不釋放 CPU 的基礎上等待事件的技術。它常常用於避免丟失 CPU 緩存中的數據(若是線程先暫停,以後在其餘CPU上運行就會丟失)。因此,若是你的工做要求低延遲,而且你的線程目前沒有任何順序,這樣你就能夠經過循環檢測隊列中的新消息來代替調用 sleep() 或 wait() 方法。它惟一的好處就是你只需等待很短的時間,如幾微秒或幾納秒。LMAX 分佈式框架是一個高性能線程間通訊的庫,該庫有一個 BusySpinWaitStrategy 類就是基於這個概念實現的,使用 busy spin 循環 EventProcessors 等待屏障。

  • 9)Java 中怎麼獲取一份線程 dump 文件? 在 Linux 下,你能夠經過命令 kill -3 PID (Java 進程的進程 ID)來獲取 Java 應用的 dump 文件。在 Windows 下,你能夠按下 Ctrl + Break 來獲取。這樣 JVM 就會將線程的 dump 文件打印到標準輸出或錯誤文件中,它可能打印在控制檯或者日誌文件中,具體位置依賴應用的配置。若是你使用Tomcat。

  • 10)Swing 是線程安全的? 不是,Swing 不是線程安全的。你不能經過任何線程來更新 Swing 組件,如 JTable、JList 或 JPanel,事實上,它們只能經過 GUI 或 AWT 線程來更新。這就是爲何 Swing 提供 invokeAndWait() 和 invokeLater() 方法來獲取其餘線程的 GUI 更新請求。這些方法將更新請求放入 AWT 的線程隊列中,能夠一直等待,也能夠經過異步更新直接返回結果。你也能夠在參考答案中查看和學習到更詳細的內容。

  • 11)什麼是線程局部變量? 當使用ThreadLocal維護變量時,ThreadLocal爲每一個使用該變量的線程提供獨立的變量副本,每一個線程均可以獨立地改變本身的副本,而不會影響其它線程所對應的副本,是線程隔離的。線程隔離的祕密在於ThreadLocalMap類(ThreadLocal的靜態內部類)線程局部變量是侷限於線程內部的變量,屬於線程自身全部,不在多個線程間共享。Java 提供 ThreadLocal 類來支持線程局部變量,是一種實現線程安全的方式。可是在管理環境下(如 web 服務器)使用線程局部變量的時候要特別當心,在這種狀況下,工做線程的生命週期比任何應用變量的生命週期都要長。任何線程局部變量一旦在工做完成後沒有釋放,Java 應用就存在內存泄露的風險。ThreadLocal的方法:void set(T value)、T get()以及T initialValue()。 ThreadLocal是如何爲每一個線程建立變量的副本的: 首先,在每一個線程Thread內部有一個ThreadLocal.ThreadLocalMap類型的成員變量threadLocals,這個threadLocals就是用來存儲實際的變量副本的,鍵值爲當前ThreadLocal變量,value爲變量副本(即T類型的變量)。初始時,在Thread裏面,threadLocals爲空,當經過ThreadLocal變量調用get()方法或者set()方法,就會對Thread類中的threadLocals進行初始化,而且以當前ThreadLocal變量爲鍵值,以ThreadLocal要保存的副本變量爲value,存到threadLocals。而後在當前線程裏面,若是要使用副本變量,就能夠經過get方法在threadLocals裏面查找。## 總結:##a.實際的經過ThreadLocal建立的副本是存儲在每一個線程本身的threadLocals中的b.爲什麼threadLocals的類型ThreadLocalMap的鍵值爲ThreadLocal對象,由於每一個線程中可有多個threadLocal變量,就像上面代碼中的longLocal和stringLocal;c.在進行get以前,必須先set,不然會報空指針異常;若是想在get以前不須要調用set就能正常訪問的話,必須重寫initialValue()方法

  • 12)用 wait-notify 寫一段代碼來解決生產者-消費者問題? 請參考答案中的示例代碼。只要記住在同步塊中調用 wait() 和 notify()方法,若是阻塞,經過循環來測試等待條件。

  • 13) 用 Java 寫一個線程安全的單例模式(Singleton)? 請參考答案中的示例代碼,這裏面一步一步教你建立一個線程安全的 Java 單例類。當咱們說線程安全時,意思是即便初始化是在多線程環境中,仍然能保證單個實例。Java 中,使用枚舉做爲單例類是最簡單的方式來建立線程安全單例模式的方式。

  • 14)Java 中 sleep 方法和 wait 方法的區別? 雖然二者都是用來暫停當前運行的線程,可是 sleep() 實際上只是短暫停頓,由於它不會釋放鎖,而 wait() 意味着條件等待,這就是爲何該方法要釋放鎖,由於只有這樣,其餘等待的線程才能在知足條件時獲取到該鎖。

  • 15)什麼是不可變對象(immutable object)? Java 中怎麼建立一個不可變對象?不可變對象指對象一旦被建立,狀態就不能再改變。任何修改都會建立一個新的對象,如 String、Integer及其它包裝類。詳情參見答案,一步一步指導你在 Java 中建立一個不可變的類。

  • 16)咱們能建立一個包含可變對象的不可變對象嗎? 是的,咱們是能夠建立一個包含可變對象的不可變對象的,你只須要謹慎一點,不要共享可變對象的引用就能夠了,若是須要變化時,就返回原對象的一個拷貝。最多見的例子就是對象中包含一個日期對象的引用。

數據類型和 Java 基礎面試問題##

  • 17)Java 中應該使用什麼數據類型來表明價格? 若是不是特別關心內存和性能的話,使用BigDecimal,不然使用預約義精度的 double 類型。
  • 18)怎麼將 byte 轉換爲 String? 可使用 String 接收 byte[] 參數的構造器來進行轉換,須要注意的點是要使用的正確的編碼,不然會使用平臺默認編碼,這個編碼可能跟原來的編碼相同,也可能不一樣。
  • 19)Java 中怎樣將 bytes 轉換爲 long 類型? String接收bytes的構造器轉成String,再Long.parseLong
  • 20)咱們能將 int 強制轉換爲 byte 類型的變量嗎? 若是該值大於 byte 類型的範圍,將會出現什麼現象?是的,咱們能夠作強制轉換,可是 Java 中 int 是 32 位的,而 byte 是 8 位的,因此,若是強制轉化是,int 類型的高 24 位將會被丟棄,byte 類型的範圍是從 -128 到 127。
  • 21)存在兩個類,B 繼承 A,C 繼承 B,咱們能將 B 轉換爲 C 麼? 如 C = (C) B;能夠,向下轉型。可是不建議使用,容易出現類型轉型異常.
  • 22)哪一個類包含 clone 方法?是 Cloneable 仍是 Object? java.lang.Cloneable 是一個標示性接口,不包含任何方法,clone 方法在 object 類中定義。而且須要知道 clone() 方法是一個本地方法,這意味着它是由 c 或 c++ 或 其餘本地語言實現的。
  • 23)Java 中 ++ 操做符是線程安全的嗎? 不是線程安全的操做。它涉及到多個指令,如讀取變量值,增長,而後存儲回內存,這個過程可能會出現多個線程交差。
  • 24)a = a + b 與 a += b 的區別 += 隱式的將加操做的結果類型強制轉換爲持有結果的類型。若是兩這個整型相加,如 byte、short 或者 int,首先會將它們提高到 int 類型,而後在執行加法操做。javabyte a = 127;byte b = 127;b = a + b; // error : cannot convert from int to byteb += a; // ok(由於 a+b 操做會將 a、b 提高爲 int 類型,因此將 int 類型賦值給 byte 就會編譯出錯)
  • 25)我能在不進行強制轉換的狀況下將一個 double 值賦值給 long 類型的變量嗎? 不行,你不能在沒有強制類型轉換的前提下將一個 double 值賦值給 long 類型的變量,由於 double 類型的範圍比 long 類型更廣,因此必需要進行強制轉換。
  • 26)3 ×0.1 == 0.3 將會返回什麼? true 仍是 false?false,由於有些浮點數不能徹底精確的表示出來。
  • 27)int 和 Integer 哪一個會佔用更多的內存? Integer 對象會佔用更多的內存。Integer 是一個對象,須要存儲對象的元數據。可是 int 是一個原始類型的數據,因此佔用的空間更少。
  • 28)爲何 Java 中的 String 是不可變的(Immutable)? Java 中的 String 不可變是由於 Java 的設計者認爲字符串使用很是頻繁,將字符串設置爲不可變能夠容許多個客戶端之間共享相同的字符串。更詳細的內容參見答案。
  • 29)咱們能在 Switch 中使用 String 嗎? 從 Java 7 開始,咱們能夠在 switch case 中使用字符串,但這僅僅是一個語法糖。內部實如今 switch 中使用字符串的 hash code。
  • 30)Java 中的構造器鏈是什麼? 當你從一個構造器中調用另外一個構造器,就是Java 中的構造器鏈。這種狀況只在重載了類的構造器的時候纔會出現。## JVM 底層 與 GC(Garbage Collection) 的面試問題##
  • 31)64 位 JVM 中,int 的長度是多數? Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機中,int 類型的長度是相同的。
  • 32)Serial 與 Parallel GC之間的不一樣之處? Serial 與 Parallel 在GC執行的時候都會引發 stop-the-world。它們之間主要不一樣 serial 收集器是默認的複製收集器,執行 GC 的時候只有一個線程,而 parallel 收集器使用多個 GC 線程來執行。
  • 33)32 位和 64 位的 JVM,int 類型變量的長度是多數? 32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4 個字節。
  • 34)Java 中 WeakReference 與 SoftReference的區別? Java中一共有四種類型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內,當沒有任何對象指向它時將會被GC回收WeakReference,顧名思義, 是一個弱引用, 當所引用的對象在 JVM 內再也不有強引用時, 將被GC回收雖然 WeakReference 與 SoftReference 都有利於提升 GC 和 內存的效率,可是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而 SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存應用
  • 35)WeakHashMap 是怎麼工做的? WeakHashMap 的工做與正常的 HashMap 相似,可是使用弱引用做爲 key,意思就是當 key 對象沒有任何引用時,key/value 將會被回收。
  • 36)JVM 選項 -XX:+UseCompressedOops 有什麼做用? 爲何要使用? 當你將你的應用從 32 位的 JVM 遷移到 64 位的 JVM 時,因爲對象的指針從 32 位增長到了 64 位,所以堆內存會忽然增長,差很少要翻倍。這也會對 CPU 緩存(容量比內存小不少)的數據產生不利的影響。由於,遷移到 64 位的 JVM 主要動機在於能夠指定最大堆大小,經過壓縮 OOP 能夠節省必定的內存。經過 -XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。
  • 37)怎樣經過 Java 程序來判斷 JVM 是 32 位 仍是 64 位? 你能夠檢查某些系統屬性如 sun.arch.data.model 或 os.arch 來獲取該信息。
  • 38)32 位 JVM 和 64 位 JVM 的最大堆內存分別是多數? 理論上說上 32 位的 JVM 堆內存能夠到達 2^32,即 4GB,但實際上會比這個小不少。不一樣操做系統之間不一樣,如 Windows 系統大約 1.5 GB,Solaris 大約 3GB。64 位 JVM容許指定最大的堆內存,理論上能夠達到 2^64,這是一個很是大的數字,實際上你能夠指定堆內存大小到 100GB。甚至有的 JVM,如 Azul,堆內存到 1000G 都是可能的。
  • 39)JRE、JDK、JVM 及 JIT 之間有什麼不一樣? JRE 表明 Java 運行時(Java run-time),是運行 Java 應用所必須的。JDK 表明 Java 開發工具(Java development kit),是 Java 程序的開發工具,如 Java 編譯器,它也包含 JRE。JVM 表明 Java 虛擬機(Java virtual machine),它的責任是運行 Java 應用。JIT 表明即時編譯(Just In Time compilation),當代碼執行的次數超過必定的閾值時,會將 Java 字節碼轉換爲本地代碼,如,主要的熱點代碼會被準換爲本地代碼,這樣有利大幅度提升 Java 應用的性能。
    JRE

3 年工做經驗的 Java 面試題

  • 40)解釋 Java 堆空間及 GC? 當經過 Java 命令啓動 Java 進程的時候,會爲它分配內存。內存的一部分用於建立堆空間,當程序中建立對象的時候,就從對空間中分配內存。GC 是 JVM 內部的一個進程,回收無效對象的內存用於未來的分配。

JVM 底層面試題及答案

  • 41)你能保證 GC 執行嗎? 不能,雖然你能夠調用 System.gc() 或者 Runtime.getRuntime().gc(),可是沒有辦法保證 GC 的執行。
  • 42)怎麼獲取 Java 程序使用的內存?堆使用的百分比? 能夠經過 java.lang.Runtime 類中與內存相關方法來獲取剩餘的內存,總內存及最大堆內存。經過這些方法你也能夠獲取到堆使用的百分比及堆內存的剩餘空間。Runtime.freeMemory() 方法返回剩餘空間的字節數,Runtime.totalMemory() 方法總內存的字節數,Runtime.maxMemory() 返回最大內存的字節數。
  • 43)Java 中堆和棧有什麼區別? JVM 中堆和棧屬於不一樣的內存區域,使用目的也不一樣。棧經常使用於保存方法幀和局部變量,而對象老是在堆上分配。棧一般都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的全部線程共享。Difference between stack and heap memory in Java

關於內存的的面試問題和答案

Java 基本概念面試題

  • 44)「a==b」和」a.equals(b)」有什麼區別? 若是 a 和 b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象纔會返回 true,而 a.equals(b) 是進行邏輯比較,因此一般須要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,因此能夠用於兩個不一樣對象,可是包含的字母相同的比較。
  • 45)a.hashCode() 有什麼用?與 a.equals(b) 有什麼關係? hashCode() 方法是相應對象整型的 hash 值。它經常使用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,兩個使用 equal() 方法來判斷相等的對象,必須具備相同的 hash code。
  • 46)final、finalize 和 finally 的不一樣之處? final 是一個修飾符,能夠修飾變量、方法和類。若是 final 修飾變量,意味着該變量的值在初始化後不能被改變。Java 技術容許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的,可是何時調用 finalize 沒有保證。finally 是一個關鍵字,與 try 和 catch 一塊兒用於異常的處理。finally 塊必定會被執行,不管在 try 塊中是否有發生異常。
  • 47)Java 中的編譯期常量是什麼?使用它又什麼風險? 公共靜態不可變(public static final )變量也就是咱們所說的編譯期常量,這裏的 public 可選的。實際上這些變量在編譯時會被替換掉,由於編譯器知道這些變量的值,而且知道這些變量在運行時不能改變。這種方式存在的一個問題是你使用了一個內部的或第三方庫中的公有編譯時常量,可是這個值後面被其餘人改變了,可是你的客戶端仍然在使用老的值,甚至你已經部署了一個新的jar。爲了不這種狀況,當你在更新依賴 JAR 文件時,確保從新編譯你的程序。## Java 集合框架的面試題這部分也包含數據結構、算法及數組的面試問題
    1. List、Set、Map 和 Queue 之間的區別(答案) List 是一個有序集合,容許元素重複。它的某些實現能夠提供基於下標值的常量訪問時間,可是這不是 List 接口保證的。Set 是一個無序集合。
  • 49)poll() 方法和 remove() 方法的區別? poll() 和 remove() 都是從隊列中取出一個元素,可是 poll() 在獲取元素失敗的時候會返回空,可是 remove() 失敗的時候會拋出異常。
  • 50)Java 中 LinkedHashMap 和 PriorityQueue 的區別是什麼?(答案) PriorityQueue 保證最高或者最低優先級的的元素老是在隊列頭部,可是 LinkedHashMap 維持的順序是元素插入的順序。當遍歷一個 PriorityQueue 時,沒有任何順序保證,可是 LinkedHashMap 課保證遍歷順序是元素插入的順序。
  • 51)ArrayList 與 LinkedList 的不區別?(答案) 最明顯的區別是 ArrrayList 底層的數據結構是數組,支持隨機訪問,而 LinkedList 的底層數據結構書鏈表,不支持隨機訪問。使用下標訪問一個元素,ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。更多細節的討論參見答案。
  • 52)用哪兩種方式來實現集合的排序?(答案) 你可使用有序集合,如 TreeSet 或 TreeMap,你也可使用有順序的的集合,如 list,而後經過 Collections.sort() 來排序。
  • 53)Java 中怎麼打印數組?(answer答案) 你可使用 Arrays.toString() 和 Arrays.deepToString() 方法來打印數組。因爲數組沒有實現 toString() 方法,因此若是將數組傳遞給 System.out.println() 方法,將沒法打印出數組的內容,可是 Arrays.toString() 能夠打印每一個元素。
  • 54)Java 中的 LinkedList 是單向鏈表仍是雙向鏈表?(答案) 是雙向鏈表,你能夠檢查 JDK 的源碼。在 Eclipse,你可使用快捷鍵 Ctrl + T,直接在編輯器中打開該類。
  • 55)Java 中的 TreeMap 是採用什麼樹實現的?(答案) Java 中的 TreeMap 是使用紅黑樹實現的。
    1. Hashtable 與 HashMap 有什麼不一樣之處?(答案) 這兩個類有許多不一樣的地方,下面列出了一部分:a) Hashtable 是 JDK 1 遺留下來的類,而 HashMap 是後來增長的。b)Hashtable 是同步的,比較慢,但 HashMap 沒有同步策略,因此會更快。c)Hashtable 不容許有個空的 key,可是 HashMap 容許出現一個 null key。更多的不一樣之處參見答案。
  • 57)Java 中的 HashSet,內部是如何工做的?(answer答案) HashSet 的內部採用 HashMap來實現。因爲 Map 須要 key 和 value,因此全部 key 的都有一個默認 value。相似於 HashMap,HashSet 不容許重複的 key,只容許有一個null key,意思就是 HashSet 中只容許存儲一個 null 對象。
  • 58)寫一段代碼在遍歷 ArrayList 時移除一個元素?(答案) 該問題的關鍵在於面試者使用的是 ArrayList 的 remove() 仍是 Iterator 的 remove()方法。這有一段示例代碼,是使用正確的方式來實如今遍歷的過程當中移除元素,而不會出現 ConcurrentModificationException 異常的示例代碼。
  • 59)咱們能本身寫一個容器類,而後使用 for-each 循環嗎? 能夠,你能夠寫一個本身的容器類。若是你想使用 Java 中加強的循環來遍歷,你只須要實現 Iterable 接口。若是你實現 Collection 接口,默認就具備該屬性。
  • 60)ArrayList 和 HashMap 的默認大小是多數?(答案) 在 Java 7 中,ArrayList 的默認大小是 10 個元素,HashMap 的默認大小是16個元素(必須是2的冪)。這就是 Java 7 中 ArrayList 和 HashMap 類的代碼片斷:
java// from ArrayList.java JDK 1.7private static final int DEFAULT_CAPACITY = 10;//from HashMap.java JDK 7static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
複製代碼
  • 61)有沒有可能兩個不相等的對象有有相同的 hashcode? 有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是爲何在 hashmap 中會有衝突。相等 hashcode 值的規定只是說若是兩個對象相等,必須有相同的hashcode 值,可是沒有關於不相等對象的任何規定。
  • 62)兩個相同的對象會有不一樣的的 hash code 嗎? 不能,根據 hash code 的規定,這是不可能的。
  • 63)咱們能夠在 hashcode() 中使用隨機數字嗎?(答案) 不行,由於對象的 hashcode 值必須是相同的。參見答案獲取更多關於 Java 中重寫 hashCode() 方法的知識。
  • 64)Java 中,Comparator 與 Comparable 有什麼不一樣?(答案) Comparable 接口用於定義對象的天然順序,而 comparator 一般用於定義用戶定製的順序。Comparable 老是隻有一個,可是能夠有多個 comparator 來定義對象的順序。
  • 65)爲何在重寫 equals 方法的時候須要重寫 hashCode 方法?(答案) 由於有強制的規範指定須要同時重寫 hashcode 與 equal 是方法,許多容器類,如 HashMap、HashSet 都依賴於 hashcode 與 equals 的規定。

Java IO 和 NIO 的面試題

IO 是 Java 面試中一個很是重要的點。你應該很好掌握 Java IO,NIO,NIO2 以及與操做系統,磁盤 IO 相關的基礎知識。下面是 Java IO 中常常問的問題。

  • 66)在我 Java 程序中,我有三個 socket,我須要多少個線程來處理?
  • 67)Java 中怎麼建立 ByteBuffer?
  • 68)Java 中,怎麼讀寫 ByteBuffer ?
  • 69)Java 採用的是大端仍是小端?
  • 70)ByteBuffer 中的字節序是什麼?
  • 71)Java 中,直接緩衝區與非直接緩衝器有什麼區別?(答案)
  • 72)Java 中的內存映射緩存區是什麼?(answer答案)
  • 73)socket 選項 TCP NO DELAY 是指什麼?
  • 74)TCP 協議與 UDP 協議有什麼區別?(answer答案)
  • 75)Java 中,ByteBuffer 與 StringBuffer有什麼區別?(答案)

Java 最佳實踐的面試問題

包含 Java 中各個部分的最佳實踐,如集合,字符串,IO,多線程,錯誤和異常處理,設計模式等等。

  • 76)Java 中,編寫多線程程序的時候你會遵循哪些最佳實踐?(答案) 這是我在寫Java 併發程序的時候遵循的一些最佳實踐: a)給線程命名,這樣能夠幫助調試。 b)最小化同步的範圍,而不是將整個方法同步,只對關鍵部分作同步。 c)若是能夠,更偏向於使用 volatile 而不是 synchronized。 d)使用更高層次的併發工具,而不是使用 wait() 和 notify() 來實現線程間通訊,如 BlockingQueue,CountDownLatch 及 Semeaphore。 e)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴展性。
  • 77)說出幾點 Java 中使用 Collections 的最佳實踐(答案) 這是我在使用 Java 中 Collectionc 類的一些最佳實踐:
  • a)使用正確的集合類,例如,若是不須要同步列表,使用 ArrayList 而不是 Vector。

  • b)優先使用併發集合,而不是對集合進行同步。併發集合提供更好的可擴展性。

  • c)使用接口表明和訪問集合,如使用List存儲 ArrayList,使用 Map 存儲 HashMap 等等。

  • d)使用迭代器來循環集合。

  • e)使用集合的時候使用泛型。

  • 78)說出至少 5 點在 Java 中使用線程的最佳實踐。(答案) 這個問題與以前的問題相似,你可使用上面的答案。對線程來講,你應該:

  • a)對線程命名

  • b)將線程和任務分離,使用線程池執行器來執行 Runnable 或 Callable。

  • c)使用線程池

  • 79)說出 5 條 IO 的最佳實踐(答案) IO 對 Java 應用的性能很是重要。理想狀況下,你不該該在你應用的關鍵路徑上避免 IO 操做。下面是一些你應該遵循的 Java IO 最佳實踐:

  • a)使用有緩衝區的 IO 類,而不要單獨讀取字節或字符。
  • b)使用 NIO 和 NIO2
  • c)在 finally 塊中關閉流,或者使用 try-with-resource(Java7) 語句。
  • d)使用內存映射文件獲取更快的 IO。
  • 80)列出 5 個應該遵循的 JDBC 最佳實踐(答案) 有不少的最佳實踐,你能夠根據你的喜愛來例舉。下面是一些更通用的原則:
  • a)使用批量的操做來插入和更新數據
  • b)使用 PreparedStatement 來避免 SQL 異常,並提升性能。
  • c)使用數據庫鏈接池
  • d)經過列名來獲取結果集,不要使用列的下標來獲取。
  • 81)說出幾條 Java 中方法重載的最佳實踐?(答案) 下面有幾條能夠遵循的方法重載的最佳實踐來避免形成自動裝箱的混亂。
  • a)不要重載這樣的方法:一個方法接收 int 參數,而另個方法接收 Integer 參數。
  • b)不要重載參數數量一致,而只是參數順序不一樣的方法。
  • c)若是重載的方法參數個數多於 5 個,採用可變參數。

Date、Time 及 Calendar 的面試題

  • 82)在多線程環境下,SimpleDateFormat 是線程安全的嗎?(答案) 不是,很是不幸,DateFormat 的全部實現,包括 SimpleDateFormat 都不是線程安全的,所以你不該該在多線程序中使用,除非是在對外線程安全的環境中使用,如 將 SimpleDateFormat 限制在 ThreadLocal 中。若是你不這麼作,在解析或者格式化日期的時候,可能會獲取到一個不正確的結果。所以,從日期、時間處理的全部實踐來講,我強力推薦 joda-time 庫。

  • 83)Java 中如何格式化一個日期?如格式化爲 ddMMyyyy 的形式?(答案) Java 中,可使用 SimpleDateFormat 類或者 joda-time 庫來格式日期。DateFormat 類容許你使用多種流行的格式來格式化日期。參見答案中的示例代碼,代碼中演示了將日期格式化成不一樣的格式,如 dd-MM-yyyy 或 ddMMyyyy。

  • 84)Java 中,怎麼在格式化的日期中顯示時區? pattern中加z yyyy-MM-dd HH:mm:ss.SSS Z

  • 85)Java 中 java.util.Date 與 java.sql.Date 有什麼區別? java.sql.Date是針對SQL語句使用的,它只包含日期而沒有時間部分,它們都有getTime方法返回毫秒數,天然就能夠直接構建。java.util.Date 是 java.sql.Date 的父類,前者是經常使用的表示時間的類,咱們一般格式化或者獲得當前時間都是用他,後者以後在讀寫數據庫的時候用他,由於PreparedStament的setDate()的第2參數和ResultSet的getDate()方法的第2個參數都是java.sql.Date。

  • 86)Java 中,如何計算兩個日期之間的差距?

javapublic static int dateDiff(Date d1, Date d2) throws Exception {long n1 = d1.getTime();long n2 = d2.getTime();long diff = Math.abs(n1 - n2);diff /= 3600 * 1000 * 24;return diff;}
複製代碼
  • 87)Java 中,如何將字符串 YYYYMMDD 轉換爲日期? SimpleDateFormat的parse方法

單元測試 JUnit 面試題

  • 89)如何測試靜態方法?(答案) 可使用 PowerMock 庫來測試靜態方法。

  • 90)怎麼利用 JUnit 來測試一個方法的異常?(答案)

  • 91)你使用過哪一個單元測試庫來測試你的 Java 程序?(答案)

  • 92)@Before 和 @BeforeClass 有什麼區別?(答案)

編程和代碼相關的面試題

  • 93)怎麼檢查一個字符串只包含數字?(解決方案)

  • 94)Java 中如何利用泛型寫一個 LRU 緩存?(答案)

  • 95)寫一段 Java 程序將 byte 轉換爲 long?(答案)

  • 96)在不使用 StringBuffer 的前提下,怎麼反轉一個字符串?(解決方案)

  • 97)Java 中,怎麼獲取一個文件中單詞出現的最高頻率?(解決方案)

  • 98)如何檢查出兩個給定的字符串是反序的?(解決方案)

  • 99)Java 中,怎麼打印出一個字符串的全部排列?(解決方案)

  • 100)Java 中,怎樣才能打印出數組中的重複元素?(解決方案)

  • 101)Java 中如何將字符串轉換爲整數?(解決方案)

  • 102)在沒有使用臨時變量的狀況如何交換兩個整數變量的值?(解決方案)

關於 OOP 和設計模式的面試題

這部分包含 Java 面試過程當中關於 SOLID 的設計原則,OOP 基礎,如類,對象,接口,繼承,多態,封裝,抽象以及更高級的一些概念,如組合、聚合及關聯。也包含了 GOF 設計模式的問題。

  • 103)接口是什麼?爲何要使用接口而不是直接使用具體類? 接口用於定義 API。它定義了類必須得遵循的規則。同時,它提供了一種抽象,由於客戶端只使用接口,這樣能夠有多重實現,如 List 接口,你可使用可隨機訪問的 ArrayList,也可使用方便插入和刪除的 LinkedList。接口中不容許寫代碼,以此來保證抽象,可是 Java 8 中你能夠在接口聲明靜態的默認方法,這種方法是具體的。

  • 104)Java 中,抽象類與接口之間有什麼不一樣?(答案) Java 中,抽象類和接口有不少不一樣之處,可是最重要的一個是 Java 中限制一個類只能繼承一個類,可是能夠實現多個接口。抽象類能夠很好的定義一個家族類的默認行爲,而接口能更好的定義類型,有助於後面實現多態機制。關於這個問題的討論請查看答案。

  • 105)除了單例模式,你在生產環境中還用過什麼設計模式? 這須要根據你的經驗來回答。通常狀況下,你能夠說依賴注入,工廠模式,裝飾模式或者觀察者模式,隨意選擇你使用過的一種便可。不過你要準備回答接下的基於你選擇的模式的問題。

  • 106)你能解釋一下里氏替換原則嗎?(答案)

    1. 什麼狀況下會違反迪米特法則?爲何會有這個問題?(答案) 迪米特法則建議「只和朋友說話,不要陌生人說話」,以此來減小類之間的耦合。
  • 108)適配器模式是什麼?何時使用? 適配器模式提供對接口的轉換。若是你的客戶端使用某些接口,可是你有另一些接口,你就能夠寫一個適配去來鏈接這些接口。

  • 109)什麼是「依賴注入」和「控制反轉」?爲何有人使用?(答案)

  • 110)抽象類是什麼?它與接口有什麼區別?你爲何要使用過抽象類?(答案)

  • 111)構造器注入和 setter 依賴注入,那種方式更好?(答案) 每種方式都有它的缺點和優勢。構造器注入保證全部的注入都被初始化,可是 setter 注入提供更好的靈活性來設置可選依賴。若是使用 XML 來描述依賴,Setter 注入的可讀寫會更強。經驗法則是強制依賴使用構造器注入,可選依賴使用 setter 注入。

  • 112)依賴注入和工廠模式之間有什麼不一樣?(答案) 雖然兩種模式都是將對象的建立從應用的邏輯中分離,可是依賴注入比工程模式更清晰。經過依賴注入,你的類就是 POJO,它只知道依賴而不關心它們怎麼獲取。使用工廠模式,你的類須要經過工廠來獲取依賴。所以,使用 DI 會比使用工廠模式更容易測試。關於這個話題的更詳細討論請參見答案。

  • 113)適配器模式和裝飾器模式有什麼區別?(答案) 雖然適配器模式和裝飾器模式的結構相似,可是每種模式的出現意圖不一樣。適配器模式被用於橋接兩個接口,而裝飾模式的目的是在不修改類的狀況下給類增長新的功能。

  • 114)適配器模式和代理模式以前有什麼不一樣?(答案) 這個問題與前面的相似,適配器模式和代理模式的區別在於他們的意圖不一樣。因爲適配器模式和代理模式都是封裝真正執行動做的類,所以結構是一致的,可是適配器模式用於接口之間的轉換,而代理模式則是增長一個額外的中間層,以便支持分配、控制或智能訪問。

  • 115)什麼是模板方法模式?(答案) 模板方法提供算法的框架,你能夠本身去配置或定義步驟。例如,你能夠將排序算法看作是一個模板。它定義了排序的步驟,可是具體的比較,可使用 Comparable 或者其語言中相似東西,具體策略由你去配置。列出算法概要的方法就是衆所周知的模板方法。

  • 116)何時使用訪問者模式?(答案) 訪問者模式用於解決在類的繼承層次上增長操做,可是不直接與之關聯。這種模式採用雙派發的形式來增長中間層。

  • 117)何時使用組合模式?(答案) 組合模式使用樹結構來展現部分與總體繼承關係。它容許客戶端採用統一的形式來對待單個對象和對象容器。當你想要展現對象這種部分與總體的繼承關係時採用組合模式。

  • 118)繼承和組合之間有什麼不一樣?(答案) 雖然兩種均可以實現代碼複用,可是組合比繼承共靈活,由於組合容許你在運行時選擇不一樣的實現。用組合實現的代碼也比繼承測試起來更加簡單。

  • 119)描述 Java 中的重載和重寫?(答案) 重載和重寫都容許你用相同的名稱來實現不一樣的功能,可是重載是編譯時活動,而重寫是運行時活動。你能夠在同一個類中重載方法,可是隻能在子類中重寫方法。重寫必需要有繼承。

  • 120)Java 中,嵌套公共靜態類與頂級類有什麼不一樣?(答案) 類的內部能夠有多個嵌套公共靜態類,可是一個 Java 源文件只能有一個頂級公共類,而且頂級公共類的名稱與源文件名稱必須一致。

    1. OOP 中的 組合、聚合和關聯有什麼區別?(答案) 若是兩個對象彼此有關係,就說他們是彼此相關聯的。組合和聚合是面向對象中的兩種形式的關聯。組合是一種比聚合更強力的關聯。組合中,一個對象是另外一個的擁有者,而聚合則是指一個對象使用另外一個對象。若是對象 A 是由對象 B 組合的,則 A 不存在的話,B必定不存在,可是若是 A 對象聚合了一個對象 B,則即便 A 不存在了,B 也能夠單獨存在。
  • 122)給我一個符合開閉原則的設計模式的例子?(答案) 開閉原則要求你的代碼對擴展開放,對修改關閉。這個意思就是說,若是你想增長一個新的功能,你能夠很容易的在不改變已測試過的代碼的前提下增長新的代碼。有好幾個設計模式是基於開閉原則的,如策略模式,若是你須要一個新的策略,只須要實現接口,增長配置,不須要改變核心邏輯。一個正在工做的例子是 Collections.sort() 方法,這就是基於策略模式,遵循開閉原則的,你不需爲新的對象修改 sort() 方法,你須要作的僅僅是實現你本身的 Comparator 接口。

  • 123)抽象工廠模式和原型模式之間的區別?(答案)

  • 124)何時使用享元模式?(答案) 享元模式經過共享對象來避免建立太多的對象。爲了使用享元模式,你須要確保你的對象是不可變的,這樣你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。

Java 面試中其餘各式各樣的問題

這部分包含 Java 中關於 XML 的面試題,JDBC 面試題,正則表達式面試題,Java 錯誤和異常及序列化面試題

  • 125)嵌套靜態類與頂級類有什麼區別?(答案) 一個公共的頂級類的源文件名稱與類名相同,而嵌套靜態類沒有這個要求。一個嵌套類位於頂級類內部,須要使用頂級類的名稱來引用嵌套靜態類,如 HashMap.Entry 是一個嵌套靜態類,HashMap 是一個頂級類,Entry是一個嵌套靜態類。

  • 126)你能寫出一個正則表達式來判斷一個字符串是不是一個數字嗎?(解決方案) 一個數字字符串,只能包含數字,如 0 到 9 以及 +、- 開頭,經過這個信息,你能夠下一個以下的正則表達式來判斷給定的字符串是否是數字。

  • 127)Java 中,受檢查異常 和 不受檢查異常的區別?(答案) 受檢查異常編譯器在編譯期間檢查。對於這種異常,方法強制處理或者經過 throws 子句聲明。其中一種狀況是 Exception 的子類但不是 RuntimeException 的子類。非受檢查是 RuntimeException 的子類,在編譯階段不受編譯器的檢查。

  • 128)Java 中,throw 和 throws 有什麼區別?(答案) throw 用於拋出 java.lang.Throwable 類的一個實例化對象,意思是說你能夠經過關鍵字 throw 拋出一個 Error 或者 一個Exception,如:throw new IllegalArgumentException(「size must be multiple of 2″)而throws 的做用是做爲方法聲明和簽名的一部分,方法被拋出相應的異常以便調用者能處理。Java 中,任何未處理的受檢查異常強制在 throws 子句中聲明。

  • 129)Java 中,Serializable 與 Externalizable 的區別?(答案) Serializable 接口是一個序列化 Java 類的接口,以便於它們能夠在網絡上傳輸或者能夠將它們的狀態保存在磁盤上,是 JVM 內嵌的默認序列化方式,成本高、脆弱並且不安全。Externalizable 容許你控制整個序列化過程,指定特定的二進制格式,增長安全機制。

  • 130)Java 中,DOM 和 SAX 解析器有什麼不一樣?(答案) DOM 解析器將整個 XML 文檔加載到內存來建立一棵 DOM 模型樹,這樣能夠更快的查找節點和修改 XML 結構,而 SAX 解析器是一個基於事件的解析器,不會將整個 XML 文檔加載到內存。因爲這個緣由,DOM 比 SAX 更快,也要求更多的內存,不適合於解析大 XML 文件。

  • 131)說出 JDK 1.7 中的三個新特性?(答案) 雖然 JDK 1.7 不像 JDK 5 和 8 同樣的大版本,可是,仍是有不少新的特性,如 try-with-resource 語句,這樣你在使用流或者資源的時候,就不須要手動關閉,Java 會自動關閉。Fork-Join 池某種程度上實現 Java 版的 Map-reduce。容許 Switch 中有 String 變量和文本。菱形操做符(<>)用於類型推斷,再也不須要在變量聲明的右邊申明泛型,所以能夠寫出可讀寫更強、更簡潔的代碼。另外一個值得一提的特性是改善異常處理,如容許在同一個 catch 塊中捕獲多個異常。

  • 132)說出 5 個 JDK 1.8 引入的新特性?(答案) Java 8 在 Java 歷史上是一個開創新的版本,下面 JDK 8 中 5 個主要的特性:Lambda 表達式,容許像對象同樣傳遞匿名函數Stream API,充分利用現代多核 CPU,能夠寫出很簡潔的代碼Date 與 Time API,最終,有一個穩定、簡單的日期和時間庫可供你使用擴展方法,如今,接口中能夠有靜態、默認方法。重複註解,如今你能夠將相同的註解在同一類型上使用屢次。

  • 133)Java 中,Maven 和 ANT 有什麼區別?(答案) 雖然二者都是構建工具,都用於建立 Java 應用,可是 Maven 作的事情更多,在基於「約定優於配置」的概念下,提供標準的Java 項目結構,同時能爲應用自動管理依賴(應用中所依賴的 JAR 文件),Maven 與 ANT 工具更多的不一樣之處請參見答案。這就是全部的面試題,如此之多,是否是?我能夠保證,若是你能回答列表中的全部問題,你就能夠很輕鬆的應付任何核心 Java 或者高級 Java 面試。雖然,這裏沒有涵蓋 Servlet、JSP、JSF、JPA,JMS,EJB 及其它 Java EE 技術,也沒有包含主流的框架如 Spring MVC,Struts 2.0,Hibernate,也沒有包含 SOAP 和 RESTful web service,可是這份列表對作 Java 開發的、準備應聘 Java web 開發職位的人仍是一樣有用的,由於全部的 Java 面試,開始的問題都是 Java 基礎和 JDK API 相關的。若是你認爲我這裏有任何應該在這份列表中而被我遺漏了的 Java 流行的問題,你能夠自由的給我建議。個人目的是從最近的面試中建立一份最新的、最優的 Java 面試問題列表。

Java EE 相關的面試題

爲了作 Java EE 的朋友,這裏列出了一些 web 開發的特定問題,大家能夠用來準備 JEE 部分的面試:

  • 10 大 Spring 框架面試題及答案(參見)

  • 10 個很是好的 XML 面試問題(Java 程序員)(參見)

  • 20 個很是好的設計模式面試問題(參見)

  • 10個最流行的 Struts 面試題(Java 開發者)(參見)

  • 20 個 Tibco Rendezvous 及 EMS 的面試題(更多)

  • 10 個最頻繁被問到的 Servlet 面試問題及答案(參見)

  • 20 個 jQuery 面試問題(Java Web 開發者)(列表)

  • 10 個很是好的 Oracle 面試問題(Java 開發者)(參見)

  • 10 大 來自 J2EE 面試中的 JSP 問題(更多)

  • 12 個很好的 RESTful Web Services 面試問題(參見)

  • 10 大 EJB 面試問題及答案(參見)

  • 10 大 JMS 及 MQ 系列面試題及答案(列表)

  • 10 個很是好 Hibernate 面試問題(Java EE 開發者)(參見)

  • 10 個很是好的 JDBC 面試題(Java 開發者)(參見)

  • 15 個 Java NIO 和網絡面試題及答案(參見)

  • 10 大 XSLT 面試題及答案(更多)

  • 15 個來自 Java 面試的數據結構和算法問題(參見)

  • 10 大 Java 面試難題及答案(參見)

  • 40 個核心 Java 移動開發面試題及答案(列表) 推薦給 Java 面試者的書籍若是你正爲 Java 面試尋找好的準備,你能夠看一下下面的書籍,這些書籍包含了理論及編碼的相關問題Markham 的 Java 編程面試揭祕(參見)破解編碼面試:

  • 150 個編程問題及解答(參見) 程序面試揭祕:尋找下一份工做的祕密(參見)

相關文章
相關標籤/搜索