2019年Java中高級面試題總結(7),228道系列查漏補缺!

2019年Java面試題中高級系列228道

Java面試題(一)

第一篇更新1~20題的答案解析
第二篇更新21~50題答案解析
第三篇更新51~95題答案解析

Java面試題(二)

第四篇更新1~20題答案解析
第五篇更新21~50題答案解析
第六篇更新51~80題答案解析


Java 面試題(二)

8一、說出幾條 Java 中方法重載的最佳實踐?
8二、在多線程環境下,SimpleDateFormat 是線程安全的嗎?
8三、Java 中如何格式化一個日期?如格式化爲 ddMMyyyy 的形式?
8四、Java 中,怎麼在格式化的日期中顯示時區?
8五、Java 中 java.util.Date 與 java.sql.Date 有什麼區別?
8六、Java 中,如何計算兩個日期之間的差距?
8七、Java 中,如何將字符串 YYYYMMDD 轉換爲日期?
8九、如何測試靜態方法?(答案)
90、怎麼利用 JUnit 來測試一個方法的異常?
9一、你使用過哪一個單元測試庫來測試你的 Java 程序?
9二、@Before 和 @BeforeClass 有什麼區別?
9三、怎麼檢查一個字符串只包含數字?解決方案
9四、Java 中如何利用泛型寫一個 LRU 緩存?
9五、寫一段 Java 程序將 byte 轉換爲 long?
9六、在不使用 StringBuffer 的前提下,怎麼反轉一個字符串?
9七、Java 中,怎麼獲取一個文件中單詞出現的最高頻率?
9八、如何檢查出兩個給定的字符串是反序的?
9九、Java 中,怎麼打印出一個字符串的全部排列?
100、Java 中,怎樣才能打印出數組中的重複元素?
10一、Java 中如何將字符串轉換爲整數?
10二、在沒有使用臨時變量的狀況如何交換兩個整數變量的值?
10三、接口是什麼?爲何要使用接口而不是直接使用具體類?
10四、Java 中,抽象類與接口之間有什麼不一樣?
10五、除了單例模式,你在生產環境中還用過什麼設計模式?
10六、你能解釋一下里氏替換原則嗎?
10七、什麼狀況下會違反迪米特法則?爲何會有這個問題?
10八、適配器模式是什麼?何時使用?
10九、什麼是「依賴注入」和「控制反轉」?爲何有人使用?
1十、抽象類是什麼?它與接口有什麼區別?你爲何要使用過抽象類?
1十一、構造器注入和 setter 依賴注入,那種方式更好?
1十二、依賴注入和工程模式之間有什麼不一樣?
11三、適配器模式和裝飾器模式有什麼區別?
11四、適配器模式和代理模式以前有什麼不一樣?
11五、什麼是模板方法模式?

本次更新81~115題的答案解析

8一、說出幾條 Java 中方法重載的最佳實踐?

下面有幾條能夠遵循的方法重載的最佳實踐來避免形成自動裝箱的混亂。
a)不要重載這樣的方法:一個方法接收 int 參數,而另個方法接收 Integer 參數。
b)不要重載參數數量一致,而只是參數順序不一樣的方法。
c)若是重載的方法參數個數多於 5 個,採用可變參數。

8二、在多線程環境下,SimpleDateFormat 是線程安全的嗎?

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

8三、Java 中如何格式化一個日期?如格式化爲 ddMMyyyy的形式?

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

8四、Java 中,怎麼在格式化的日期中顯示時區?

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

8五、Java 中 java.util.Date 與 java.sql.Date 有什麼區別?

8六、Java 中,如何計算兩個日期之間的差距?

8七、Java 中,如何將字符串 YYYYMMDD 轉換爲日期?

8九、如何測試靜態方法?

可使用 PowerMock 庫來測試靜態方法。

90、怎麼利用 JUnit 來測試一個方法的異常?

對須要測試異常的代碼使用try,catch語句塊。好比:public void testException(){try{Long.parseLong(null);} catch(NumberFormatException expected){}}而後使用Junit的fail函數,對於沒有拋出預期異常的代碼

9一、你使用過哪一個單元測試庫來測試你的 Java 程序?

9二、@Before 和 @BeforeClass 有什麼區別?

@Before :在每一個測試方法以前都執行一次, 方法須要聲明爲public
@beforeclass :只在類中執行一次, 必須聲明爲public static

9三、怎麼檢查一個字符串只包含數字?解決方案

用Java自帶的函數、用正則表達式、用ascii碼判斷

9四、Java 中如何利用泛型寫一個 LRU 緩存?

這是一種混合的數據結構,咱們須要在哈希表的基礎上創建一個鏈表。可是Java已經爲咱們提供了這種形式的數據結構-LinkedHashMap!它甚至提供可覆蓋回收策略的方法。惟一須要咱們注意的事情是,改鏈表的順序是插入的順序,而不是訪問的順序。可是,有一個構造函數提供了一個選項,可使用訪問的順序。

9五、寫一段 Java 程序將 byte 轉換爲 long?

9六、在不使用 StringBuffer 的前提下,怎麼反轉一個字符串?

9七、Java 中,怎麼獲取一個文件中單詞出現的最高頻率?

這是一道算法面試題,Java中文的比較多。
一、將文件內容存入String字符串中。
二、利用split()函數分割字符串,由於直接替換英文空格或者,逗號分隔就能夠了,中文相似,分隔獲得一個數組。
三、遍歷數組中全部的單詞,統計結果Map 中,key=單詞,value=單詞出現的次數。
四、使用TreeSet類型,對Map中的結果進行排序,依據統計次數。
五、輸出最高的排序的前N名結果

9八、如何檢查出兩個給定的字符串是反序的?

思路主要是,從開始字符,和另一個從末尾字符比較,先判斷長度是否相同,不一樣直接不可能反文。而後再比較。

9九、Java 中,怎麼打印出一個字符串的全部排列?

100、Java 中,怎樣才能打印出數組中的重複元素?

10一、Java 中如何將字符串轉換爲整數?

String s="123";
int i;
第一種方法:i=Integer.parseInt(s);
第二種方法:i=Integer.valueOf(s).intValue();

10二、在沒有使用臨時變量的狀況如何交換兩個整數變量的值?

加減法、乘除法、異或法

10三、接口是什麼?爲何要使用接口而不是直接使用具體類?

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

10四、Java 中,抽象類與接口之間有什麼不一樣?

Java 中,抽象類和接口有不少不一樣之處,可是最重要的一個是 Java 中限制一個類只能繼承一個類,可是能夠實現多個接口。抽象類能夠很好的定義一個家族類的默認行爲,而接口能更好的定義類型,有助於後面實現多態機制。

10五、除了單例模式,你在生產環境中還用過什麼設計模式?

這須要根據你的經驗來回答。通常狀況下,你能夠說依賴注入,工廠模式,裝飾模式或者觀察者模式,隨意選擇你使用過的一種便可。不過你要準備回答接下的基於你選擇的模式的問題。

10六、你能解釋一下里氏替換原則嗎?

首先,這是編譯器的要求,若是不這麼作,沒法經過編譯。其次,面向對象的編程,其中繼承有個大原則,任何子類的對象均可以當成父類的對象使用。

10七、什麼狀況下會違反迪米特法則?爲何會有這個問題?

迪米特法則建議「只和朋友說話,不要陌生人說話」,以此來減小類之間的耦合。

10八、適配器模式是什麼?何時使用?

適配器模式提供對接口的轉換。若是你的客戶端使用某些接口,可是你有另一些接口,你就能夠寫一個適配去來鏈接這些接口。

10九、什麼是「依賴注入」和「控制反轉」?爲何有人使用?

控制反轉(IOC)是 Spring 框架的核心思想,用我本身的話說,就是你要作一件事,別本身可勁 new 了,你就說你要幹啥,而後外包出去就好~依賴注入(DI) 在我淺薄的想法中,就是經過接口的引用和構造方法的表達,將一些事情整好了反過來傳給須要用到的地方~

1十、抽象類是什麼?它與接口有什麼區別?你爲何要使用過抽象類?

a.接口用於規範,抽象類用於共性.
b.聲明方法的存在而不去實現它的類被叫作抽象類
c.接口(interface)是抽象類的變體。在接口中,全部方法都是抽象的。

1十一、構造器注入和 setter 依賴注入,那種方式更好?

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

1十二、依賴注入和工程模式之間有什麼不一樣?

雖然兩種模式都是將對象的建立從應用的邏輯中分離,可是依賴注入比工程模式更清晰。經過依賴注入,你的類就是 POJO,它只知道依賴而不關心它們怎麼獲取。使用工廠模式,你的類須要經過工廠來獲取依賴。所以,使用 DI 會比使用工廠模式更容易測試。

11三、適配器模式和裝飾器模式有什麼區別?

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

11四、適配器模式和代理模式以前有什麼不一樣?

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

11五、什麼是模板方法模式?

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

最後

歡迎你們關注個人公衆號【程序員追風】,整理了1000道2019年多家公司java面試題400多頁pdf文檔,文章都會在裏面更新,整理的資料也會放在裏面。

喜歡文章記得點個贊喲,感謝支持!
相關文章
相關標籤/搜索