Java最常見的200+面試題及自己梳理的答案--面試必備(一)


昨天在今日頭條上看到一份所謂經常面別人的TL梳理的面試題,看着比較完善,但是,沒有對應的答案,自己看着研究學習了下,順帶梳理下答案。主要包括以下模塊: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 的區別是什么?

1. ArrayList的實現是基於數組,LinkedList的實現是基於雙向鏈表。
2. 對於隨機訪問,ArrayList優於LinkedList
3. 對於插入和刪除操作,LinkedList優於ArrayList
4. LinkedList比ArrayList更占內存,因為LinkedList的節點除了存儲數據,還存儲了兩個引用,一個指向前一個元素,一個指向后一個元素。

https://www.cnblogs.com/nnngu/p/8234568.html

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

數組轉list:   Arrays.asList()

list轉數組:list.toArray()

 https://blog.csdn.net/andyzhaojianhui/article/details/49664553

 

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

https://blog.csdn.net/u011419651/article/details/83831156

28.Array 和 ArrayList 有何區別?

https://www.cnblogs.com/yonyong/p/9323546.html

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

https://blog.csdn.net/qq_36101933/article/details/83145869

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

https://www.cnblogs.com/huangdabing/p/9249233.html

31.迭代器 Iterator 是什么?

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

33.Iterator 和 ListIterator 有什么區別?

https://www.cnblogs.com/xujian2014/p/5846128.html

 

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

https://blog.csdn.net/timchen525/article/details/80517517

三、多線程

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.什么是死鎖?

  死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。例如,在某一個計算機系統中只有一台打印機和一台輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所占用,而P2在未釋放打印機之前,又提出請求使用正被P1占用着的輸入設備。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。

死鎖產生的原因:

1. 系統資源的競爭 :系統資源的競爭導致系統資源不足,以及資源分配不當,導致死鎖。

2. 進程運行推進順序不合適:進程在運行過程中,請求和釋放資源的順序不當,會導致死鎖。

50.怎么防止死鎖?

https://www.cnblogs.com/bopo/p/9228834.html

 

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

https://www.cnblogs.com/chenkeyu/p/7623653.html

 

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

https://www.cnblogs.com/paddix/p/5367116.html

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

https://www.cnblogs.com/ouyxy/p/7242563.html

54.synchronized 和 Lock 有什么區別?

 

55.synchronized 和 ReentrantLock 區別是什么?

56.說一下 atomic 的原理?

https://blog.csdn.net/weixin_41846500/article/details/86636498

四、反射

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 有哪些組件?

102.@RequestMapping 的作用是什么?

103.@Autowired 的作用是什么?

十一、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 的一級緩存和二級緩存?

https://www.cnblogs.com/yuluoxingkong/p/8205858.html

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 調優的參數都有哪些?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM