1、Java 基礎css
1.JDK 和 JRE 有什麼區別?html
JRE=JVM+各類基礎類庫+java類庫(String\System)java JDK>JRE>JVMnode JRE:是java運行時環境 JDK:是java開發工具包mysql |
2. == 和 equals 的區別是什麼?nginx
一、對象類型不一樣:a:equals():是超類Object中的方法。b:==:是操做符。web 二、比較的對象不一樣:a:equals():用來檢測兩個對象是否相等,即兩個對象的內容是否相等。b:==:用於比較引用和比較基本數據類型時具備不一樣的功能。ajax 三、運行速度不一樣:a:equals():沒有==運行速度快。b:==:運行速度要比equals()快,由於==只是比較引用。正則表達式 |
3. 兩個對象的 hashCode()相同,則 equals()也必定爲 true,對嗎?redis
不對,兩個對象的 hashCode()相同,equals()不必定 true。 |
4. final 在 java 中有什麼做用?
final:做爲java中的關鍵字能夠用於三個地方。用於修飾類、類屬性和類方法。特徵:凡是引用final關鍵字的地方皆不可修改! (1)、修飾類:表示該類不能被繼承。 (2)、修飾方法:表示該方法不能被重寫。 (3)、修飾變量:表示變量只能一次賦值之後值不能被修改(常量)。 |
5. java 中的 Math.round(-1.5) 等於多少?
round是四捨五入 負數5是舍的 因此Math.round(-1.5)等於-1 Math.round(1.5)值是2 |
6. String 屬於基礎的數據類型嗎?
不是 基本數據類型包括byte、int、char、long、float、double、boolean和short。 所以不能夠繼承這個類、不能修改這個類。爲了提升效率節省空間,咱們應該用StringBuffer類。 |
7. java 中操做字符串都有哪些類?它們之間有什麼區別?
String、StringBuffer、StringBuilder String是不可變的對象,對每次對String類型的改變時都會生成一個新的對象,StringBuffer和StringBuilder是能夠改變對象的。 對於操做效率:StringBuilder > StringBuffer > String 對於線程安全:StringBuffer 是線程安全,可用於多線程;StringBuilder 是非線程安全,用於單線程。 不頻繁的字符串操做使用 String。反之,StringBuffer 和 StringBuilder 都優於String。 |
8. String str="i"與 String str=new String(「i」)同樣嗎?
不同,由於他們不是同一個對象。 |
9. 如何將字符串反轉?
有多種方法: 第一種:
第二種:
第三種:
|
10. String 類的經常使用方法都有那些?
從對字符常規操做來看: 增-刪-改-查 刪:trim subString 改:valueOf toUpperCase toLowerCase 查:length indexOf charAt startsWith endsWith |
11. 抽象類必需要有抽象方法嗎?
抽象類中不必定要包含抽象方法。也就是抽象中能夠沒有抽象方法,反之,類中含有抽象方法,那麼類必須聲明爲抽象類。 |
12. 普通類和抽象類有哪些區別?
抽象類不能被實例;抽象類不能有構造函數,抽象方法也不能被聲明爲靜態;抽象類能夠有抽象方法;抽象類的抽象方法必須被非抽象子類繼承。 |
13. 抽象類能使用 final 修飾嗎?
不能,抽象類中的抽象方法是將來繼承以後的重寫方法,而用final修飾的類,沒法被繼承。final關鍵字不能用來抽象類和接口。 |
14. 接口和抽象類有什麼區別?
抽象類是被子類繼承,接口是被類實現;接口只能作方法申明,抽象類能夠作方法申明,也能夠作方法實現;接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是廣泛變量;接口是設計的結果。抽象類是重構的結果。 |
15. java 中 IO 流分爲幾種?
4中:字節輸入流(InputStream);字節輸出流(OutputStream);字符輸入流(Reader);字符輸出流(Writer) |
16. BIO、NIO、AIO 有什麼區別?
BIO和NIO是兩種不一樣的網絡通訊模型,現現在NIO已經大量應用在Jetty、ZooKeeper、Netty等開源框架中。一個面向流、一個面向緩衝區;一個是阻塞式的、一個是非阻塞;一個沒有io多路複用器、一個有io多路複用器。 |
17. Files的經常使用方法都有哪些?
建立: 刪除: 文件夾相關: |
2、容器
18. java 容器都有哪些?
List、Set、Map |
19. Collection 和 Collections 有什麼區別?
Collection是集合類的頂級接口,其派生了兩個子接口Set和List。Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對象對集合元素進行排序、搜索以及線程安全等各類操做。Collection是一個接口,而Collections是個類。 |
20. List、Set、Map 之間的區別是什麼?
List:a、能夠容許重複對象;b、能夠插入多個null元素;c、是一個有序容器。Set:a、不容許重複對象;b、只容許一個null元素;c、無序容器。Map:a、Map不是collection的子接口或實現類。Map是一個接口;b、Map的每一個Entry都特有兩個對象,也就是一個鍵一個值,Map可能會持有相同的值對象但鍵對象必須是惟一的;c、Map裏能夠擁有隨意null值但最多隻能有一個null鍵。 |
21. HashMap 和 Hashtable 有什麼區別?
存儲:HashMap運行key和value爲null,而HashTable不容許;線程安全:HashTable是線程安全的,而HashMap是非線程安全的。 |
22. 如何決定使用 HashMap 仍是 TreeMap?
對於在 Map 中插入、刪除、定位一個元素這類操做,HashMap 是最好的選擇,由於相對而言 HashMap 的插入會更快,但若是你要對一個 key 集合進行有序的遍歷,那 TreeMap 是更好的選擇。 |
23. 說一下 HashMap 的實現原理?
24. 說一下 HashSet 的實現原理?
25. ArrayList 和 LinkedList 的區別是什麼?
ArrayList與LinkedList都實現了list接口;ArrayList是線程表,底層是使用數組實現的,它在尾端插入和訪問數據時效率較高;LinkedList是雙向鏈表,它在中間插入或者插入時效率較高,在訪問數據時效率較低。 |
26. 如何實現數組和 List 之間的轉換?
數組轉list:Arrays.asList();list轉數組:list.toArray() |
27. ArrayList 和 Vector 的區別是什麼?
28. Array 和 ArrayList 有何區別?
Array 與 ArrayList 都是用來存儲數據的集合。ArrayList 底層是使用數組實現的,可是ArrayList對數組進行了封裝和功能擴展 |
29. 在 Queue 中 poll()和 remove()有什麼區別?
https://blog.csdn.net/qq_36101933/article/details/83145869 |
30. 哪些集合類是線程安全的?
線程安全的集合對象:Vector、HashTable、StringBuffer 非線程安全的集合對象:ArrayList、LinkedList、HashMap、HashSet、TreeMap、TreeSet、StringBulider http://www.javashuo.com/article/p-ptjbkwnv-cv.html |
31. 迭代器 Iterator 是什麼?
Iterator接口提供了不少對集合元素進行迭代的方法。每個集合類都包括了能夠返回迭代器實例的迭代方法。迭代器能夠在迭代過程當中刪除底層集合的元素,可是不能夠直接調用集合的remove(Object obj)刪除,能夠經過迭代器的remove()方法刪除 https://blog.csdn.net/qq_18433441/article/details/78223502 |
32. Iterator 怎麼使用?有什麼特色?
33. Iterator 和 ListIterator 有什麼區別?
34. 怎麼確保一個集合不能被修改?
3、多線程
35. 並行和併發有什麼區別?
併發:併發在單核和多核均可存在,就是同一時間有多個能夠執行的進程。可是在單核中同一時刻只有一個進程獲取CPU,雖然宏觀上你認爲多個進程都在進行。 並行:並行是指同一時間多個進程在微觀上都在真正的執行,這就只有在多核的狀況下了。 |
36. 線程和進程的區別?
區別:地址空間、資源擁有
|
37. 守護線程是什麼?
守護線程是個服務線程,服務於其餘線程 典型案列:垃圾回收線程 |
38. 建立線程有哪幾種方式?
繼承Threa類建立線程;實現Runnable接口建立線程;經過Callable和Future建立線程。 |
39. 說一下 runnable 和 callable 有什麼區別?
runnable沒有返回值,callable能夠拿到有返回值,callable能夠看做是runnable的補充。 |
40. 線程有哪些狀態?
建立、就緒、運行、阻塞、死亡 |
41. sleep() 和 wait() 有什麼區別?
sleep()能夠在任何地方使用;wait()只能在同步方法或者同步塊中使用。 |
42. notify()和 notifyAll()有什麼區別?
notify()是喚醒某個線程;notifyAll()是喚醒全部暫停的線程。 |
43. 線程的 run()和 start()有什麼區別?
run()至關於線程的任務處理邏輯的入口方法;start()的做用是啓動相應的線程。 |
44.建立線程池有哪幾種方式?
線程池建立有七種方式,最核心的是最後一種:
|
45.線程池都有哪些狀態?
|
46. 線程池中 submit()和 execute()方法有什麼區別?
execute():只能執行Runnable類型的任務;submit():能夠執行Runnable和Callable類型的任務。 |
47. 在 java 程序中怎麼保證多線程的運行安全?
方法一:使用安全類,好比java.util.concurrent下的類。方法二:使用自動鎖synchronized。方法三:使用手動鎖Lock。
|
48. 多線程鎖的升級原理是什麼?
synchronized 鎖升級原理:在鎖對象的對象頭裏面有一個 threadid 字段,在第一次訪問的時候 threadid 爲空,jvm 讓其持有偏向鎖,並將 threadid 設置爲其線程 id,再次進入的時候會先判斷 threadid 是否與其線程 id 一致,若是一致則能夠直接使用此對象,若是不一致,則升級偏向鎖爲輕量級鎖,經過自旋循環必定次數來獲取鎖,執行必定次數以後,若是尚未正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了 synchronized 鎖的升級。 鎖的升級的目的:鎖升級是爲了減低了鎖帶來的性能消耗。在 Java 6 以後優化 synchronized 的實現方式,使用了偏向鎖升級爲輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。 |
49. 什麼是死鎖?
當線程A持有獨佔鎖a,並嘗試去獲取獨佔鎖b的同時,線程B持有獨佔鎖b,並嘗試獲取獲取獨佔鎖a的狀況下,就會發生AB兩個線程因爲相互持有對方須要的鎖,而發生了阻塞的現象,稱爲死鎖。 |
50. 怎麼防止死鎖?
儘可能使用tryLock的方法,設置超時時間,超時能夠退出防止死鎖;儘可能使用java.util.concurrent併發類代替本身手寫鎖;儘可能下降鎖的使用粒度,儘可能不要幾個功能用同一把鎖;儘可能減小同步的代碼塊。 |
51. ThreadLocal 是什麼?有哪些使用場景?
ThreadLocal用於保存某個線程共享變量。使用場景:解決數據庫鏈接,Session管理 |
52. 說一下 synchronized 底層實現原理?
synchronized 是由一對 monitorenter/monitorexit 指令實現的,monitor 對象是同步的基本實現單元。在 Java 6 以前,monitor 的實現徹底是依靠操做系統內部的互斥鎖,由於須要進行用戶態到內核態的切換,因此同步操做是一個無差異的重量級操做,性能也很低。但在 Java 6 的時候,Java 虛擬機 對此進行了大刀闊斧地改進,提供了三種不一樣的 monitor 實現,也就是常說的三種不一樣的鎖:偏向鎖(Biased Locking)、輕量級鎖和重量級鎖,大大改進了其性能。 |
53. synchronized 和 volatile 的區別是什麼?
|
54. synchronized 和 Lock 有什麼區別?
|
55. synchronized 和 ReentrantLock 區別是什麼?
synchronized 早期的實現比較低效,對比 ReentrantLock,大多數場景性能都相差較大,可是在 Java 6 中對 synchronized 進行了很是多的改進。 主要區別以下:
|
56. 說一下 atomic 的原理?
atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法來保證原子操做,從而避免 synchronized 的高開銷,執行效率大爲提高。 |
4、反射
57. 什麼是反射?
能夠將一個程序(類)在運行的時候得到該程序(類)的信息的機制,也就是得到在編譯期不可能得到的類的信息,由於這些信息是保存在Class對象中的,而這個Class對象是在程序運行時動態加載的 |
58. 什麼是 java 序列化?什麼狀況下須要序列化?
序列化就是把java對象轉換爲字節序列的方法。把對象的字節序列化到永久的保存到硬盤中;在網絡上傳遞對象的字節序列。 |
59. 動態代理是什麼?有哪些應用?
動態代理是運行時動態生成代理類。
|
60. 怎麼實現動態代理?
JDK動態代理;cglib動態代理。 |
5、對象拷貝
61. 爲何要使用克隆?
克隆的對象可能包含一些已經修改過的屬性,而 new 出來的對象的屬性都仍是初始化時候的值,因此當須要一個新的對象來保存當前對象的「狀態」就靠克隆方法了。 |
62. 如何實現對象克隆?
|
63. 深拷貝和淺拷貝區別是什麼?
|
6、Java Web
64. jsp 和 servlet 有什麼區別?
|
65. jsp 有哪些內置對象?做用分別是什麼?
Jsp共有九種內置的對象:request 用戶端請求,此請求會包含來自GET/POST請求的參數;response 網頁傳回用戶端的迴應;pageContext 網頁的屬性是在這裏管理;session 與請求有關的會話期;application servlet 正在執行的內容;out 用來傳送回應的輸出;config servlet的構架部件;page JSP網頁自己;exception 針對錯誤網頁,未捕捉的例外; http://www.javashuo.com/article/p-kjptgizp-ch.html |
66. 說一下 jsp 的 4 種做用域?
Web應用中,JSP建立的對象有必定的生命週期,也有可能被其餘組件或者對象訪問。對象的聲明週期和可訪問性稱爲做用域。四種範圍對象做用域從小到大順序以下:pageContext----request----session----application。 https://blog.csdn.net/qq208617107/article/details/51213745 |
67. session 和 cookie 有什麼區別?
存儲位置不一樣:session存儲在服務器端;cookie存儲在瀏覽器端。安全性不一樣:cookie安全性通常,在瀏覽器存儲,能夠被僞造和修改。容量和個數限制:cookie有容量限制,在每一個站點下的cookie也有個數限制。存儲多樣性:session能夠存儲在Redis中、數據庫中、應用程序中;而cookie只能存儲在瀏覽器中。 |
68. 說一下 session 的工做原理?
session 的工做原理是客戶端登陸完成以後,服務器會建立對應的 session,session 建立完以後,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務器時,都會帶着 sessionid,服務器拿到 sessionid 以後,在內存找到與之對應的 session 這樣就能夠正常工做了。 |
69. 若是客戶端禁止 cookie 能實現 session 還能用嗎?
能夠用,session 只是依賴 cookie 存儲 sessionid,若是 cookie 被禁用了,能夠使用 url 中添加 sessionid 的方式保證 session 能正常使用。 |
70. spring mvc 和 struts 的區別是什麼?
|
71. 如何避免 sql 注入?
使用預處理PreparedStatement。使用正則表達式過濾字符中的特殊字符。 |
72. 什麼是 XSS 攻擊,如何避免?
XSS 攻擊:即跨站腳本攻擊,它是 Web 程序中常見的漏洞。原理是攻擊者往 Web 頁面裏插入惡意的腳本代碼(css 代碼、Javascript 代碼等),當用戶瀏覽該頁面時,嵌入其中的腳本代碼會被執行,從而達到惡意攻擊用戶的目的,如盜取用戶 cookie、破壞頁面結構、重定向到其餘網站等。 預防 XSS 的核心是必須對輸入的數據作過濾處理。 |
73. 什麼是 CSRF 攻擊,如何避免?
CSRF:Cross-Site Request Forgery(中文:跨站請求僞造),能夠理解爲攻擊者盜用了你的身份,以你的名義發送惡意請求,好比:以你名義發送郵件、發消息、購買商品,虛擬貨幣轉帳等。 防護手段:
|
7、異常
74. throw 和 throws 的區別?
throw是指拋出的一個具體異常類型;throws是用來聲明一個方法可能拋出的全部異常信息。 |
75. final、finally、finalize 有什麼區別?
|
76. try-catch-finally 中哪一個部分能夠省略?
try-catch-finally 其中 catch 和 finally 均可以被省略,可是不能同時省略,也就是說有 try 的時候,必須後面跟一個 catch 或者 finally。 |
77. try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?
必定會, catch 中 return會等finally中的代碼執行完以後纔會執行。 |
78. 常見的異常類有哪些?
|
8、網絡
79. http 響應碼 301 和 302 表明的是什麼?有什麼區別?
|
80. forward 和 redirect 的區別?
|
81. 簡述 tcp 和 udp的區別?
tcp 和 udp 是 OSI 模型中的運輸層中的協議。tcp 提供可靠的通訊傳輸,而 udp 則常被用於讓廣播和細節控制交給應用的通訊傳輸。 二者的區別大體以下:
|
82. tcp 爲何要三次握手,兩次不行嗎?爲何?
若是採用兩次握手,那麼只要服務器發出確認數據包就會創建鏈接,但因爲客戶端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣服務器端就白白浪費了必定的資源。若採用三次握手,服務器端沒有收到來自客戶端的再此確認,則就會知道客戶端並無要求創建請求,就不會浪費服務器的資源。 |
83. 說一下 tcp 粘包是怎麼產生的?
tcp 粘包可能發生在發送端或者接收端,分別來看兩端各類產生粘包的緣由:
|
84. OSI 的七層模型都有哪些?
|
85. get 和 post 請求有哪些區別?
|
86. 如何實現跨域?
使用CORS技術;使用JSONP。 |
87. 說一下 JSONP 實現原理?
jsonp是一種輕量級的數據交換格式。 jsonp:JSON with Padding,它是利用script標籤的 src 鏈接能夠訪問不一樣源的特性,加載遠程返回的「JS 函數」來執行的。 |
9、設計模式
88. 說一下你熟悉的設計模式?
|
89. 簡單工廠和抽象工廠有什麼區別?
|
10、Spring/Spring MVC
90. 爲何要使用 spring?
spring是一個開源框架,是個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架
|
91. 解釋一下什麼是 aop?
AOP即面向切面編程,是OOP編程的有效補充。使用AOP技術,能夠將一些系統性相關的編程工做,獨立提取出來,獨立實現,而後經過切面切入進系統。從而避免了在業務邏輯的代碼中混入不少的系統相關的邏輯——好比權限管理,事物管理,日誌記錄等等。 AOP分爲靜態AOP和動態AOP:
|
92. 解釋一下什麼是 ioc?
即「控制反轉」,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。 IoC很好的體現了面向對象設計法則之一—— 好萊塢法則:「別找咱們,咱們找你」;即由IoC容器幫對象找相應的依賴對象並注入,而不是由對象主動去找。 |
93. spring 有哪些主要模塊?
core模塊、aop模塊、data access模塊、web模塊、test模塊
|
94. spring 經常使用的注入方式有哪些?
構造方法注入、setter注入、基於註解注入。 http://www.javashuo.com/article/p-gdkynkay-kb.html |
95. spring 中的 bean 是線程安全的嗎?
spring 中的 bean 默認是單例模式,spring 框架並無對單例 bean 進行多線程的封裝處理。 實際上大部分時候 spring bean 無狀態的(好比 dao 類),全部某種程度上來講 bean 也是安全的,但若是 bean 有狀態的話(好比 view model 對象),那就要開發者本身去保證線程安全了,最簡單的就是改變 bean 的做用域,把「singleton」變動爲「prototype」,這樣請求 bean 至關於 new Bean()了,因此就能夠保證線程安全了。
|
96. spring 支持幾種 bean 的做用域?
singleton、prototype、request、session、globalSession五中做用域。
|
97. spring 自動裝配 bean 有哪些方式?
|
98. spring 事務實現方式有哪些?
|
99. 說一下 spring 的事務隔離?
spring 有五大隔離級別,默認值爲 ISOLATION_DEFAULT(使用數據庫的設置),其餘四個隔離級別和數據庫的隔離級別一致:
|
100. 說一下 spring mvc 運行流程?
|
101. spring mvc 有哪些組件?
|
102. @RequestMapping 的做用是什麼?
將http請求映射到相應的類/方法上。 |
103. @Autowired 的做用是什麼?
@Autowired它能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做,經過@Autowired的使用來消除set/get方法。 |
11、Spring Boot/Spring Cloud
104. 什麼是 spring boot?
SpringBoot是一個構建在Spring框架頂部的項目。它提供了一個更簡單、更快捷的方法來設置、配置和運行簡單和基於web的應用程序。 |
105. 爲何要用 spring boot?
配置簡單、獨立運行、自動裝配、無代碼生成和xml配置、提供應用監控、易上手、提高開發效率。 |
106. spring boot 核心配置文件是什麼?
spring boot 核心的兩個配置文件:
|
107. spring boot 配置文件有哪幾種類型?它們有什麼區別?
配置文件有.properties格式和.yml格式,它們主要的區別是書法風格不一樣。 .properties配置以下:
.yml配置以下:
|
108. spring boot 有哪些方式能夠實現熱部署?
|
109. jpa 和 hibernate 有什麼區別?
jpa全稱Java Persistence API,是Java持久化接口規範,hibernate屬於jpa的具體實現。 |
110. 什麼是 spring cloud?
spring cloud 是一系列框架的有序集合。它利用 spring boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用 spring boot 的開發風格作到一鍵啓動和部署。 |
111. spring cloud 斷路器的做用是什麼?
在分佈式架構中,斷路器模式的做用也是相似的,當某個服務單元發生故障(相似用電器發生短路)以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間佔用不釋放,避免了故障在分佈式系統中的蔓延。 |
112. spring cloud 的核心組件有哪些?
|
12、Hibernate
113. 爲何要使用 hibernate?
|
114. 什麼是 ORM 框架?
對象-關係映射(Object-Relational Mapping,簡稱ORM),面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關係數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關係數據是業務實體的兩種表現形式,業務實體在內存中表現爲對象,在數據庫中表現爲關係數據。內存中的對象之間存在關聯和繼承關係,而在數據庫中,關係數據沒法直接表達多對多關聯和繼承關係。所以,對象-關係映射(ORM)系統通常以中間件的形式存在,主要實現程序對象到關係數據庫數據的映射。 |
115. hibernate 中如何在控制檯查看打印的 sql 語句?
116. hibernate 有幾種查詢方式?
|
117. hibernate 實體類能夠被定義爲 final 嗎?
能夠將Hibernate的實體類定義爲final類,但這種作法並很差。由於Hibernate會使用代理模式在延遲關聯的狀況下提升性能,若是你把實體類定義成final類以後,由於 Java不容許對final類進行擴展,因此Hibernate就沒法再使用代理了,如此一來就限制了使用能夠提高性能的手段。不過,若是你的持久化類實現了一個接口並且在該接口中聲明瞭全部定義於實體類中的全部public的方法輪到話,你就可以避免出現前面所說的不利後果。 |
118. 在 hibernate 中使用 Integer 和 int 作映射有什麼區別?
在Hibernate中,若是將OID定義爲Integer類型,那麼Hibernate就能夠根據其值是否爲null而判斷一個對象是不是臨時的,若是將OID定義爲了int類型,還須要在hbm映射文件中設置其unsaved-value屬性爲0。 |
119. hibernate 是如何工做的?
|
120. get()和 load()的區別?
|
121. 說一下 hibernate 的緩存機制?
Hibernate中的緩存分爲一級緩存和二級緩存。 一級緩存就是 Session 級別的緩存,在事務範圍內有效是,內置的不能被卸載。二級緩存是 SesionFactory級別的緩存,從應用啓動到應用結束有效。是可選的,默認沒有二級緩存,須要手動開啓。保存數據庫後,緩存在內存中保存一份,若是更新了數據庫就要同步更新。 擴展:hibernate的二級緩存默認是不支持分佈式緩存的。使用 memcahe,redis等中央緩存來代替二級緩存。 |
122. hibernate 對象有哪些狀態?
hibernate裏對象有三種狀態:
|
123. 在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
|
124. hibernate 實體類必需要有無參構造函數嗎?爲何?
hibernate中每一個實體類必須提供一個無參構造函數,由於hibernate框架要使用reflection api,經過調用Classnewlnstance()來建立實體類的實例,若是沒有無參的構造函數就會拋棄異常。 |
十3、Mybatis
125. mybatis 中 #{}和 ${}的區別是什麼?
|
126. mybatis 有幾種分頁方式?
分頁方式:邏輯分頁和物理分頁。 邏輯分頁:使用MyBatis自帶的RowBounds進行分頁,它是一次性查詢不少數據,而後在數據中進行檢索。 物理分頁:本身手寫SQL分頁或使用分頁插件PageHelper,去數據庫查詢指定條數的分頁數據形式。 |
127. RowBounds 是一次性查詢所有結果嗎?爲何?
RowBounds表面是在「全部」數據中檢索數據,其實並不是是一次性查詢出全部的數據。由於MyBatis是對jdbc的封裝,在jdbc驅動中有一個Fetch Size的配置,它規定了每次最多從數據庫查詢多少條數據,假如你要查詢更多數據,它會在你執行next()的時候,去查詢更多的數據。就比如你去自動取款機取10000元,可是取款機每次只能取2500元,因此你須要取4次才能把錢取完。對於jdbc來講,當你調用next()的時候會自動幫你完成查詢工做。這樣的好處能夠有效的防止內存溢出。 |
128. mybatis 邏輯分頁和物理分頁的區別是什麼?
|
129. mybatis 是否支持延遲加載?延遲加載的原理是什麼?
MyBatis支持延遲加載,設置lazyLoadingEnabled=true便可。 延遲加載的原理是調用的時候觸發加載,而不是在初始化的時候就加載信息。好比調用a.getB().getName(),這個時候發現a.get()的值爲null,此時會單獨觸發事先保存好的關聯B對象的SQL,先查詢出來B,而後在調用a.setB(b),而這個時候在調用a.getB().getName()就有值了,這就是延遲加載的基本原理。 |
130. 說一下 mybatis 的一級緩存和二級緩存?
一級緩存: 基於 PerpetualCache 的 HashMap 本地緩存,其存儲做用域爲 Session,當 Session flush 或 close 以後,該 Session 中的全部 Cache 就將清空,默認打開一級緩存。 二級緩存與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap 存儲,不一樣在於其存儲做用域爲 Mapper(Namespace),而且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啓二級緩存,使用二級緩存屬性類須要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 ; 對於緩存數據更新機制,當某一個做用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操做後,默認該做用域下全部 select 中的緩存將被 clear。 |
131. mybatis 和 hibernate 的區別有哪些?
|
132. mybatis 有哪些執行器(Executor)?
Mybatis有三種基本的執行器(Executor): SimpleExecutor:每執行一次update或select,就開啓一個Statement對象,用完馬上關閉Statement對象。 ReuseExecutor:執行update或select,以sql做爲key查找Statement對象,存在就使用,不存在就建立,用完後,不關閉Statement對象,而是放置於Map內,供下一次使用。簡言之,就是重複使用Statement對象。 BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將全部sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每一個Statement對象都是addBatch()完畢後,等待逐一執行executeBatch()批處理。與JDBC批處理相同。 |
133. mybatis 分頁插件的實現原理是什麼?
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,而後重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。 |
134. mybatis 如何編寫一個自定義插件?
Mybatis自定義插件針對Mybatis四大對象(Executor、StatementHandler 、ParameterHandler 、ResultSetHandler )進行攔截,具體攔截方式爲: Executor:攔截執行器的方法(log記錄) StatementHandler :攔截Sql語法構建的處理 ParameterHandler :攔截參數的處理 ResultSetHandler :攔截結果集的處理 Mybatis自定義插件必須實現Interceptor接口:
intercept方法:攔截器具體處理邏輯方法 plugin方法:根據簽名signatureMap生成動態代理對象 setProperties方法:設置Properties屬性 自定義插件demo:
一個@Intercepts能夠配置多個@Signature,@Signature中的參數定義以下:
|
十4、RabbitMQ
135. rabbitmq 的使用場景有哪些?
|
136. rabbitmq 有哪些重要的角色?
RabbitMQ 中重要的角色有:生產者、消費者和代理:
|
137. rabbitmq 有哪些重要的組件?
|
138. rabbitmq 中 vhost 的做用是什麼?
vhost:每一個RabbitMQ都能建立不少vhost,咱們稱之爲虛擬主機,每一個虛擬主機其實都是mini版的RabbitMQ,它擁有本身的隊列,交換器和綁定,擁有本身的權限機制。 |
139. rabbitmq 的消息是怎麼發送的?
首先客戶端必須鏈接到 RabbitMQ 服務器才能發佈和消費消息,客戶端和 rabbit server 之間會建立一個 tcp 鏈接,一旦 tcp 打開並經過了認證(認證就是你發送給 rabbit 服務器的用戶名和密碼),你的客戶端和 RabbitMQ 就建立了一條 amqp 信道(channel),信道是建立在「真實」 tcp 上的虛擬鏈接,amqp 命令都是經過信道發送出去的,每一個信道都會有一個惟一的 id,不管是發佈消息,訂閱隊列都是經過這個信道完成的。 |
140. rabbitmq 怎麼保證消息的穩定性?
|
141.rabbitmq 怎麼避免消息丟失?
|
142. 要保證消息持久化成功的條件有哪些?
以上四個條件都知足才能保證消息持久化成功。 |
143. rabbitmq 持久化有什麼缺點?
持久化的缺地就是下降了服務器的吞吐量,由於使用的是磁盤而非內存存儲,從而下降了吞吐量。可儘可能使用 ssd 硬盤來緩解吞吐量的問題。 |
144. rabbitmq 有幾種廣播類型?
三種廣播模式:
|
145. rabbitmq 怎麼實現延遲消息隊列?
|
146. rabbitmq 集羣有什麼用?
集羣主要有如下兩個用途:
|
147. rabbitmq 節點的類型有哪些?
|
148. rabbitmq 集羣搭建須要注意哪些問題?
|
149. rabbitmq 每一個節點是其餘節點的完整拷貝嗎?爲何?
不是,緣由有如下兩個:
|
150. rabbitmq 集羣中惟一一個磁盤節點崩潰了會發生什麼狀況?
若是惟一磁盤的磁盤節點崩潰了,不能進行如下操做:
惟一磁盤節點崩潰了,集羣是能夠保持運行的,但你不能更改任何東西。 |
151. rabbitmq 對集羣節點中止順序有要求嗎?
RabbitMQ 對集羣的中止的順序是有要求的,應該先關閉內存節點,最後再關閉磁盤節點。若是順序剛好相反的話,可能會形成消息的丟失。 |
十5、Kafka
152. kafka 能夠脫離 zookeeper 單獨使用嗎?爲何?
kafka不能脫離zookeeper單獨使用,由於kafka使用zookeeper管理和協調kafka的節點服務器。 |
153. kafka 有幾種數據保留的策略?
有兩種數據保存策略,按照過時時間和按照存儲的消息大小。 |
154. kafka 同時設置了 7 天和 10G 清除數據,到第五天的時候消息達到了 10G,這個時候 kafka 將如何處理?
這個時候kafka會執行數據清除工做,時間和大小不論那個知足條件,都會清空數據。 |
155. 什麼狀況會致使 kafka 運行變慢?
一、cpu性能瓶頸 二、磁盤讀寫瓶頸 三、網絡瓶頸 |
156. 使用 kafka 集羣須要注意什麼?
|
十6、Zookeeper
157. zookeeper 是什麼?
zookeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務,是 google chubby 的開源實現,是 hadoop 和 hbase 的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。 |
158. zookeeper 都有哪些功能?
|
159. zookeeper 有幾種部署模式?
zookeeper 有三種部署模式:
|
160. zookeeper 怎麼保證主從節點的狀態同步?
zookeeper 的核心是原子廣播,這個機制保證了各個 server 之間的同步。實現這個機制的協議叫作 zab 協議。 zab 協議有兩種模式,分別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,zab 就進入了恢復模式,當領導者被選舉出來,且大多數 server 完成了和 leader 的狀態同步之後,恢復模式就結束了。狀態同步保證了 leader 和 server 具備相同的系統狀態。 |
161. 集羣中爲何要有主節點?
在分佈式環境中,有些業務邏輯只須要集羣中的某一臺機器進行執行,其餘的機器能夠共享這個結果,這樣能夠大大減小重複計算,提升性能,因此就須要主節點。 |
162. 集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還能夠使用嗎?
能夠繼續使用,單數服務器只要沒超過一半的服務器宕機就能夠繼續使用。 |
163. 說一下 zookeeper 的通知機制?
客戶端端會對某個 znode 創建一個 watcher 事件,當該 znode 發生變化時,這些客戶端會收到 zookeeper 的通知,而後客戶端能夠根據 znode 變化來作出業務上的改變。 |
十7、MySql
164. 數據庫的三範式是什麼?
|
165. 一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 mysql 數據庫,又插入了一條數據,此時 id 是幾?
InnoDB 表只會把自增主鍵的最大 id 記錄在內存中,因此重啓以後會致使最大 id 丟失。 |
166. 如何獲取當前數據庫版本?
使用 select version() 獲取當前 MySQL 數據庫版本。 |
167. 說一下 ACID 是什麼?
|
168. char 和 varchar 的區別是什麼?
char(n) :固定長度類型,好比訂閱 char(10),當你輸入"abc"三個字符的時候,它們佔的空間仍是 10 個字節,其餘 7 個是空字節。 chat 優勢:效率高;缺點:佔用空間;適用場景:存儲密碼的 md5 值,固定長度的,使用 char 很是合適。 varchar(n) :可變長度,存儲的值是每一個值佔用的字節再加上一個用來記錄其長度的字節的長度。 因此,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,兩者使用須要權衡。 |
169. float 和 double 的區別是什麼?
|
170. mysql 的內鏈接、左鏈接、右鏈接有什麼區別?
內鏈接關鍵字:inner join;左鏈接:left join;右鏈接:right join。 內鏈接是把匹配的關聯數據顯示出來;左鏈接是左邊的表所有顯示出來,右邊的表顯示出符合條件的數據;右鏈接正好相反。 |
171. mysql 索引是怎麼實現的?
索引是知足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。 具體來講 MySQL 中的索引,不一樣的數據引擎實現有所不一樣,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,能夠到達二分法的性能,找到數據區域以後就找到了完整的數據結構了,全部索引的性能也是更好的。 |
172. 怎麼驗證 mysql 的索引是否知足需求?
使用 explain 查看 SQL 是如何執行查詢語句的,從而分析你的索引是否知足需求。 explain 語法:explain select * from table where type=1。 |
173. 說一下數據庫的事務隔離?
MySQL 的事務隔離是在 MySQL. ini 配置文件裏添加的,在文件的最後添加:transaction-isolation = REPEATABLE-READ 可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。 READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀)。 READ-COMMITTED:提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀)。 REPEATABLE-READ:可重複讀,默認級別,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會形成幻讀)。 SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。 髒讀 :表示一個事務可以讀取另外一個事務中還未提交的數據。好比,某個事務嘗試插入記錄 A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄 A。 不可重複讀 :是指在一個事務內,屢次讀同一數據。 幻讀 :指同一個事務內屢次查詢返回的結果集不同。好比同一個事務 A 第一次查詢時候有 n 條記錄,可是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的緣由也是另一個事務新增或者刪除或者修改了第一個事務結果集裏面的數據,同一個記錄的數據內容被修改了,全部數據行的記錄就變多或者變少了。 |
174. 說一下 mysql 經常使用的引擎?
InnoDB 引擎:InnoDB 引擎提供了對數據庫 acid 事務的支持,而且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中創建緩衝池,用於緩衝數據和索引。可是該引擎是不支持全文搜索,同時啓動也比較的慢,它是不會保存表的行數的,因此當進行 select count(*) from table 指令的時候,須要進行掃描全表。因爲鎖的粒度小,寫操做是不會鎖定全表的,因此在併發度較高的場景下使用會提高效率的。 MyIASM 引擎:MySQL 的默認引擎,但不提供事務的支持,也不支持行級鎖和外鍵。所以當執行插入和更新語句時,即執行寫操做的時候須要鎖定這個表,因此會致使效率會下降。不過和 InnoDB 不一樣的是,MyIASM 引擎是保存了表的行數,因而當進行 select count(*) from table 語句時,能夠直接的讀取已經保存的值而不須要進行掃描全表。因此,若是表的讀操做遠遠多於寫操做時,而且不須要事務的支持的,能夠將 MyIASM 做爲數據庫引擎的首選。 |
175. 說一下 mysql 的行鎖和表鎖?
MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認爲行鎖。
|
176. 說一下樂觀鎖和悲觀鎖?
數據庫的樂觀鎖須要本身實現,在表裏面添加一個 version 字段,每次修改爲功值加 1,這樣每次修改的時候先對比一下,本身擁有的 version 和數據庫如今的 version 是否一致,若是不一致就不修改,這樣就實現了樂觀鎖。 |
177. mysql 問題排查都有哪些手段?
|
178. 如何作 mysql 的性能優化?
|
十8、Redis
179. redis 是什麼?都有哪些使用場景?
Redis是一個使用c語言開發的高速緩存數據庫。 Redis使用場景:
|
180. redis 有哪些功能?
|
181. redis 和 memecache 有什麼區別?
|
182. redis 爲何是單線程的?
|
183. 什麼是緩存穿透?怎麼解決?
緩存穿透:指查詢一個必定不存在的數據,因爲緩存是不命中時須要從數據庫查詢,查不到數據則不寫入緩存,這將致使這個不存在的數據每次請求都要到數據庫去查詢,形成緩存穿透。 解決方案:最簡單粗暴的方法若是一個查詢返回的數據爲空(無論是數據不存在,仍是系統故障),咱們就把這個空結果進行緩存,但它的過時時間會很短,最長不超過五分鐘。 |
184. redis 支持的數據類型有哪些?
Redis支持的數據類型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。 |
185. redis 支持的 java 客戶端都有哪些?
支持的java客戶端有redisson、jedis、lettuce等。 |
186. jedis 和 redisson 有哪些區別?
|
187. 怎麼保證緩存和數據庫數據的一致性?
|
188. redis 持久化有幾種方式?
Redis 的持久化有兩種方式,或者說有兩種策略:
|
189.redis 怎麼實現分佈式鎖?
Redis 分佈式鎖其實就是在系統裏面佔一個「坑」,其餘程序也要佔「坑」的時候,佔用成功了就能夠繼續執行,失敗了就只能放棄或稍後重試。 佔坑通常使用 setnx(set if not exists)指令,只容許被一個程序佔有,使用完調用 del 釋放鎖。 |
190. redis 分佈式鎖有什麼缺陷?
Redis 分佈式鎖不能解決超時的問題,分佈式鎖有一個超時時間,程序的執行若是超出了鎖的超時時間就會出現問題。 |
191. redis 如何作內存優化?
儘量使用散列表(hashes),散列表(是說散列表裏面存儲的數少)使用的內存很是小,因此你應該儘量的將你的數據模型抽象到一個散列表裏面。 好比你的web系統中有一個用戶對象,不要爲這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是應該把這個用戶的全部信息存儲到一張散列表裏面。 |
192. redis 淘汰策略有哪些?
|
193. redis 常見的性能問題有哪些?該如何解決?
|
十9、JVM
194. 說一下 jvm 的主要組成部分?及其做用?
組件的做用: 首先經過類加載器(ClassLoader)會把 Java 代碼轉換成字節碼,運行時數據區(Runtime Data Area)再把字節碼加載到內存中,而字節碼文件只是 JVM 的一套指令集規範,並不能直接交個底層操做系統去執行,所以須要特定的命令解析器執行引擎(Execution Engine),將字節碼翻譯成底層系統指令,再交由 CPU 去執行,而這個過程當中須要調用其餘語言的本地庫接口(Native Interface)來實現整個程序的功能 |
195. 說一下 jvm 運行時數據區?
不一樣虛擬機的運行時數據區可能略微有所不一樣,但都會聽從 Java 虛擬機規範, Java 虛擬機規範規定的區域分爲如下 5 個部分:
|
196. 說一下堆棧的區別?
功能方面:堆是用來存放對象的,棧是用來執行程序的 |
197. 隊列和棧是什麼?有什麼區別?
隊列和棧都是被用來預存儲數據的。 隊列容許先進先出檢索元素,但也有例外的狀況,Deque 接口容許從兩端檢索元素。 棧和隊列很類似,但它運行對元素進行後進先出進行檢索 |
198. 什麼是雙親委派模型?
在介紹雙親委派模型以前先說下類加載器。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在 JVM 中的惟一性,每個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,而後再轉化爲 class 對象。 類加載器分類:
雙親委派模型:若是一個類加載器收到了類加載的請求,它首先不會本身去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣全部的加載請求都會被傳送到頂層的啓動類加載器中,只有當父加載沒法完成加載請求(它的搜索範圍中沒找到所需的類)時,子加載器纔會嘗試去加載類 |
199. 說一下類加載的執行過程?
類裝載分爲如下 5 個步驟: 加載:根據查找路徑找到相應的 class 文件而後導入 檢查:檢查加載的 class 文件的正確性 準備:給類中的靜態變量分配內存空間 解析:虛擬機將常量池中的符號引用替換成直接引用的過程。 符號引用就理解爲一個標示,而在直接引用直接指向內存中的地址 初始化:對靜態變量和靜態代碼塊執行初始化工做 |
200. 怎麼判斷對象是否能夠被回收?
通常有兩種方法來判斷:
|
201. java 中都有哪些引用類型?
|
202. 說一下 jvm 有哪些垃圾回收算法?
|
203. 說一下 jvm 有哪些垃圾回收器?
|
204. 詳細介紹一下 CMS 垃圾回收器?
CMS 是英文 Concurrent Mark-Sweep 的簡稱,是以犧牲吞吐量爲代價來得到最短回收停頓時間的垃圾回收器。對於要求服務器響應速度的應用上,這種垃圾回收器很是適合。在啓動 JVM 的參數加上「-XX:+UseConcMarkSweepGC」來指定使用 CMS 垃圾回收器 CMS 使用的是標記-清除的算法實現的,因此在 gc 的時候回產生大量的內存碎片,當剩餘內存不能知足程序運行要求時,系統將會出現 Concurrent Mode Failure,臨時 CMS 會採用 Serial Old 回收器進行垃圾清除,此時的性能將會被下降 |
205. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什麼區別?
新生代回收器:Serial、ParNew、Parallel Scavenge 老年代回收器:Serial Old、Parallel Old、CMS 整堆回收器:G1 新生代垃圾回收器通常採用的是複製算法,複製算法的優勢是效率高,缺點是內存利用率低;老年代回收器通常採用的是標記-整理的算法進行垃圾回收 |
206. 簡述分代垃圾回收器是怎麼工做的?
分代回收器有兩個分區:老生代和新生代,新生代默認的空間佔比總空間的 1/3,老生代的默認佔比是 2/3 新生代使用的是複製算法,新生代裏有 3 個分區:Eden、To Survivor、From Survivor,它們的默認佔比是 8:1:1,它的執行流程以下: 把 Eden + From Survivor 存活的對象放入 To Survivor 區 清空 Eden 和 From Survivor 分區 From Survivor 和 To Survivor 分區交換,From Survivor 變 To Survivor,To Survivor 變 From Survivor 每次在 From Survivor 到 To Survivor 移動時都存活的對象,年齡就 +1,當年齡到達 15(默認配置是 15)時,升級爲老生代。大對象也會直接進入老生代。 老生代當空間佔用到達某個值以後就會觸發全局垃圾收回,通常使用標記整理的執行算法。以上這些循環往復就構成了整個分代垃圾回收的總體執行流程 |
207. 說一下 jvm 調優的工具?
JDK 自帶了不少監控工具,都位於 JDK 的 bin 目錄下,其中最經常使用的是 jconsole 和 jvisualvm 這兩款視圖監控工具 jconsole:用於對 JVM 中的內存、線程和類等進行監控; jvisualvm:JDK 自帶的全能分析工具,能夠分析:內存快照、線程快照、程序死鎖、監控內存的變化、gc 變化等 |
208. 經常使用的 jvm 調優的參數都有哪些?
-Xms2g:初始化推大小爲 2g -Xmx2g:堆最大內存爲 2g -XX:NewRatio=4:設置年輕的和老年代的內存比例爲 1:4 -XX:SurvivorRatio=8:設置新生代 Eden 和 Survivor 比例爲 8:2 –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器組合 -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器組合 -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器組合 -XX:+PrintGC:開啓打印 gc 信息 -XX:+PrintGCDetails:打印 gc 詳細信息 |