2019年Java面試題中高階系列228道
Java面試題(一)
第一篇更新1~20題的答案解析
第二篇更新21~50題答案解析
第三篇更新51~95題答案解析
Java面試題(二)
第四篇更新1~20題答案解析
第五篇更新21~50題答案解析
第六篇更新51~80題答案解析
Java 面試題(二)
81、說出幾條 Java 中方法過載的最佳實踐?
82、在多執行緒環境下,SimpleDateFormat 是執行緒安全的嗎?
83、Java 中如何格式化一個日期?如格式化為 ddMMyyyy 的形式?
84、Java 中,怎麼在格式化的日期中顯示時區?
85、Java 中 java.util.Date 與 java.sql.Date 有什麼區別?
86、Java 中,如何計算兩個日期之間的差距?
87、Java 中,如何將字串 YYYYMMDD 轉換為日期?
89、如何測試靜態方法?(答案)
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、在沒有使用臨時變數的情況如何交換兩個整數變數的值?
103、介面是什麼?為什麼要使用介面而不是直接使用具體類?
104、Java 中,抽象類與介面之間有什麼不同?
105、除了單例模式,你在生產環境中還用過什麼設計模式?
106、你能解釋一下里氏替換原則嗎?
107、什麼情況下會違反迪米特法則?為什麼會有這個問題?
108、介面卡模式是什麼?什麼時候使用?
109、什麼是“依賴注入”和“控制反轉”?為什麼有人使用?
110、抽象類是什麼?它與介面有什麼區別?你為什麼要使用過抽象類?
111、構造器注入和 setter 依賴注入,那種方式更好?
112、依賴注入和工程模式之間有什麼不同?
113、介面卡模式和裝飾器模式有什麼區別?
114、介面卡模式和代理模式之前有什麼不同?
115、什麼是模板方法模式?
本次更新81~115題的答案解析
81、說出幾條 Java 中方法過載的最佳實踐?
下面有幾條可以遵循的方法過載的最佳實踐來避免造成自動裝箱的混亂。
a)不要過載這樣的方法:一個方法接收 int 引數,而另個方法接收 Integer 引數。
b)不要過載引數數量一致,而只是引數順序不同的方法。
c)如果過載的方法引數個數多於 5 個,採用可變引數。
82、在多執行緒環境下,SimpleDateFormat 是執行緒安全的嗎?
不是,非常不幸,DateFormat 的所有實現,包括 SimpleDateFormat 都不是執行緒安全的,因此你不應該在多執行緒序中使用,除非是在對外執行緒安全的環境中使用,如 將 SimpleDateFormat 限制在ThreadLocal 中。如果你不這麼做,在解析或者格式化日期的時候,可能會獲取到一個不正確的結果。因此,從日期、時間處理的所有實踐來說,我強力推薦 joda-time 庫。
83、Java 中如何格式化一個日期?如格式化為 ddMMyyyy的形式?
Java 中,可以使用 SimpleDateFormat 類或者 joda-time 庫來格式日期。DateFormat 類允許你使用多種流行的格式來格式化日期。參見答案中的示例程式碼,程式碼中演示了將日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。
84、Java 中,怎麼在格式化的日期中顯示時區?
使用SimpleDateFormat來實現格式化日期,但是DateFormat 的所有實現,包括 SimpleDateFormat 都不是執行緒安全的,因此你不應該在多執行緒序中使用,除非是在對外執行緒安全的環境中使用,如將SimpleDateFormat 限制在 ThreadLocal 中。如果你不這麼做,在解析或者格式化日期的時候,可能會獲取到一個不正確的結果。因此,從日期、時間處理的所有實踐來說,強力推薦 joda-time 庫。
85、Java 中 java.util.Date 與 java.sql.Date 有什麼區別?
86、Java 中,如何計算兩個日期之間的差距?
87、Java 中,如何將字串 YYYYMMDD 轉換為日期?
89、如何測試靜態方法?
可以使用 PowerMock 庫來測試靜態方法。
90、怎麼利用 JUnit 來測試一個方法的異常?
對需要測試異常的程式碼使用try,catch語句塊。比如:public void testException(){try{Long.parseLong(null);} catch(NumberFormatException expected){}}然後使用Junit的fail函式,對於沒有丟擲預期異常的程式碼
91、你使用過哪個單元測試庫來測試你的 Java 程式?
92、@Before 和 @BeforeClass 有什麼區別?
@Before :在每個測試方法之前都執行一次, 方法需要宣告為public
@beforeclass :只在類中執行一次, 必須宣告為public static
93、怎麼檢查一個字串只包含數字?解決方案
用Java自帶的函式、用正規表示式、用ascii碼判斷
94、Java 中如何利用泛型寫一個 LRU 快取?
這是一種混合的資料結構,我們需要在雜湊表的基礎上建立一個連結串列。但是Java已經為我們提供了這種形式的資料結構-LinkedHashMap!它甚至提供可覆蓋回收策略的方法。唯一需要我們注意的事情是,改連結串列的順序是插入的順序,而不是訪問的順序。但是,有一個建構函式提供了一個選項,可以使用訪問的順序。
95、寫一段 Java 程式將 byte 轉換為 long?
96、在不使用 StringBuffer 的前提下,怎麼反轉一個字串?
97、Java 中,怎麼獲取一個檔案中單詞出現的最高頻率?
這是一道演算法面試題,Java中文的比較多。
1、將檔案內容存入String字串中。
2、利用split()函式分割字串,因為直接替換英文空格或者,逗號分隔就可以了,中文類似,分隔得到一個陣列。
3、遍歷陣列中所有的單詞,統計結果Map 中,key=單詞,value=單詞出現的次數。
4、使用TreeSet型別,對Map中的結果進行排序,依據統計次數。
5、輸出最高的排序的前N名結果
2、利用split()函式分割字串,因為直接替換英文空格或者,逗號分隔就可以了,中文類似,分隔得到一個陣列。
3、遍歷陣列中所有的單詞,統計結果Map 中,key=單詞,value=單詞出現的次數。
4、使用TreeSet型別,對Map中的結果進行排序,依據統計次數。
5、輸出最高的排序的前N名結果
98、如何檢查出兩個給定的字串是反序的?
思路主要是,從開始字元,和另外一個從末尾字元比較,先判斷長度是否相同,不同直接不可能反文。然後再比較。
99、Java 中,怎麼列印出一個字串的所有排列?
100、Java 中,怎樣才能列印出陣列中的重複元素?
101、Java 中如何將字串轉換為整數?
String s="123";
int i;
第一種方法:i=Integer.parseInt(s);
第二種方法:i=Integer.valueOf(s).intValue();
102、在沒有使用臨時變數的情況如何交換兩個整數變數的值?
加減法、乘除法、異或法
103、介面是什麼?為什麼要使用介面而不是直接使用具體類?
介面用於定義 API。它定義了類必須得遵循的規則。同時,它提供了一種抽象,因為客戶端只使用介面,這樣可以有多重實現,如 List 介面,你可以使用可隨機訪問的 ArrayList,也可以使用方便插入和刪除的 LinkedList。介面中不允許寫程式碼,以此來保證抽象,但是 Java 8 中你可以在介面宣告靜態的預設方法,這種方法是具體的。
104、Java 中,抽象類與介面之間有什麼不同?
Java 中,抽象類和介面有很多不同之處,但是最重要的一個是 Java 中限制一個類只能繼承一個類,但是可以實現多個介面。抽象類可以很好的定義一個家族類的預設行為,而介面能更好的定義型別,有助於後面實現多型機制。
105、除了單例模式,你在生產環境中還用過什麼設計模式?
這需要根據你的經驗來回答。一般情況下,你可以說依賴注入,工廠模式,裝飾模式或者觀察者模式,隨意選擇你使用過的一種即可。不過你要準備回答接下的基於你選擇的模式的問題。
106、你能解釋一下里氏替換原則嗎?
首先,這是編譯器的要求,如果不這麼做,無法通過編譯。其次,物件導向的程式設計,其中繼承有個大原則,任何子類的物件都可以當成父類的物件使用。
107、什麼情況下會違反迪米特法則?為什麼會有這個問題?
迪米特法則建議“只和朋友說話,不要陌生人說話”,以此來減少類之間的耦合。
108、介面卡模式是什麼?什麼時候使用?
介面卡模式提供對介面的轉換。如果你的客戶端使用某些介面,但是你有另外一些介面,你就可以寫一個適配去來連線這些介面。
109、什麼是“依賴注入”和“控制反轉”?為什麼有人使用?
控制反轉(IOC)是 Spring 框架的核心思想,用我自己的話說,就是你要做一件事,別自己可勁 new 了,你就說你要幹啥,然後外包出去就好~依賴注入(DI) 在我淺薄的想法中,就是通過介面的引用和構造方法的表達,將一些事情整好了反過來傳給需要用到的地方~
110、抽象類是什麼?它與介面有什麼區別?你為什麼要使用過抽象類?
a.介面用於規範,抽象類用於共性.
b.宣告方法的存在而不去實現它的類被叫做抽象類
c.介面(interface)是抽象類的變體。在介面中,所有方法都是抽象的。
111、構造器注入和 setter 依賴注入,那種方式更好?
每種方式都有它的缺點和優點。構造器注入保證所有的注入都被初始化,但是setter 注入提供更好的靈活性來設定可選依賴。如果使用 XML 來描述依賴,Setter 注入的可讀寫會更強。經驗法則是強制依賴使用構造器注入,可選依賴使用 setter 注入。
112、依賴注入和工程模式之間有什麼不同?
雖然兩種模式都是將物件的建立從應用的邏輯中分離,但是依賴注入比工程模式更清晰。通過依賴注入,你的類就是 POJO,它只知道依賴而不關心它們怎麼獲取。使用工廠模式,你的類需要通過工廠來獲取依賴。因此,使用 DI 會比使用工廠模式更容易測試。
113、介面卡模式和裝飾器模式有什麼區別?
雖然介面卡模式和裝飾器模式的結構類似,但是每種模式的出現意圖不同。介面卡模式被用於橋接兩個介面,而裝飾模式的目的是在不修改類的情況下給類增加新的功能。
114、介面卡模式和代理模式之前有什麼不同?
這個問題與前面的類似,介面卡模式和代理模式的區別在於他們的意圖不同。由於介面卡模式和代理模式都是封裝真正執行動作的類,因此結構是一致的,但是介面卡模式用於介面之間的轉換,而代理模式則是增加一個額外的中間層,以便支援分配、控制或智慧訪問。
115、什麼是模板方法模式?
模板方法提供演算法的框架,你可以自己去配置或定義步驟。例如,你可以將排序演算法看做是一個模板。它定義了排序的步驟,但是具體的比較,可以使用Comparable 或者其語言中類似東西,具體策略由你去配置。列出演算法概要的方法就是眾所周知的模板方法。
最後
歡迎大家關注我的公眾號【程式設計師追風】,整理了1000道2019年多家公司java面試題400多頁pdf文件,文章都會在裡面更新,整理的資料也會放在裡面。
喜歡文章記得點個贊喲,感謝支援!