point


https://github.com/Snailclimb/JavaGuidejava


基礎篇
基本功
面向對象的特徵
繼承,封裝,多態node

int 和 Integer 有什麼區別
int基本數據類型,Integer封裝的整數類型
iNT默認0,Integer默認爲null
Integer須要實例化使用mysql


重載和重寫的區別
重載時在同一個類中,相同方法名,不一樣的方法參數git

抽象類和接口有什麼區別
抽象類能夠有具體方法,接口不能夠
抽象類用abstract修飾,接口interfacegithub

 

 

說說反射的用途及實現
它容許運行中的 Java 程序獲取自身的信息,而且能夠操做類或對象的內部屬性。
在運行時獲得對象所屬的類,類的屬性,構造器,方法等
實現各類通用框架invokeredis


說說自定義註解的場景及實現算法

HTTP 請求的 GET 與 POST 方式的區別spring

session 與 cookie 區別sql

session 分佈式處理數據庫

JDBC 流程

MVC 設計思想

equals 與 == 的區別

集合
List 和 Set 區別
List有序可重複,有序意思是保持了每一個元素的插入順序,輸出的順序就是插入的順序
Set無序不可重複,只容許一個null。實現類有HashSet,SortedSet,LinkedHashSet,
TreeSet是基於TreeMap實現的,紅黑樹


List 和 Map 區別
List保持了每一個元素的插入順序,輸出的順序就是插入的順序
Map存儲key-value

Arraylist 與 LinkedList 區別
Arraylist數組實現,查找
LinkedList循環鏈表,插入和刪除


ArrayList 與 Vector 區別
ArrayList線程不安全
Vector線程安全,大多數方法用了Syschronized

HashMap 和 Hashtable 的區別
1.hashmap線程不安全,hashtable線程安全
2.初始值不一樣,hashmap 16,hashtable 11
3.擴容 hashmap 2倍,hashtable 2倍+1
4.hashmap 容許key,value爲null,hashtable只容許value爲null
5.hash方法不一樣
6.繼承的接口不一樣,hashmap 繼承abstractmap ,hashtable 繼承
7.迭代方式不一樣,hashmap"從前日後"遍歷數組,而後在從頭至尾遍歷鏈表;hashtable"從後往前"遍歷數組,而後在從頭至尾遍歷鏈表
相同點:
都是數組+鏈表(Entry類型)

collects.sort()能夠指定比較器Comparator,實現此接口。
Collections.sort(convertChars, new Comparator() {
public int compare(Object arg0, Object arg1) {
return NumberConverter.parseInt((String) arg0) - NumberConverter.parseInt((String) arg1);
}
});

(01) "Comparable"
* 它是一個排序接口,只包含一個函數compareTo()。
* 一個類實現了Comparable接口,就意味着「該類自己支持排序」,它能夠直接經過Arrays.sort() 或 Collections.sort()進行排序。
* (02) "Comparator"
* 它是一個比較器接口,包括兩個函數:compare() 和 equals()。
* 一個類實現了Comparator接口,那麼它就是一個「比較器」。其它的類,能夠根據該比較器去排序。
* 綜上所述:Comparable是內部比較器,而Comparator是外部比較器。
* 一個類自己實現了Comparable比較器,就意味着它自己支持排序;若它自己沒實現Comparable,也能夠經過外部比較器Comparator進行排序。

HashSet 和 HashMap 區別
HashSet底層實現就是HashMap,HashSet = new HashMap()

HashMap 和 ConcurrentHashMap 的區別


HashMap 的工做原理及代碼實現
數組+鏈表


157. zookeeper 是什麼?
開源的分佈式協調服務,可提供服務發現,配置管理等

158. zookeeper 都有哪些功能?
分佈式服務註冊與訂閱
命名服務,dubbo註冊中心
配置管理,
程序老是須要配置的,若是程序分散部署在多臺機器上,要逐個改變配置就變得困難。如今把這些配置所有放到zookeeper上去,保存在 Zookeeper的某個目錄節點中,而後全部相關應用程序對這個目錄節點進行監聽,
一旦配置信息發生變化,每一個應用程序就會收到 Zookeeper 的通知,而後從 Zookeeper 獲取新的配置信息應用到系統中就好
集羣管理(leader選舉,機器加入和退出)
分佈式鎖
159. zookeeper 有幾種部署模式?
單機,集羣,僞集羣

160. zookeeper 怎麼保證主從節點的狀態同步?
zk核心是原子廣播,保證各server之間同步。實現這個機制的協議叫作Zab協議。Zab協議有兩種模式,
它們分別是恢復模式(選主)和廣播模式(同步)。當服務啓動或者在領導者崩潰後,Zab就進入了恢復模式,
當領導者被選舉出來,且大多數Server完成了和 leader的狀態同步之後,恢復模式就結束了。
狀態同步保證了leader和Server具備相同的系統狀態。

總結就是zab協議做用一、選舉出leader;二、同步節點之間的狀態達到數據一致;三、數據的廣播。
全部的寫操做都會轉發給leader,而後leader會將更新廣播給全部的follower,當半數以上的實例都完成寫操做後,
leader纔會提交這個寫操做,隨後客戶端會收到寫操做執行成功的響應。這麼來的話,就實現了客戶端的寫操做的原子性,每一個寫操做要麼成功要麼失敗。邏輯和數據庫的兩階段提交協議很像。

161. 集羣中爲何要有主節點?

主從,主提供寫,從提供讀
162. 集羣中有 3 臺服務器,其中一個節點宕機,這個時候 zookeeper 還可使用嗎?

能夠,過半數存在就能夠
163. 說一下 zookeeper 的通知機制?
在 ZooKeeper 中,引入了 Watcher 機制來實現這種分佈式的通知功能。ZooKeeper 容許客戶端向服務端註冊一個 Watcher 監聽,當服務器的一些特定事件觸發了這個 Watcher,那麼就會向指定客戶端發送一個事件通知來實現分佈式的通知功能
ZooKeeper 的 Watcher 機制主要包括客戶端線程、客戶端 WatchManager 和 ZooKeeper 服務器三部分

 

ps:
行。
ZooKeeper 將全部數據存儲在內存中,數據模型是一棵樹(Znode Tree),由斜槓(/),znode分爲持久節點和臨時節點,而且能夠加序列號,ZooKeeper 是高性能的。在「讀」多於「寫」的應用程序中尤爲地高性能,由於「寫」會致使全部的服務器間同步狀態
ZooKeeper 將數據保存在內存中,這也就保證了 高吞吐量和低延遲(可是內存限制了可以存儲的容量不太大,此限制也是保持 Znode 中存儲的數據量較小的進一步緣由)

zk特色
順序性
Znode的每次寫操做都至關於數據庫裏的一次事務提交,每一個寫操做都有個全局惟一的ID,稱爲:zxid(ZooKeeper Transaction)。ZooKeeper會根據寫操做的zxid大小來對操做進行排序,zxid小的操做會先執
原子性:全部事務請求的處理結果在整個集羣中全部機器上的應用狀況是一致的,也就是說,要麼整個集羣中全部的機器都成功應用了某一個事務,要麼都沒有應用。
單一系統映像:不管客戶端連到哪個 ZooKeeper 服務器上,其看到的服務端數據模型都是一致的。
可靠性:一旦一次更改請求被應用,更改的結果就會被持久化,直到被下一次更改覆蓋。

Leader、Follower 和 Observer 三種角色
-------------------------------------------------------action


十9、JVM

194. 說一下 jvm 運行時數據區說一下
共享:方法區,共同的類的信息(版本,字段,方法,接口),靜態,常量。存在垃圾回收
堆,對象實例存放區,垃圾回收主要操做區。新生代和老年代,物理是不連續的內存空間


線程獨享:程序計數器,編譯成class文件,執行時指示代碼
棧(虛擬機棧,本地方法棧),虛擬機棧Java方法的引用,棧幀,方法調用即將方法壓入棧幀,線幀存儲局部變量,
操做棧,動態連接,方法出口等信息。每一個方法調用就是從入棧到出棧的過程
本地方法native方法

 

195.jvm 的主要組成部分?及其做用?

類加載器,加載文件class到內存,只要驗證經過JVM
運行時數據區,寫的代碼加載到此區域中
執行引擎,解釋器,解釋命令,交給操做系統執行
本地接口,融合不一樣的語言爲java所用

 

196. 說一下堆棧的區別?

 

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

 

198. 什麼是雙親委派模型?
在類加載的過程當中,會先請求parent去加載,依次向上
bootstrapclassloader
extclassloader
appclassloader


199. 說一下類加載的執行過程?
裝載,找到類的二進制數據
-連接(
驗證,是否符合格式,
準備,爲靜態變量分配內存,並初始化爲默認值
解析,把類中的符號引用轉換爲直接引用)
-初始化,給靜態變量賦初始值

 

200. 怎麼判斷對象是否能夠被回收?

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

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


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


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

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

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

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

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

十7、MySql
()
164. 數據庫的三範式是什麼?

1.第一範式1NF(確保每列保持原子性),屬性不能再分割
2.第二範式2NF(確保表中的每列都和主鍵相關),再知足第一範式以後,每張表只描述一種數據。確保數據每一列
與主鍵關聯,而不是隻與主鍵的部分列關聯(對聯合主鍵而言)。目的減小了數據冗餘。
3.第三範式(確保每列都和主鍵列直接相關,而不是間接相關),在知足第二範式以後,確保每一列數據都與主鍵直接關聯


165. 一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 mysql 數據庫,又插入了一條數據,此時 id 是幾?
SQL Server自增用identity(m,n)m爲初始值,n爲自增間隔
create table test22(
id int identity(1,1),
num varchar(2)
)
innoDB若是不重啓,id爲自增,即8;由於InnoDB只把最大ID記錄在內存裏,若是重啓使最大ID丟失,在現有數據自增,
即id爲6;
MyISAM,把最大ID放在數據文件不會丟失,全部id爲8


166. 如何獲取當前數據庫版本?
sql server在Object Explorer顯示的主要版本號信息,select @@version
mysql select version()


167. 說一下 ACID 是什麼?
ACID,事務
automatic 原子性,都成功或都失敗
consistency 一致性一致性表現爲事務進行後和執行前,總體系統都是穩定的,好比對於入帳出帳操做是不會有
總資金的變化的。
isolation 隔離性,各個事務之間執行互不干擾。
durability 持久性,事務完成後,數據更新是持久的

 

168. char 和 varchar 的區別是什麼?
char定長,效率較高,以空間換時間,
varchar不定長
好比存儲‘abc’,char(10)表示長度是10,不足用空格代替,varchar(10)表示長度是3,最大是10,小於最大值按實際長度存儲。
取數據的時候,char類型的要用trim()去掉多餘的空格,而varchar是不須要的
nvarchar(n),nchar(n) 存儲unicode,n表明字節數,因爲是unicode,因此可存儲2n個字節
varchar(n),char(n) 可存儲n個字節

 

169. float 和 double 的區別是什麼?
float單精度浮點數,8位有效數字,內存佔4個字節
double雙精度浮點數,16位有效數字,內存佔8個字節


170. mysql 的內鏈接、左鏈接、右鏈接有什麼區別?
兩個表都有的數據;左邊表爲主表,左邊表存在的數據;右邊表爲主表,右邊表全部的數據


171. mysql 索引是怎麼實現的?
索引是一個排序列表,表裏存着索引值和這個值對應的物理地址。使用索引後不用所有掃描,先經過索引找到對應
物理地址而後訪問相應的數據。

 

172. 怎麼驗證 mysql 的索引是否知足需求?
在select語句前加上explain就能夠用來查看sql的執行計劃,
explain顯示了MySQL如何使用索引來處理select語句以及鏈接表

 


173. 說一下數據庫的事務隔離?
隔離級別
髒讀 可讀到其餘事務未提交的數據
不可重複讀 同一個數據屢次讀數據不一樣,
幻讀 屢次讀數據個數不一樣

串行 均可避免
可重複讀 可避免髒讀和不可重複讀
讀已提交 可避免髒讀
讀未提交 都不能避免


174. 說一下 mysql 經常使用的引擎?
myISAM
InnoDB

 

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


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

悲觀鎖,每次取數據都認爲會被修改,因此在操做前都會加鎖,行鎖,表鎖等,Java中synchronized
樂觀鎖,認爲不會被修改,不加鎖,但更新的時候會判斷是否是期間是否是有更新操做。版本號控制,CAS

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

執行計劃 explain + sql

178. 如何作 mysql 的性能優化?
索引,緩存,優化sql,優化表結構,拆分表,分庫


7、異常

74. throw 和 throws 的區別?

throw在方法體內,拋出的異常的實例
throws在方法聲明,會拋出這種類型的異常,使調用者知道要捕獲這個異常

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

final修飾變量,方法,類等
finally 異常處理機制,finally結構使代碼總會執行,而無論無異常發生
finalize 垃圾回收方法

76. try-catch-finally 中哪一個部分能夠省略?
finally
77. try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?

78. 常見的異常類有哪些?
Exception能夠分爲checked exceptions和unchecked exceptions
unchecked exceptions(運行時異常)都是RuntimeException類及其子類異常,就是咱們在開發中測試功能時程序終止,控制檯出現的異常,好比:
NullPointerException(空指針異常)、
IndexOutOfBoundsException(下標越界異常)
ClassCastException(類轉換異常)
ArrayStoreException(數據存儲異常,操做數組時類型不一致)
IO操做的BufferOverflowException異常

2, checked exceptions,非運行時異常(編譯異常):是RuntimeException之外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,若是不處理,程序就不能編譯經過。如IOException、SQLException等以及用戶自定義的Exception異常,通常狀況下不自定義檢查異常。
通俗的話說就是在寫代碼時出現紅線,須要try catch或者throws時出現的異常。


79.運行時異常與通常異常有何異同?

異常表示程序運行過程當中可能出現的非正常狀態,運行時異常表示虛擬機的一般操做中可能遇到的異常,是一種常見運行錯誤。
java編譯器要求方法必須聲明拋出可能發生的非運行時異常,可是並不要求必須聲明拋出未被捕獲的運行時異常

12、Hibernate

113. 爲何要使用 hibernate?
對JDBC作了封裝,簡化了重複性代碼;
性能好,支持各類關係型數據庫,映射靈活性

 

114. 什麼是 ORM 框架?

對象關係數據庫,實體對象和關係型數據庫建立映射,不直接操做sql

 


115. hibernate 中如何在控制檯查看打印的 sql 語句?
properties show_sql = true


116. hibernate 有幾種查詢方式?
hql ,原生sql,條件查詢

 


117. hibernate 實體類能夠被定義爲 final 嗎?

不能

hibernate是使用cglib代理生成的代理對象
118. 在 hibernate 中使用 Integer 和 int 作映射有什麼區別?
interger包裝類,若是數據庫可爲null,不會報錯。建議使用Integer

 

119. hibernate 是如何工做的?

 


120. get()和 load()的區別?
get查找的時候從session緩存找,若是沒有再去二級緩存,若是在沒有就去數據庫,找不到返回null;
load根據配置文件設置,若是爲true,查找session緩存,沒找到就延時加載,返回實體的代理類對象,等到具體使用
時,在繼續查找二級緩存和數據庫,沒有則拋出異常objectnotfoundexception.若是爲false,則與get查找同樣。

 

121. 說一下 hibernate 的緩存機制?
一級緩存,即session級別緩存,在一個session內有效,session關閉後失效。hibernate默認存在的,強制性的。
二級緩存,全部的Session均可以使用,有可能出現併發問題,所以須要採用適當的併發訪問策略,
該策略爲被緩存的數據提供了事務隔離級別。第二級緩存是可選的,是一個可配置的插件。


122. hibernate 對象有哪些狀態?
1,Transient 瞬時 :對象剛new出來,還沒設id,設了其餘值。

2,Persistent 持久:調用了save()、saveOrUpdate(),就變成Persistent,有id

3,Detached 脫管 : 當session close()完以後,變成Detached。


123. 在 hibernate 中 getCurrentSession 和 openSession 的區別是什麼?
getCurrentSession
若是當前存在session則返回此session,不然建立新的;
建立的session在commit或rollback後會自動關閉;
須要配置文件中配置,
getCurrentSession本地事務(本地事務:jdbc)時 要在配置文件裏進行以下設置:
若是使用的是本地事務(jdbc事務)
<property name="hibernate.current_session_context_class">thread</property>
若是使用的是全局事務(jta事務)
<property name="hibernate.current_session_context_class">jta</property>

opensession每次建立;須要手動關閉

124. hibernate 實體類必需要有無參構造函數嗎?爲何?
必須.hibernate默認調用無參構造器經過反射建立實例對象。
當查詢的時候返回的實體類是一個對象實例,是Hibernate動態經過反射生成的。
反射的Class.forName(「className」).newInstance()須要對應的類提供一個無參構造方法,必須有個無參的構造方法
將對象建立出來


RabbitMQ
135.rabbitmq 的使用場景有哪些?
1.異步處理,例如註冊後發送驗證郵件短信
2.應用解耦,訂單系統和庫存系統
3.流量削峯,秒殺
--4.消息通信,即廣播的幾種模式


136.rabbitmq 有哪些重要的角色?
producer
exchange,消息交換機,
queen,消息載體
vhost,visual host虛擬主機
custmer


137.rabbitmq 有哪些重要的組件?
channel,信道,服務的經過信道發送消息到交換器

138.rabbitmq 中 vhost 的做用是什麼?
虛擬主機,一個broker多個vhost,提供權限分離

141.rabbitmq 怎麼避免消息丟失?
1.消息持久化:
Exchange 設置持久化:durable:true
Queue 設置持久化
Message持久化發送,發送消息設置發送模式deliveryMode=2表明持久化消息
2.ACK確認機制:
消息發送確認:
ConfirmCallback 只確認消息是否正確到達 Exchange 中。
ReturnCallback 消息沒有正確到達隊列時觸發回調,若是正確到達隊列不執行
消息接收確認:
默認狀況下消息消費者是自動 ack (確認)消息的,須要設置爲手動確認,緣由是:自動確認會在消息發送給消費者
後當即確認,這樣存在丟失消息的可能。就是消費端消費完成要通知服務端,服務端才把消息從內存刪除。
3.設置集羣鏡像模式:
4.消息補償機制:
消息補償機制須要創建在消息要寫入DB日誌,發送日誌,接受日誌,二者的狀態必須記錄。
而後根據DB日誌記錄check 消息發送消費是否成功,不成功,進行消息補償措施,從新發送消息處理


142.要保證消息持久化成功的條件有哪些?
Exchange 設置持久化:durable:true,exchangeDeclare方法,channel.ExchangeDeclare(ExchangeName, "direct", durable: true
Queue 設置持久化,channel.QueueDeclare(QueueName, durable: true
Message持久化發送,發送消息設置發送模式deliveryMode=2表明持久化消息,channel.basicPublish

143.rabbitmq 持久化有什麼缺點?
性能損耗,但也不能保證100%消息不丟失

 

144.rabbitmq 有幾種廣播類型?
direct直接匹配,exchang根據routingkey將消息路由到對應queue,
fanout廣播模式,綁定的exchange的queue都會接收到
topic,模糊匹配,全部符合routingKey(此時能夠是一個表達式)的routingKey所bind的queue能夠接收消息
header


145.rabbitmq 怎麼實現延遲消息隊列?
Dead Letter Exchange和ttl

146.rabbitmq 集羣有什麼用?

147.rabbitmq 節點的類型有哪些?
內存節點、磁盤節點

148.rabbitmq 集羣搭建須要注意哪些問題?

149.rabbitmq 每一個節點是其餘節點的完整拷貝嗎?爲何?

150.rabbitmq 集羣中惟一一個磁盤節點崩潰了會發生什麼狀況?

151.rabbitmq 對集羣節點中止順序有要求嗎?


消息隊列

消息的冪等性解決思路
MQ消費者的冪等行的解決通常使用全局ID 或者寫個惟一標識好比時間戳 或者UUID
或者redis原子性(咱們都知道redis是單線程的,而且性能也很是好,提供了不少原子性的命令。好比可使用 setnx 命令。在接收到消息後將消息ID做爲key執行 setnx 命令,若是執行成功就表示沒有處理過這條消息,能夠進行消費了,
執行失敗表示消息已經被消費了)
消費者消費mq中的消息:也可利用mq的該id來判斷,或者可按本身的規則生成一個全局惟一id,每次消費消息時先用該id先判斷該消息是否已消費過

消息的堆積解決思路
多在消息發送的速率遠遠大於消息消費的速率狀況下出現,默認狀況下,rabbitmq消費者爲單線程串行消費,這也是隊列的特性,設置併發消費兩個關鍵屬性concurrentConsumers和prefetchCount,concurrentConsumers設置的是
對每一個listener在初始化的時候設置的併發消費者的個數,prefetchCount是每次一次性從broker裏面取的待消費的消息的個數。

如何保證消息的有序性
一、單線程消費來保證消息的順序性;二、對消息進行編號,消費者處理時根據編號判斷順序。
在 MQ 裏面建立多個 queue,同一規則的數據(對惟一標識進行 hash),有順序的放入 MQ 的 queue 裏面,消費者只取一個 queue 裏面獲取數據消費,這樣執行的順序是有序的。或者仍是隻有一個 queue 可是對應一個消費者,
而後這個消費者內部用內存隊列作排隊,而後分發給底層不一樣的 worker 來處理。

 

 

ConcurrentHashMap 的工做原理及代碼實現
segment(相似hashtable)+鏈表(HashEntry)
ConcurrentHashMap在對象中保存了一個Segment數組,即將整個Hash表劃分爲多個分段;而每一個Segment元素,即每一個分段則相似於一個Hashtable;這樣,在執行put操做時首先根據hash算法定位到元素屬於哪一個Segment,
而後對該Segment加鎖便可。所以,ConcurrentHashMap在多線程併發編程中但是實現多線程put操做.在ConcurrentHashMap中,定義了一個Segment<K, V>[]數組來將Hash表實現分段存儲,從而實現分段加鎖;而麼一個Segment元素則
與HashMap結構相似,其包含了一個HashEntry數組,用來存儲Key/Value對。Segment繼承了ReetrantLock,表示Segment是一個可重入鎖,所以ConcurrentHashMap經過可重入鎖對每一個分段進行加鎖。

 

線程

既然咱們應該在synchronized的函數或是對象裏調用wait,那哪一個對象應該被synchronized呢?答案是,那個 你但願上鎖的對象就應該被synchronized,即那個在多個線程間被共享的對象。在生產者消費者問題中,應該被synchronized的就是那個緩衝區隊列。

sleep和wait,
用wait時報錯, java.lang.IllegalMonitorStateExceptionjava.lang.IllegalMonitorStateExceptionException,
由於當前線程必須獲得對象鎖,若是沒獲得就報此錯。

建立線程的方式及實現

sleep() 、join()、yield()有什麼區別

說說 CountDownLatch 原理
java.util.concurrent包,有countdown(),await()等方法,await等待latch變爲0才繼續執行後續。

說說 CyclicBarrier 原理
java.util.concurrent包,一組線程互相等待,到達某個數,一塊兒執行。

說說 Semaphore 原理

說說 Exchanger 原理

說說 CountDownLatch 與 CyclicBarrier 區別
CountDownLatch 一次性的,CyclicBarrier 可更改

ThreadLocal 原理分析

講講線程池的實現原理

線程池的幾種方式

線程的生命週期
新建,就緒,運行,阻塞(等待),死亡


鎖機制
說說線程安全問題

volatile 實現原理

synchronize 實現原理

synchronized 與 lock 的區別

CAS 樂觀鎖

ABA 問題

樂觀鎖的業務場景及實現方式

核心篇
數據存儲
MySQL 索引使用的注意事項

說說反模式設計

說說分庫與分表設計

分庫與分錶帶來的分佈式困境與應對之策

說說 SQL 優化之道

MySQL 遇到的死鎖問題

存儲引擎的 InnoDB 與 MyISAM

數據庫索引的原理

爲何要用 B-tree

彙集索引與非彙集索引的區別

limit 20000 加載很慢怎麼解決

選擇合適的分佈式主鍵方案

選擇合適的數據存儲方案

ObjectId 規則

聊聊 MongoDB 使用場景

倒排索引

聊聊 ElasticSearch 使用場景


緩存使用
Redis 有哪些類型

Redis 內部結構

聊聊 Redis 使用場景

Redis 持久化機制

Redis 如何實現持久化

Redis 集羣方案與實現

Redis 爲何是單線程的

緩存奔潰

緩存降級

使用緩存的合理性問題

 

框架篇
Spring
BeanFactory 和 ApplicationContext 有什麼區別

Spring Bean 的生命週期

Spring IOC 如何實現

說說 Spring AOP

Spring AOP 實現原理

動態代理(cglib 與 JDK)

Spring 事務實現方式

Spring 事務底層原理

如何自定義註解實現功能

Spring MVC 運行流程

Spring MVC 啓動流程

Spring 的單例實現原理

Spring 框架中用到了哪些設計模式

Spring 其餘產品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)

Netty
爲何選擇 Netty

說說業務中,Netty 的使用場景

原生的 NIO 在 JDK 1.7 版本存在 epoll bug

什麼是TCP 粘包/拆包

TCP粘包/拆包的解決辦法

Netty 線程模型

說說 Netty 的零拷貝

Netty 內部執行流程

Netty 重連實現

微服務篇
微服務
先後端分離是如何作的

微服務哪些框架

你怎麼理解 RPC 框架

說說 RPC 的實現原理

說說 Dubbo 的實現原理

你怎麼理解 RESTful

說說如何設計一個良好的 API

如何理解 RESTful API 的冪等性

如何保證接口的冪等性

說說 CAP 定理、 BASE 理論

怎麼考慮數據一致性問題

說說最終一致性的實現方案

你怎麼看待微服務

微服務與 SOA 的區別

如何拆分服務

微服務如何進行數據庫管理

如何應對微服務的鏈式調用異常

對於快速追蹤與定位問題

微服務的安全

分佈式
談談業務中使用分佈式的場景

Session 分佈式方案

分佈式鎖的場景

分佈是鎖的實現方案

分佈式事務

集羣與負載均衡的算法與實現

說說分庫與分表設計

分庫與分錶帶來的分佈式困境與應對之策

安全&性能
安全問題
安全要素與 STRIDE 威脅

防範常見的 Web 攻擊

服務端通訊安全攻防

HTTPS 原理剖析

HTTPS 降級攻擊

受權與認證

基於角色的訪問控制

基於數據的訪問控制

 

設計模式
你項目中有使用哪些設計模式

說說經常使用開源框架中設計模式使用分析

說說你對設計原則的理解

23種設計模式的設計理念

設計模式之間的異同,例如策略模式與狀態模式的區別

設計模式之間的結合,例如策略模式+簡單工廠模式的實踐

設計模式的性能,例如單例模式哪一種性能更好。

業務工程
你係統中的先後端分離是如何作的

 

一、hashcode相等兩個類必定相等嗎?equals呢?相反呢?

 

二、介紹一下集合框架?

三、hashmap hastable 底層實現什麼區別?hashtable和concurrenthashtable呢?

四、hashmap和treemap什麼區別?低層數據結構是什麼?

五、線程池用過嗎都有什麼參數?底層如何實現的?

六、sychnized和Lock什麼區別?sychnize 什麼狀況狀況是對象鎖? 何時是全局鎖爲何?

七、ThreadLocal 是什麼底層如何實現?寫一個例子唄?

八、volitile的工做原理?

九、cas知道嗎如何實現的?

十、請用至少四種寫法寫一個單例模式?

 

 

Serial收集器
ParNew收集器

二、線上發送頻繁full gc如何處理? CPU 使用率太高怎麼辦?

如何定位問題?如何解決說一下解決思路和處理方法

三、知道字節碼嗎?字節碼都有哪些?Integer x =5,int y =5,比較x =y 都通過哪些步驟?

四、講講類加載機制唄都有哪些類加載器,這些類加載器都加載哪些文件?

appclassloader應用類加載器加載一個類,不會本身去加載,會委派給父類加載器ExtClassLoader擴展加載器去加載,

而extClassLoader也不會本身去加載,他委派給父類BootstrapClassLoader啓動類加載器。若是bootstrapclassloader
加載失敗(如在java_home/jre/lib找不到該class),則會使用ExtClassLoader來嘗試加載,若ExtClassLoader也加載失敗,則會使用AppClassLoader來加載
。若是AppClassLoader也加載失敗,則會報出異常ClassNotFoundException。
其實這就是所謂的雙親委派模型。簡單來講:若是一個類加載器收到了類加載的請求,它首先不會本身去嘗試加載這個類,而是把請求委託給父加載器去完成,依次向上。

好處:

防止內存中出現多份一樣的字節碼(安全性角度)

啓動類加載器rt.jar 下class文件
擴展類加載器 $JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包
應用加載器 classpath裏class類

加載,查找並加載類的二進制數據,在Java堆中也建立一個java.lang.Class類的對象
-連接(驗證(文件格式、元數據、字節碼、符號引用驗證)-準備(爲類的靜態變量分配內存,並將其初始化爲默認值)-解析(把類中的符號引用轉換爲直接引用))-初始化(爲類的靜態變量賦予正確的初始值)


手寫一下類加載Demo
public main (String args[]){
system.out.print(Test.class.getClassLoader());
}


五、知道osgi嗎? 他是如何實現的???

六、請問你作過哪些JVM優化?使用什麼方法達到什麼效果???

GC算法,標記-清除,複製,標記-整理,分代收集

七、classforName("java.lang.String")和String classgetClassLoader() LoadClass("java.lang.String") 什麼區別啊??

 

 

Spring

一、spring都有哪些機制啊AOP底層如何實現的啊IOC呢??

二、cgLib知道嗎?他和jdk動態代理什麼區別?手寫一個jdk動態代理唄?

數據庫

一、使用mysq1索引都有哪些原則? ?索引什麼數據結構? 3+tree 和B tree 什麼區別?

二、mysq1有哪些存儲引擎啊?都有啥區別? 要詳細!

三、設計高併發系統數據庫層面該怎麼設計??數據庫鎖有哪些類型?如何實現呀?

四、數據庫事務有哪些?

分庫分表

一、如何設計能夠動態擴容縮容的分庫分表方案?

二、用過哪些分庫分表中間件,有啥優勢和缺點?講一下你瞭解的分庫分表中間件的底層實現原理?

三、我如今有一個未分庫分表的系統,之後系統需分庫分表,如何設計,讓未分庫分表的系統動態切換到分庫分表的系統上???TCC? 那若出現網絡緣由,網絡連不通怎麼辦啊???

四、分佈式事務知道嗎? 大家怎麼解決的?

五、爲何要分庫分表啊???

六、分佈式尋址方式都有哪些算法知道一致性hash嗎?手寫一下java實現代碼??你若userId取摸分片,那我要查一段連續時間裏的數據怎麼辦???

七、如何解決分庫分表主鍵問題有什麼實現方案??

分佈式緩存

支持key-value數據結構的存儲系統,nosql數據庫。 多用於緩存,單線程,事件發佈


一、redis和memcheched 什麼區別爲何單線程的redis比多線程的memched效率要高啊?

二、redis有什麼數據類型都在哪些場景下使用啊?

三、reids的主從複製是怎麼實現的redis的集羣模式是如何實現的呢redis的key是如何尋址的啊?

四、使用redis如何設計分佈式鎖?使用zk能夠嗎?如何實現啊這兩種哪一個效率更高啊??

五、知道redis的持久化嗎都有什麼缺點優勢啊? ?具體底層實現呢?

六、redis過時策略都有哪些LRU 寫一下java版本的代碼吧??

分佈式服務框架

一、說一下dubbo的實現過程註冊中心掛了能夠繼續通訊嗎??

 

二、zk原理知道嗎zk均可以幹什麼Paxos算法知道嗎?說一下原理和實現??

三、dubbo支持哪些序列化協議?hessian 說一下hessian的數據結構PB知道嗎爲啥PB效率是最高的啊??

四、知道netty嗎'netty能夠幹嗎呀NIO,BIO,AIO 都是什麼啊有什麼區別啊?

五、dubbo複製均衡策略和高可用策略都有哪些啊動態代理策略呢?

六、爲何要進行系統拆分啊拆分不用dubbo能夠嗎'dubbo和thrift什麼區別啊?

分佈式消息隊列

一、爲何使用消息隊列啊消息隊列有什麼優勢和缺點啊?

二、如何保證消息隊列的高可用啊如何保證消息不被重複消費啊

三、kafka ,activemq,rabbitmq ,rocketmq都有什麼優勢,缺點啊???

四、若是讓你寫一個消息隊列,該如何進行架構設計啊?說一下你的思路


高併發高可用架構設計

一、如何設計一個高併發高可用系統

二、如何限流?工程中怎麼作的,說一下具體實現

三、緩存如何使用的緩存使用不當會形成什麼後果?

四、如何熔斷啊?熔斷框架都有哪些?具體實現原理知道嗎?

五、如何降級如何進行系統拆分,如何數據庫拆分????

 

分佈式專題架構

通訊協議

一、說一下TCP 'IP四層?

二、http的工做流程?? ?http1.0 http1.1http2.0 具體哪些區別啊?

三、TCP三次握手,四層分手的工做流程畫一下流程圖爲何不是四次五次或者二次啊?

四、畫一下https的工做流程?具體如何實現啊?如何防止被抓包啊??

算法

一、比較簡單,我一個文件,有45億個阿拉伯數字,如何進行去重啊如何找出最大的那個數啊?

數據結構

一、二叉樹和紅黑樹等。

源碼中所用到的經典設計思想及經常使用設計模式

jdbc原理SUN提供一套訪問數據庫的規範(就是一組接口),並提供鏈接數據庫的協議標準,而後各個數據庫廠商會遵循SUN的規範提供一套訪問本身公司的數據庫服務器的API出現。SUN提供的規範命名爲JDBC,而各個廠商提供的,遵循了JDBC規範的,能夠訪問本身數據庫的API被稱之爲驅動!JDBC工做原理主要分3個步驟:一、加載數據庫驅動。二、獲取數據庫鏈接。三、發送sql語句訪問數據庫 一、加載數據驅動:使用Class.forName方法,調用這個方法會加載數據庫驅動com.mysql.jdbc.driver。 關於數據庫驅動的理解,實際上是sun公司給了一個Driver的接口,而後各個數據廠商根據本身的數據庫 來實現這個接口。當要訪問數據庫的時候,須要引入這個第三方類庫。類的加載主要分爲5個部分, 加載、驗證、準備、解析、初始化。在初始化的部分用到了DriverManager.registerDriver()方法,將 本身註冊給DriverManager的Driver接口。這個地方體現了多態。這個時候就可使用Driver了。 二、獲取數據庫鏈接DriverManager.getConnection()。這個方法主要調用driver的connect()方法 返回一個實現了Connection接口的對象。 三、而後利用Connection對象建立Statement,發送sql語句訪問數據庫。

相關文章
相關標籤/搜索