前言發(fā)現(xiàn)網(wǎng)上很多Java面試題都沒有答案,,所以花了很長時間搜集整理出來了這套Java面試題大全,,希望對大家有幫助哈~ 本套Java面試題大全,全的不能再全,,哈哈~ 這份面試題的包含的模塊分為19個模塊,,分別是: Java 基礎(chǔ)、容器,、多線程,、反射、對象拷貝,、Java Web ,、異常,、網(wǎng)絡(luò)、設(shè)計模式,、Spring/Spring MVC,、Spring Boot/Spring Cloud、Hibernate,、MyBatis,、RabbitMQ、Kafka,、Zookeeper,、MySQL、Redis,、JVM ,。如下圖所示
好了,閑話不多說了,,來看面試題吧: 一,、Java 基礎(chǔ)1. JDK 和 JRE 有什么區(qū)別?JDK:Java Development Kit 的簡稱,,java 開發(fā)工具包,,提供了 java 的開發(fā)環(huán)境和運行環(huán)境。 JRE:Java Runtime Environment 的簡稱,,java 運行環(huán)境,,為 java 的運行提供了所需環(huán)境。 具體來說 JDK 其實包含了 JRE,,同時還包含了編譯 java 源碼的編譯器 javac,,還包含了很多 java 程序調(diào)試和分析的工具。簡單來說:如果你需要運行 java 程序,,只需安裝 JRE 就可以了,,如果你需要編寫 java 程序,需要安裝 JDK,。 2. == 和 equals 的區(qū)別是什么,?== 解讀 對于基本類型和引用類型 == 的作用效果是不同的,如下所示: 基本類型:比較的是值是否相同,; 引用類型:比較的是引用是否相同,; 代碼示例: 代碼解讀:因為 x 和 y 指向的是同一個引用,所以 == 也是 true,,而 new String()方法則重寫開辟了內(nèi)存空間,,所以 == 結(jié)果為 false,而 equals 比較的一直是值,,所以結(jié)果都為 true,。 equals 解讀 equals 本質(zhì)上就是 ==,,只不過 String 和 Integer 等重寫了 equals 方法,把它變成了值比較,??聪旅娴拇a就明白了。 首先來看默認(rèn)情況下 equals 比較一個有相同值的對象,,代碼如下: 輸出結(jié)果出乎我們的意料,,竟然是 false,?這是怎么回事,,看了 equals 源碼就知道了,源碼如下: 原來 equals 本質(zhì)上就是 ==,。 那問題來了,,兩個相同值的 String 對象,為什么返回的是 true,?代碼如下: 同樣的,,當(dāng)我們進(jìn)入 String 的 equals 方法,找到了答案,,代碼如下: 原來是 String 重寫了 Object 的 equals 方法,,把引用比較改成了值比較。 總結(jié) :== 對于基本類型來說是值比較,,對于引用類型來說是比較的是引用,;而 equals 默認(rèn)情況下是引用比較,只是很多類重新了 equals 方法,,比如 String,、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等,。 3. 兩個對象的 hashCode()相同,,則 equals()也一定為 true,對嗎,?不對,,兩個對象的 hashCode()相同,equals()不一定 true,。 代碼示例: ? 執(zhí)行的結(jié)果: 代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,,然而 equals() 則為 false,因為在散列表中,,hashCode()相等即兩個鍵值對的哈希值相等,,然而哈希值相等,并不一定能得出鍵值對相等,。 4. final 在 java 中有什么作用,?
5. java 中的 Math.round(-1.5) 等于多少,?等于 -1,因為在數(shù)軸上取值時,,中間值(0.5)向右取整,,所以正 0.5 是往上取整,負(fù) 0.5 是直接舍棄,。 6. String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎,?String 不屬于基礎(chǔ)類型,基礎(chǔ)類型有 8 種:byte,、boolean,、char、short,、int,、float、long,、double,,而 String 屬于對象。 7. java 中操作字符串都有哪些類,?它們之間有什么區(qū)別,?操作字符串的類有:String、StringBuffer,、StringBuilder,。 String 和 StringBuffer、StringBuilder 的區(qū)別在于 String 聲明的是不可變的對象,,每次操作都會生成新的 String 對象,,然后將指針指向新的 String 對象,而 StringBuffer,、StringBuilder 可以在原有對象的基礎(chǔ)上進(jìn)行操作,,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用 String。 StringBuffer 和 StringBuilder 最大的區(qū)別在于,,StringBuffer 是線程安全的,,而 StringBuilder 是非線程安全的,但 StringBuilder 的性能卻高于 StringBuffer,所以在單線程環(huán)境下推薦使用 StringBuilder,,多線程環(huán)境下推薦使用 StringBuffer,。 8. String str="i"與 String str=new String("i")一樣嗎?不一樣,,因為內(nèi)存的分配方式不一樣,。String str="i"的方式,java 虛擬機會將其分配到常量池中,;而 String str=new String("i") 則會被分到堆內(nèi)存中,。 9. 如何將字符串反轉(zhuǎn)?使用 StringBuilder 或者 stringBuffer 的 reverse() 方法,。 示例代碼: 10. String 類的常用方法都有那些,?
11. 抽象類必須要有抽象方法嗎,?不需要,,抽象類不一定非要有抽象方法。 示例代碼: 上面代碼,,抽象類并沒有抽象方法但完全可以正常運行,。 12. 普通類和抽象類有哪些區(qū)別?
13. 抽象類能使用 final 修飾嗎,?不能,定義抽象類就是讓其他類繼承的,,如果定義為 final 該類就不能被繼承,,這樣彼此就會產(chǎn)生矛盾,所以 final 不能修飾抽象類,如下圖所示,,編輯器也會提示錯誤信息: 14. 接口和抽象類有什么區(qū)別,?
15. java 中 IO 流分為幾種,?按功能來分:輸入流(input)、輸出流(output),。 按類型來分:字節(jié)流和字符流,。 字節(jié)流和字符流的區(qū)別是:字節(jié)流按 8 位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù),字符流按 16 位傳輸以字符為單位輸入輸出數(shù)據(jù),。 16. BIO,、NIO、AIO 有什么區(qū)別,?
17. Files的常用方法都有哪些,?
二,、容器18. java 容器都有哪些?常用容器的圖錄: ? 19. Collection 和 Collections 有什么區(qū)別,?
20. List,、Set、Map 之間的區(qū)別是什么,?21. HashMap 和 Hashtable 有什么區(qū)別,?
22. 如何決定使用 HashMap 還是 TreeMap,?對于在Map中插入、刪除和定位元素這類操作,,HashMap是最好的選擇,。然而,假如你需要對一個有序的key集合進(jìn)行遍歷,,TreeMap是更好的選擇,。基于你的collection的大小,,也許向HashMap中添加元素會更快,,將map換為TreeMap進(jìn)行有序key的遍歷。 23. 說一下 HashMap 的實現(xiàn)原理?HashMap概述:HashMap是基于哈希表的Map接口的非同步實現(xiàn),。此實現(xiàn)提供所有可選的映射操作,,并允許使用null值和null鍵。此類不保證映射的順序,,特別是它不保證該順序恒久不變,。 HashMap的數(shù)據(jù)結(jié)構(gòu):在java編程語言中,最基本的結(jié)構(gòu)就是兩種,,一個是數(shù)組,,另外一個是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個基本結(jié)構(gòu)來構(gòu)造的,,HashMap也不例外,。HashMap實際上是一個“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體,。 當(dāng)我們往Hashmap中put元素時,首先根據(jù)key的hashcode重新計算hash值,根絕hash值得到這個元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒有元素,就直接將該元素放到數(shù)組的該位置上,。 需要注意Jdk 1.8中對HashMap的實現(xiàn)做了優(yōu)化,當(dāng)鏈表中的節(jié)點數(shù)據(jù)超過八個之后,該鏈表會轉(zhuǎn)為紅黑樹來提高查詢效率,從原來的O(n)到O(logn) 24. 說一下 HashSet 的實現(xiàn)原理?HashSet底層由HashMap實現(xiàn) HashSet的值存放于HashMap的key上 HashMap的value統(tǒng)一為PRESENT 25. ArrayList 和 LinkedList 的區(qū)別是什么,?最明顯的區(qū)別是 ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,,支持隨機訪問,而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表,,不支持隨機訪問,。使用下標(biāo)訪問一個元素,ArrayList 的時間復(fù)雜度是 O(1),,而 LinkedList 是 O(n),。 26. 如何實現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換?
27. ArrayList 和 Vector 的區(qū)別是什么?
28. Array 和 ArrayList 有何區(qū)別,?
29. 在 Queue 中 poll()和 remove()有什么區(qū)別?poll() 和 remove() 都是從隊列中取出一個元素,,但是 poll() 在獲取元素失敗的時候會返回空,,但是 remove() 失敗的時候會拋出異常。 30. 哪些集合類是線程安全的,?
31. 迭代器 Iterator 是什么,?迭代器是一種設(shè)計模式,,它是一個對象,它可以遍歷并選擇序列中的對象,,而開發(fā)人員不需要了解該序列的底層結(jié)構(gòu),。迭代器通常被稱為“輕量級”對象,因為創(chuàng)建它的代價小,。 32. Iterator 怎么使用?有什么特點,?Java中的Iterator功能比較簡單,,并且只能單向移動: (1) 使用方法iterator()要求容器返回一個Iterator。第一次調(diào)用Iterator的next()方法時,,它返回序列的第一個元素,。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。 (2) 使用next()獲得序列中的下一個元素,。 (3) 使用hasNext()檢查序列中是否還有元素,。 (4) 使用remove()將迭代器新返回的元素刪除,。 Iterator是Java迭代器最簡單的實現(xiàn),為List設(shè)計的ListIterator具有更多的功能,,它可以從兩個方向遍歷List,,也可以從List中插入和刪除元素。 33. Iterator 和 ListIterator 有什么區(qū)別,?
總結(jié):所有的面試題目都不是一成不變的,上面的面試題只是給大家一個借鑒作用,,最主要的是給自己增加知識的儲備,,有備無患。上面分享的2020最新200+Java面試題的答案都整理成了PDF文檔,。 關(guān)注公眾號:程序白楠楠,,獲取上述資料。
|
|