1. 程式人生 > >Java最常見的200+面試題

Java最常見的200+面試題

poll() kit 註入 單獨 模型 info 其他 順序 常對象

今天看到一份面試題總結,感覺很到位,主要包括以下模塊:Java基礎、容器、多線程、反射、對象拷貝、Java Web模塊,異常、網絡、設計模式、Spring/Spring MVC 、Spring Boot/Spring Cloud、Hibernate、Mybaits、RabbitMQ、Kafka、Zookeeper、Mysql、Redis、JVM。如下圖所示:

技術分享圖片

下面一起看下面試題,面試題為今日頭條文章中的TL提供,答案為筆者學習時候自我梳理,若有不正確的地方,請多指正,感謝!

一、Java基礎

1.JDK和JRE有什麽區別?

JDK就是Java Development Kit 。JDK是面向開發人員使用的SDK,它提供了Java的開發環境和運行環境。SDK是Software Development Kit 一般指軟件開發包,可以包括函數庫、編譯程序等。

JRE是Java Runtime Enviroment是指Java的運行環境,是面向Java程序的使用者,而不是開發者。

2.== 和 equals 的區別是什麽?

== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。
a.比較的是操作符兩端的操作數是否是同一個對象。
b.兩邊的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
c.比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為true,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。

equals用來比較的是兩個對象的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。

3.兩個對象的 hashCode()相同,則 equals()也一定為 true,對嗎?

兩個obj,如果equals()相等,hashCode()一定相等。兩個obj,如果hashCode()相等,equals()不一定相等(Hash散列值有沖突的情況,雖然概率很低)。

https://www.cnblogs.com/jesonjason/p/5492208.html

4.final 在 java 中有什麽作用?

final可以修飾類,函數,變量
修飾類時:意思是修飾類為最終類,任何類不能再繼承它.
修改函數時:意思是該方法在類裏是最終方法,繼承它的方法不能去重寫它.
修飾變量時:意思是被修飾的變量是常量或者叫終態變量,一旦初始化後就不能再改變變量的值.

5.java 中的 Math.round(-1.5) 等於多少?

-1 知識點:Math.round()方法的使用

6.String 屬於基礎的數據類型嗎?

不屬於。String是一個對象。

8種基本數據類型: boolean byte char shrot int long float double
對應的基本類型包裝類:Boolean Byte Character Short Integer Long Float Double

7.java 中操作字符串都有哪些類?它們之間有什麽區別?

查看源碼 StringUtil即可。

8.String str="i"與 String str=new String("i")一樣嗎?

不一樣。前者是一個常量,後者又重新new了一個對象,內存空間不一樣。

9.如何將字符串反轉?

https://www.cnblogs.com/lanseyitai1224/p/6955609.html

10.String 類的常用方法都有那些?

技術分享圖片

11.抽象類必須要有抽象方法嗎?

抽象類不一定要有抽象方法;但是有抽象方法的類一定是抽象類。

12.普通類和抽象類有哪些區別?

a.抽象類不能被實例化。
b.抽象類可以有構造函數,被繼承時子類必須繼承父類一個構造方法,抽象方法不能被聲明為靜態。
c.抽象方法只需申明,而無需實現,抽象類中可以允許普通方法有主體
d.含有抽象方法的類必須申明為抽象類
e.抽象的子類必須實現抽象類中所有抽象方法,否則這個子類也是抽象類。

13.抽象類能使用 final 修飾嗎?

final關鍵字不能用來抽象類和接口

14.接口和抽象類有什麽區別?

a.抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
b.抽象類要被子類繼承,接口要被類實現。
c.接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
d.接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
e.抽象類裏的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麽該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那麽該類也只能為抽象類。
f.抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果
g.抽象類裏可以沒有抽象方法
h.如果一個類裏有抽象方法,那麽這個類只能是抽象類
i.抽象方法要被實現,所以不能是靜態的,也不能是私有的。
j.接口可繼承接口,並可多繼承接口,但類只能單根繼承。

15.java 中 IO 流分為幾種?

https://www.cnblogs.com/QQ846300233/p/6046388.html

16.BIO、NIO、AIO 有什麽區別?

https://blog.csdn.net/u010310183/article/details/81700405

17.Files的常用方法都有哪些?

https://www.cnblogs.com/cocoxu1992/p/10460994.html

二、容器

18.java 容器都有哪些?

19.Collection 和 Collections 有什麽區別?

20.List、Set、Map 之間的區別是什麽?

21.HashMap 和 Hashtable 有什麽區別?

22.如何決定使用 HashMap 還是 TreeMap?

23.說一下 HashMap 的實現原理?

24.說一下 HashSet 的實現原理?

25.ArrayList 和 LinkedList 的區別是什麽?

26.如何實現數組和 List 之間的轉換?

27.ArrayList 和 Vector 的區別是什麽?

28.Array 和 ArrayList 有何區別?

29.在 Queue 中 poll()和 remove()有什麽區別?

30.哪些集合類是線程安全的?

31.叠代器 Iterator 是什麽?

32.Iterator 怎麽使用?有什麽特點?

33.Iterator 和 ListIterator 有什麽區別?

34.怎麽確保一個集合不能被修改?

三、多線程

35.並行和並發有什麽區別?

並發:指應用能夠交替執行不同的任務,其實並發有點類似於多線程的原理,多線程並非是同時執行多個任務,如果你開兩個線程執行,就是在你幾乎不可能察覺到的速度不斷去切換這兩個任務,已達到"同時執行效果",其實並不是的,只是計算機的速度太快,我們無法察覺到而已.
就類似於你,吃一口飯喝一口水,以正常速度來看,完全能夠看的出來,當你把這個過程以n倍速度執行時..可以想象一下.

並行:指應用能夠同時執行不同的任務,例:吃飯的時候可以邊吃飯邊打電話,這兩件事情可以同時執行

36.線程和進程的區別?

https://www.cnblogs.com/cocoxu1992/p/10468317.html

37.守護線程是什麽?

守護線程(即daemon thread),是個服務線程,準確地來說就是服務其他的線程,這是它的作用——而其他的線程只有一種,那就是用戶線程。所以java裏線程分2種,
1、守護線程,比如垃圾回收線程,就是最典型的守護線程。
2、用戶線程,就是應用程序裏的自定義線程。

守護線程
1、守護線程,專門用於服務其他的線程,如果其他的線程(即用戶自定義線程)都執行完畢,連main線程也執行完畢,那麽jvm就會退出(即停止運行)——此時,連jvm都停止運行了,守護線程當然也就停止執行了。
2、再換一種說法,如果有用戶自定義線程存在的話,jvm就不會退出——此時,守護線程也不能退出,也就是它還要運行,幹嘛呢,就是為了執行垃圾回收的任務啊。

用戶自定義線程
1、應用程序裏的線程,一般都是用戶自定義線程。
2、用戶也可以在應用程序代碼自定義守護線程,只需要調用Thread類的設置方法設置一下即可。

38.創建線程有哪幾種方式?

39.說一下 runnable 和 callable 有什麽區別?

40.線程有哪些狀態?

41.sleep() 和 wait() 有什麽區別?

42.notify()和 notifyAll()有什麽區別?

43.線程的 run()和 start()有什麽區別?

44.創建線程池有哪幾種方式?

45.線程池都有哪些狀態?

46.線程池中 submit()和 execute()方法有什麽區別?

47.在 java 程序中怎麽保證多線程的運行安全?

48.多線程鎖的升級原理是什麽?

49.什麽是死鎖?

50.怎麽防止死鎖?

51.ThreadLocal 是什麽?有哪些使用場景?

52.說一下 synchronized 底層實現原理?

53.synchronized 和 volatile 的區別是什麽?

54.synchronized 和 Lock 有什麽區別?

55.synchronized 和 ReentrantLock 區別是什麽?

56.說一下 atomic 的原理?

四、反射

57.什麽是反射?

58.什麽是 java 序列化?什麽情況下需要序列化?

59.動態代理是什麽?有哪些應用?

60.怎麽實現動態代理?

五、對象拷貝

61.為什麽要使用克隆?

62.如何實現對象克隆?

63.深拷貝和淺拷貝區別是什麽?

六、Java Web

64.jsp 和 servlet 有什麽區別?

65.jsp 有哪些內置對象?作用分別是什麽?

66.說一下 jsp 的 4 種作用域?

67.session 和 cookie 有什麽區別?

68.說一下 session 的工作原理?

69.如果客戶端禁止 cookie 能實現 session 還能用嗎?

70.spring mvc 和 struts 的區別是什麽?

71.如何避免 sql 註入?

72.什麽是 XSS 攻擊,如何避免?

73.什麽是 CSRF 攻擊,如何避免?

七、異常

74.throw 和 throws 的區別?

a.throws出現在方法函數頭;而throw出現在函數體。
b.throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常對象。
c.兩者都是消極處理異常的方式(這裏的消極並不是說這種方式不好),只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。

75.final、finally、finalize 有什麽區別?

a.final修飾符(關鍵字)。被final修飾的類,就意味著不能再派生出新的子類,不能作為父類而被子類繼承。因此一個類不能既被abstract聲明,又被final聲明。將變量或方法聲明為final,可以保證他們在使用的過程中不被修改。被聲明為final的變量必須在聲明時給出變量的初始值,而在以後的引用中只能讀取。被final聲明的方法也同樣只能使用,即不能方法重寫。
b.finally是在異常處理時提供finally塊來執行任何清除操作。不管有沒有異常被拋出、捕獲,finally塊都會被執行。try塊中的內容是在無異常時執行到結束。catch塊中的內容,是在try塊內容發生catch所聲明的異常時,跳轉到catch塊中執行。finally塊則是無論異常是否發生,都會執行finally塊的內容,所以在代碼邏輯中有需要無論發生什麽都必須執行的代碼,就可以放在finally塊中。
c.finalize是方法名。java技術允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者被執行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個對象調用的。

76.try-catch-finally 中哪個部分可以省略?

catch部分可以省略,也可以有多個。

77.try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?

會,finally語句塊一定會執行。

78.常見的異常類有哪些?

省略……

八、網絡

79.http 響應碼 301 和 302 代表的是什麽?有什麽區別?

80.forward 和 redirect 的區別?

81.簡述 tcp 和 udp的區別?

82.tcp 為什麽要三次握手,兩次不行嗎?為什麽?

83.說一下 tcp 粘包是怎麽產生的?

84.OSI 的七層模型都有哪些?

85.get 和 post 請求有哪些區別?

86.如何實現跨域?

87.說一下 JSONP 實現原理?

九、設計模式

88.說一下你熟悉的設計模式?

89.簡單工廠和抽象工廠有什麽區別?

十、Spring/Spring MVC

90.為什麽要使用 spring?

91.解釋一下什麽是 aop?

92.解釋一下什麽是 ioc?

93.spring 有哪些主要模塊?

94.spring 常用的註入方式有哪些?

95.spring 中的 bean 是線程安全的嗎?

96.spring 支持幾種 bean 的作用域?

97.spring 自動裝配 bean 有哪些方式?

98.spring 事務實現方式有哪些?

99.說一下 spring 的事務隔離?

100.說一下 spring mvc 運行流程?

101.spring mvc 有哪些組件?

[email protected] 的作用是什麽?

[email protected] 的作用是什麽?

十一、Spring Boot/Spring Cloud

104.什麽是 spring boot?

105.為什麽要用 spring boot?

106.spring boot 核心配置文件是什麽?

107.spring boot 配置文件有哪幾種類型?它們有什麽區別?

108.spring boot 有哪些方式可以實現熱部署?

109.jpa 和 hibernate 有什麽區別?

110.什麽是 spring cloud?

111.spring cloud 斷路器的作用是什麽?

112.spring cloud 的核心組件有哪些?

十二、Hibernate

113.為什麽要使用 hibernate?

114.什麽是 ORM 框架?

115.hibernate 中如何在控制臺查看打印的 sql 語句?

116.hibernate 有幾種查詢方式?

117.hibernate 實體類可以被定義為 final 嗎?

118.在 hibernate 中使用 Integer 和 int 做映射有什麽區別?

119.hibernate 是如何工作的?

120.get()和 load()的區別?

121.說一下 hibernate 的緩存機制?

122.hibernate 對象有哪些狀態?

123.在 hibernate 中 getCurrentSession 和 openSession 的區別是什麽?

124.hibernate 實體類必須要有無參構造函數嗎?為什麽?

十三、Mybatis

125.mybatis 中 #{}和 ${}的區別是什麽?

126.mybatis 有幾種分頁方式?

127.RowBounds 是一次性查詢全部結果嗎?為什麽?

128.mybatis 邏輯分頁和物理分頁的區別是什麽?

129.mybatis 是否支持延遲加載?延遲加載的原理是什麽?

130.說一下 mybatis 的一級緩存和二級緩存?

131.mybatis 和 hibernate 的區別有哪些?

132.mybatis 有哪些執行器(Executor)?

133.mybatis 分頁插件的實現原理是什麽?

134.mybatis 如何編寫一個自定義插件?

十四、RabbitMQ

135.rabbitmq 的使用場景有哪些?

136.rabbitmq 有哪些重要的角色?

137.rabbitmq 有哪些重要的組件?

138.rabbitmq 中 vhost 的作用是什麽?

139.rabbitmq 的消息是怎麽發送的?

140.rabbitmq 怎麽保證消息的穩定性?

141.rabbitmq 怎麽避免消息丟失?

142.要保證消息持久化成功的條件有哪些?

143.rabbitmq 持久化有什麽缺點?

144.rabbitmq 有幾種廣播類型?

145.rabbitmq 怎麽實現延遲消息隊列?

146.rabbitmq 集群有什麽用?

147.rabbitmq 節點的類型有哪些?

148.rabbitmq 集群搭建需要註意哪些問題?

149.rabbitmq 每個節點是其他節點的完整拷貝嗎?為什麽?

150.rabbitmq 集群中唯一一個磁盤節點崩潰了會發生什麽情況?

151.rabbitmq 對集群節點停止順序有要求嗎?

十五、Kafka

152.kafka 可以脫離 zookeeper 單獨使用嗎?為什麽?

153.kafka 有幾種數據保留的策略?

154.kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?

155.什麽情況會導致 kafka 運行變慢?

156.使用 kafka 集群需要註意什麽?

十六、Zookeeper

157.zookeeper 是什麽?

158.zookeeper 都有哪些功能?

159.zookeeper 有幾種部署模式?

160.zookeeper 怎麽保證主從節點的狀態同步?

161.集群中為什麽要有主節點?

162.集群中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可以使用嗎?

163.說一下 zookeeper 的通知機制?

十七、MySql

164.數據庫的三範式是什麽?

165.一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啟 mysql 數據庫,又插入了一條數據,此時 id 是幾?

166.如何獲取當前數據庫版本?

167.說一下 ACID 是什麽?

168.char 和 varchar 的區別是什麽?

169.float 和 double 的區別是什麽?

170.mysql 的內連接、左連接、右連接有什麽區別?

171.mysql 索引是怎麽實現的?

172.怎麽驗證 mysql 的索引是否滿足需求?

173.說一下數據庫的事務隔離?

174.說一下 mysql 常用的引擎?

175.說一下 mysql 的行鎖和表鎖?

176.說一下樂觀鎖和悲觀鎖?

177.mysql 問題排查都有哪些手段?

178.如何做 mysql 的性能優化?

十八、Redis

179.redis 是什麽?都有哪些使用場景?

180.redis 有哪些功能?

181.redis 和 memecache 有什麽區別?

182.redis 為什麽是單線程的?

183.什麽是緩存穿透?怎麽解決?

184.redis 支持的數據類型有哪些?

185.redis 支持的 java 客戶端都有哪些?

186.jedis 和 redisson 有哪些區別?

187.怎麽保證緩存和數據庫數據的一致性?

188.redis 持久化有幾種方式?

189.redis 怎麽實現分布式鎖?

190.redis 分布式鎖有什麽缺陷?

191.redis 如何做內存優化?

192.redis 淘汰策略有哪些?

193.redis 常見的性能問題有哪些?該如何解決?

十九、JVM

194.說一下 jvm 的主要組成部分?及其作用?

195.說一下 jvm 運行時數據區?

196.說一下堆棧的區別?

197.隊列和棧是什麽?有什麽區別?

198.什麽是雙親委派模型?

199.說一下類加載的執行過程?

200.怎麽判斷對象是否可以被回收?

201.java 中都有哪些引用類型?

202.說一下 jvm 有哪些垃圾回收算法?

203.說一下 jvm 有哪些垃圾回收器?

204.詳細介紹一下 CMS 垃圾回收器?

205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麽區別?

206.簡述分代垃圾回收器是怎麽工作的?

207.說一下 jvm 調優的工具?

208.常用的 jvm 調優的參數都有哪些?

Java最常見的200+面試題