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