2020年Java面試題基礎系列二(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名結果

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 或者其語言中類似東西,具體策略由你去配置。列出算法概要的方法就是衆所周知的模板方法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章