面試題彙總(1)

1. jdk1.7到jdk1.8 Map發生了什麼變化(底層)?

1.8之後hashMap的數據結構發生了變化,從之前的單純的數組+鏈表結構變成數組+鏈表+紅黑樹。也就是說在JVM存儲hashMap的K-V時僅僅通過key來決定每一個entry的存儲槽位(Node[]中的index)。並且Value以鏈表的形式掛在到對應槽位上(1.8以後如果value長度大於8則轉爲紅黑樹)。
但是hashmap1.7跟1.8 中都沒有任何同步操作,容易出現併發問題,甚至出現死循環導致系統不可用。解決方案是jdk的ConcurrentHashMap,位於java.util.concurrent下,專門解決併發問題。

2. ConcurrentHashMap

思路與hashMap差不多,但是支持併發操作,要複雜很多

3. 並行跟併發有什麼區別?

併發:指應用交替執行不同的任務,多線程原理
並行:指應用同時執行不用的任務
區別:一個是交替執行,一個是同時執行。

4. jdk1.7到jdk1.8 java虛擬機發生了什麼變化?

JVM中內存份爲堆、棧內存,及方法區。
棧內存主要用途:執行線程方法,存放本地臨時變量與線程方法執行是需要的引用對象的地址。
堆內存主要用途:JVM中所有對象信息都存放在堆內存中,相比棧內存,堆內存大很多所以JVM一直通過對堆內存劃分不同功能區塊實現對堆內存中對象管理。
堆內存不夠常見錯誤:OutOfMemoryError
棧內存溢出常見錯誤:StackOverFlowError
在JDK7以及其前期的JDK版本中,堆內存通常被分爲三塊區域Nursery內存(young generation)、長時內存(old generation)、永久內存(Permanent Generation for VM Matedata),顯示如下圖:
在這裏插入圖片描述

在最上面一層是Nursery內存,一個對象被創建以後首先被房到Nuersery中的Eden內存中,如果存活週期超過兩個Survivor(生存週期)之後會被轉移到Old Generation中。
永久內存中存放對象的方法、變量等元數據信息。永久內存不夠就會出現 以下錯誤:java.lang.OutOfMemoryError:PermGen
但是在JDK1.8中一般都不會得到這個錯誤,原因在於:1.8中把存放元數據的永久內存從堆內存中已到了本地內存(native Memory)中,1.8中JVM內存結構變成了如下圖:
在這裏插入圖片描述

這樣永久內存就不佔用堆內存,可以通過自增長來避免永久內存錯誤。
-XX:MaxMetaspaceSize=128m 這隻最大的遠內存空間128兆
JDK1.8移除PermGen,取而代之的是MetaSpace源空間
MetaSpace 垃圾回收:對僵死的類及類加載器的垃圾回收機制昂在元數據使用達到「MaxMetaSpaceSize」參數的設定值時運行。
MetaSpace 監控:元空間的使用情況可以在HotSpot1.8的詳細GC日誌輸出中得到。

更新JDK1.8的原因:
1.字符串存在永久代當中,容易出現性能問題和內存溢出
2.類及方法的信息比較難確定其大小,因此對永久代的大小制定比較困難,太小容易出現永久代溢出,太大則容易導致老年代溢出。
3.永久代會爲GC帶來不必要的複雜度,並且回收效率偏低
4.Oracle可能會想HotSpot 與 JRockit 合併。

5. 如果叫你自己設計一箇中間件,你會如何設計? 我會從以下幾點方面考慮開發:

  1. 遠程過程調用
  2. 面向消息:利用搞笑的消息傳遞機制進行平臺無關的數據交流,並給予數據通信來進行分佈式系統的集成,有一下三個特點:
    i) 通訊程序可以在不同的時間運行
    ii) 通訊晨旭之家可以一對一、一對多、多對一甚至是上述多種方式的混合
    iii) 程序將消息放入消息隊列會從小吸毒列中取出消息來進行通訊
  3. 對象請求代理:提供不同形式的通訊服務包括同步、排隊、訂閱發佈、廣播等。可構築各種框架如:事物處理監控器、分佈數據訪問、對象事務管理器OTM等。
  4. 事物處理監控有一下功能:
    a) 進程管理,包括啓動server進程、分配任務、監控其執行並對負載進行平衡
    b) 事務管理,保證在其監控下的事務處理的原子性、一致性、獨立性和持久性
    c) 通訊管理,爲client和server之間提供多種通訊機制,包括請求響應、會話、排隊、訂閱發佈和廣播等

6. 什麼是中間件?

中間件是處於操作系統和應用程序之間軟件,使用時旺旺是一組中間件集成在一起,構成一個平臺(開發平臺+運行平臺),在這組中間件中必須要有一個通信中間件,即中間件=平臺+通信。該定義也限定了只有勇於分佈式系統中才能稱爲中間件
主要分類:遠程過程調用、面向消息的中間件、對象請求代理、事物處理監控。

7. ThreadLock用過沒有,說說它的作用?

ThreadLock爲本地線程,爲每一個線程提供一個局部變量,也就是說只有當前線層可以訪問,是線程安全的。原理:爲每一個線程分配一個對象來工作,並不是由ThreadLock來完成的,而是需要在應用層面保證的,ThreadLock只是起到了一個容器的作用。原理爲ThreadLock的set()跟get()方法。
實現原理:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}

8. dubbox和spring cloud區別?

9. dubbox的源碼看過沒,dubbox有哪些組件,介紹下?

10. Hashcode()和equals()和==區別?

(1) hashcode()方法跟equals()在java中都是判斷兩個對象是否相等
(2) 兩個對象相同,則hashcode至一定要相同,即對象相同 ---->成員變量相同 ---->hashcode值一定相同
(3) 兩個對象的hashcode值相同,對象不一定相等。總結:equals相等則hashcode一定相等,hashcode相等,equals不一定相等。
(4) ==比較的是兩個引用在內存中指向的是不是同一對象(即同一內存空間)

11. mysql數據庫中,什麼情況下設置了索引但無法使用?

(1) 索引的作用:在數據庫表中對字段建立索引可以大大提高查詢速度。
(2) Mysql索引類型:
a) 普通索引
b) 唯一索引:唯一索引列的值必須唯一允許有空值,如果是組合索引,則列值的組合必須唯一:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
– 修改表結構
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
– 創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
c) 主鍵索引:一種特殊的唯一索引,不允許有空值,一般在創建表的時候創建主鍵索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
d) 組合索引:CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
爲了進一步榨取MySQL的效率,就要考慮建立組合索引。就是 將 name, city, age建到一個索引裏:代碼如下:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);
(3) 什麼情況下有索引,但用不上?
a) 如果條件中有OR,即使其中有部分條件帶索引也不會使用。注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。
b) 對於多了索引,不是使用的第一部分,則不會使用索引。
c) Like查詢以%開頭,不使用索引
d) 存在索引列的數據類型隱形轉換,則用不上索引,比如列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
e) Where 子句裏對索引列上有數學運算,用不上索引
f) Where 子句中對索引列使用函數,用不上索引
g) Mysql估計使用全表掃描要比用索引快,不使用索引
(4) 什麼情況下不推薦使用索引?
a) 數據唯一性差的字段不要使用索引
b) 頻繁更新的字段不要使用索引
c) 字段不在where語句中出現時不要添加索引,如果where後含IS NULL/IS NOT NULL/LIKE ‘%輸入符%’等條件,不要使用索引
d) Where子句裏對索引使用不等於(<>),不建議使用索引,效果一般

12. mysql優化會不會,mycat分庫,垂直分庫,水平分庫?

(1) 爲查詢緩存優化你的查詢
(2) EXPLAIN select查詢:explain 的查詢結果會告訴你索引主鍵是如何被利用的
(3) 只需要一行數據時使用limit1
(4) 爲搜索字段添加索引
(5) 在關聯表的時候使用相當類型的例,並將其索引
(6) 千萬不要ORDER BY RAND()
(7) 避免select*
(8) 永遠爲每張表設置一個ID
(9) 使用ENUM而不是VARCHAR
(10) 從PROCEDURE ANALYS()提取建議
(11) 儘可能的使用NOT NULL
(12) Java中使用Prepared Statements
(13) 無緩衝的查詢
(14) 把IP地址存成UNSIGNED INT
(15) 固定表的長度
(16) 垂直分庫:「垂直分割」是一種把數據庫中的表按列變成幾張表的方法,這樣可以降低表的複雜度和字段的數目,從而達到優化的目的。
(17) 水平分庫:「水平分割」是一種把數據庫中的表按行變成幾張表的方法,這樣可以降低表的複雜度和字段的數目,從而達到優化的目的。
(18) 越小的列會越快
(19) 選擇正確的存儲引擎
(20) 使用一個對象關係映射器
(21) 小心永久鏈接
(22) 拆分大的DELETE活INSERT語句

13. 分佈式事務解決方案?

(1) 什麼是分佈式事務?
a. 什麼情況下需要用到分佈式事務?
a) 當本地數據庫斷電、機器宕機、網絡異常、消息丟失、消息亂序、數據錯誤、不可靠TCP、存儲數據丟失、其他異常等需要用到分佈式事務。
b) 例如:當本地事務數據庫斷電的這種秦光,如何保證數據一致性?數據庫由連個文件組成的,一個數據庫文件和一個日誌文件,數據庫任何寫入操作都要先寫日誌,在操作前會吧日誌文件寫入磁盤,那麼斷電的時候及時才做沒有完成,在重啓數據庫的時候,數據庫會根據當前數據情況進行undo回滾活redo前滾,保證了數據的強一致性。
c) 分佈式理論:當單個數據庫性能產生瓶頸的時候,可能會對數據庫進行分區(物理分區),分區之後不同的數據庫不同的服務器上 ,此時單個數據庫的ACID不適應這種清苦啊,在此集羣環境下很難達到集羣的ACID,甚至效率性能大幅度下降,重要的是再很難擴展新的分區了。此時就需要引用一個新的理論來使用這種集羣情況:CAP定理
d) CAP定理:由加州肚餓伯克利分銷Eric Brewer教授提出,指出WEB服務無法同時滿足3個屬性:
a. 一致性:客戶端知道一系列的操作都會同時發生(生效)
b. 可用性:每個操作都必須以可預期的響應結束
c. 分區容錯性:及時出現單組件無法可用,操作依然可以完成。
具體的將在分佈式系統中,在任何數據庫設計中,一個WEB應
至多隻能同時支持上面兩個屬性。設計人員必須在一致性和可用
性之間做出選擇。
e) BASE理論:分佈式系統中追求的是可用性,比一致性更加重要,BASE理論來實現高可用性。核心思想是:我們無法做到羥乙酯,單每個應用都可以根據自身的業務特點,採用適當的方式使系統達到最終一致性。
f) 數據庫事務特性:ACID
i. 原子性
ii. 一致性
iii. 獨立性或隔離性
iv. 持久性
(2) 分佈式系統中,實現分佈式事務的解決方案:
a. 兩階段提交2PC
b. 補償事務TCC
c. 本地消息表(異步確保)
d. MQ事務消息
e. Sagas事務模型
(3)

14. sql語句優化會不會,說出你知道的?

(1) 避免在列上做運算,可能會導致索引失敗
(2) 使用join時應該小結果集驅動大結果集,同時把複雜的join查詢拆分成多個query,不然join越多表,會導致越多的鎖定和堵塞。
(3) 注意like模糊查詢的使用,避免使用%%
(4) 不要使用select * 節省內存
(5) 使用批量插入語句,節省交互
(6) Limit基數比較大時,使用between and
(7) 不要使用rand函數隨機獲取記錄
(8) 避免使用null,建表時,儘量設置not nul,提高查詢性能
(9) 不要使用count(id),應該使用count(*)
(10) 不要做無謂的排序,儘可能在索引中完成排序
(11) From語句中一定不要使用子查詢
(12) 使用更多的where加以限制,縮小查找範圍
(13) 合理運用索引
(14) 使用explain查看sql性能

15. mysql的存儲引擎瞭解過沒有?

(1) MySQL存儲引擎種類:
在這裏插入圖片描述

(4) 事務處理:在整個流程中出現任何問題,都能讓數據回滾到最開始的狀態,這種處理方式稱之爲事務處理。也就是說事務處理要麼都成功,要麼的失敗。

16. 紅黑樹原理?

(1) 紅黑樹的性質:紅黑樹是一個二叉搜索樹。在每個節點增加了一個存儲位記錄節點的顏色,可以是RED,也可以是BLACK,通過任意一條從根到葉子簡單路徑上顏色的約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,加以平衡。性質如下: i. 每個節點顏色不是黑色就是紅色 ii. 根節點的顏色是黑色的 iii. 如果一個節點是紅色,那麼他的兩個子節點就是黑色的,沒有持續的紅節點 iv. 對於每個節點,從該節點到其後代葉節點的簡單路徑上,均包含相同數目的黑色節點。