1.hashmap,hashmap擴容是需要重新哈希嗎?如果二次哈希後還是哈希衝突呢?
2.integer和int的自動裝箱和拆箱以及爲什麼要用integer類
1.答案:https://www.cnblogs.com/aishangtaxuefeihong/p/4886997.html
2.答案:
如果返回字段值爲null,int類型會報錯,Integer不會報錯。因爲int類型聲明的是變量,而null是對象所以會報錯。Integer是包裝類,包裝類符合對象的特徵並提供了一些必要的屬性和方法。
int類型的默認值爲0,Integer類型的默認值爲null。
詳解:https://blog.csdn.net/myme95/article/details/81703216
3.Java的線程都有哪幾種狀態
java線程狀態在Thread中定義,源碼中能看到有個枚舉State,總共定義了六種狀態:
NEW: 新建狀態,線程對象已經創建,但尚未啓動
RUNNABLE:就緒狀態,可運行狀態,調用了線程的start方法,已經在java虛擬機中執行,等待獲取操作系統資源如CPU,操作系統調度運行。
BLOCKED:堵塞狀態。線程等待鎖的狀態,等待獲取鎖進入同步塊/方法或調用wait後重新進入需要競爭鎖
WAITING:等待狀態。等待另一個線程以執行特定的操作。調用以下方法進入等待狀態。 Object.wait(), Thread.join(),LockSupport.park
TIMED_WAITING: 線程等待一段時間。調用帶參數的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil
TERMINATED:進程結束狀態。
狀態之間的轉換狀態圖,總結了下,如下:
其中,Thread.sleep(long)使線程暫停一段時間,進入TIMED_WAITING時間,並不會釋放鎖,在設定時間到或被interrupt後拋出InterruptedException後進入RUNNABLE狀態; Thread.join是等待調用join方法的線程執行一段時間(join(long))或結束後再往後執行,被interrupt後也會拋出異常,join內部也是wait方式實現的。
wait方法是object的方法,線程釋放鎖,進入WAITING或TIMED_WAITING狀態。等待時間到了或被notify/notifyall喚醒後,回去競爭鎖,如果獲得鎖,進入RUNNABLE,否則進步BLOCKED狀態等待獲取鎖。
下面是一個小例子,主線程中調用多線程,等待超時後如果子線程還未結束,則中斷子線程(interrupt)。
4.Java堆中有哪些GC算法
最全的:https://blog.csdn.net/xinlingchengbao/article/details/88369528
5.Java有哪些引用類型,分別是什麼特點
答案:https://blog.csdn.net/qq_19704045/article/details/80646437
6.JMM模型,內存可見性介紹下
答案:https://blog.csdn.net/bryce123phy/article/details/52260168
7.JVM內存模型分爲哪幾個區域
CSDN:https://blog.csdn.net/qq_24499615/article/details/80012470
博客園:https://www.cnblogs.com/mengchunchen/p/7819370.html
8.static final修飾的一個int 進行修改後是否需要進行重新編譯
博客園:https://www.cnblogs.com/AceIsSunshineRain/p/5058279.html
CSDN:https://blog.csdn.net/stormwy/article/details/8435136
9.synchronized和volatile區別
1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;
synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。
2.volatile僅能使用在變量級別;
synchronized則可以使用在變量、方法、和類級別的
3.volatile僅能實現變量的修改可見性,不能保證原子性;
而synchronized則可以保證變量的修改可見性和原子性
4.volatile不會造成線程的阻塞;
synchronized可能會造成線程的阻塞。
5.volatile標記的變量不會被編譯器優化;
synchronized標記的變量可以被編譯器優化
詳解:https://blog.csdn.net/suchahaerkang/article/details/80456085
10.wait()和sleep()有什麼區別
1、每個對象都有一個鎖來控制同步訪問,Synchronized關鍵字可以和對象的鎖交互,來實現同步方法或同步塊。sleep()方法正在執行的線程主動讓出CPU(然後CPU就可以去執行其他任務),在sleep指定時間後CPU再回到該線程繼續往下執行(注意:sleep方法只讓出了CPU,而並不會釋放同步資源鎖!!!)。
wait()方法則是指當前線程讓自己暫時退讓出同步資源鎖,以便其他正在等待該資源的線程得到該資源進而運行,只有調用了notify()方法,之前調用wait()的線程纔會解除wait狀態,可以去參與競爭同步資源鎖,進而得到執行。(注意:notify的作用相當於叫醒睡着的人,而並不會給他分配任務,就是說notify只是讓之前調用wait的線程有權利重新參與線程的調度);
2、sleep()方法可以在任何地方使用;wait()方法則只能在同步方法或同步塊中使用;
3、sleep()是線程線程類(Thread)的方法,調用會暫停此線程指定的時間,但監控依然保持,不會釋放對象鎖,到時間自動恢復;wait()是Object的方法,調用會放棄對象鎖,進入等待隊列,待調用notify()/notifyAll()喚醒指定的線程或者所有線程,纔會進入鎖池,不再次獲得對象鎖纔會進入運行狀態;
詳解:https://blog.csdn.net/weixin_39843989/article/details/90294825
11.併發中的方法
處理高併發的六種方法
1:系統拆分,將一個系統拆分爲多個子系統,用dubbo來搞。然後每個系統連一個數據庫,這樣本來就一個庫,現在多個數據庫,這樣就可以抗高併發。
2:緩存,必須得用緩存。大部分的高併發場景,都是讀多寫少,那你完全可以在數據庫和緩存裏都寫一份,然後讀的時候大量走緩存不就得了。畢竟人家redis輕輕鬆鬆單機幾萬的併發啊。沒問題的。所以你可以考的慮考慮你的項目裏,那些承載主要請求讀場景,怎麼用緩存來抗高併發。
3:MQ(消息隊列),必須得用MQ。可能你還是會出現高併發寫的場景,比如說一個業務操作裏要頻繁搞數據庫幾十次,增刪改增刪改,瘋了。那高併發絕對搞掛你的系統,人家是緩存你要是用redis來承載寫那肯定不行,數據隨時就被LRU(淘汰掉最不經常使用的)了,數據格式還無比簡單,沒有事務支持。所以該用mysql還得用mysql啊。那你咋辦?用MQ吧,大量的寫請求灌入MQ裏,排隊慢慢玩兒,後邊系統消費後慢慢寫,控制在mysql承載範圍之內。所以你得考慮考慮你的項目裏,那些承載複雜寫業務邏輯的場景裏,如何用MQ來異步寫,提升併發性。MQ單機抗幾萬併發也是ok的。
4:分庫分表,可能到了最後數據庫層面還是免不了抗高併發的要求,好吧,那麼就將一個數據庫拆分爲多個庫,多個庫來抗更高的併發;然後將一個表拆分爲多個表,每個表的數據量保持少一點,提高sql跑的性能。
5:讀寫分離,這個就是說大部分時候數據庫可能也是讀多寫少,沒必要所有請求都集中在一個庫上吧,可以搞個主從架構,主庫寫入,從庫讀取,搞一個讀寫分離。讀流量太多的時候,還可以加更多的從庫。
6:solrCloud:
SolrCloud(solr 雲)是Solr提供的分佈式搜索方案,可以解決海量數據的 分佈式全文檢索,因爲搭建了集羣,因此具備高可用的特性,同時對數據進行主從備份,避免了單點故障問題。可以做到數據的快速恢復。並且可以動態的添加新的節點,再對數據進行平衡,可以做到負載均衡:
12.抽象類和接口的區別,什麼時候用抽象類什麼時候用接口
CSDN:https://blog.csdn.net/wb_snail/article/details/78862533
簡書:https://www.jianshu.com/p/914e8e1a320a
博客園:https://www.cnblogs.com/qf-dd/p/10109916.html
13.問題:反轉鏈表按k,最長重複子串
答案;面向對象和麪向過程、jvm垃圾回收
14.介紹2個設計模式
答案:https://www.cnblogs.com/aspirant/p/8979340.html
15.Java堆中有哪些GC算法
答案:https://blog.csdn.net/samniwu/article/details/90613989
16.內存泄漏是什麼,怎麼檢測
CSDN:https://blog.csdn.net/xiaodu655/article/details/81153020
簡書:https://www.jianshu.com/p/fd741fb87dc5
17.什麼是線程池
CSDN:https://blog.csdn.net/weixin_40271838/article/details/79998327
博客園:https://www.cnblogs.com/victorwux/p/9004564.html
18.算法題
1.給一個鏈表1->2->3->4->5->6->7 和 一個數字n;每n個反轉一次鏈表。
如 n = 2時,2->1->4->3->6->5->7;n = 3時,3->2->1>6->5->4->7
public class NodeReverse {
public static void main(String[] args) {
int a[] = { 1, 2, 3, 4, 5, 6, 7 };
Node root = new Node(a[0]);
Node head = root;
for (int i = 1; i < a.length; i++) {
Node node = new Node(a[i]);
head.next = node;
head = node;
}
root = reverseAdjacentNode(root);
System.out.print("相鄰元素翻轉後:");
while (root != null) {
System.out.print(root.data);
root = root.next;
if(root != null) {
System.out.print("->");
}
}
}
private static Node reverseAdjacentNode(Node root) {
Node head = root;
Node p, q = null;
if (root.next != null) {
root = root.next; //根結點爲第二個結點
} else {
return root;
}
int flag = 0; //判斷P是否爲第一個結點
p = head;
q = head.next;
while(p!= null) {
if(flag == 0) { //p爲第一個結點
p.next = q.next;
q.next = p;
flag = 1;
} else {
if(p.next == null) {
break;
}
head.next = q;
p.next = q.next;
q.next = p;
}
head = p; //保留下一個p前面的結點
p = p.next;
q = p.next;
}
return root;
}
}
class Node {
public int data;
public Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
</span>
2.羅馬數字轉整數 leetcode13
詳解:https://www.cnblogs.com/ariel-dreamland/p/9128055.html
19.算法題: 反轉鏈表,刪除排好序數組中重複元素,第一題秒了,第二題用兩根指針卡了可能1分鐘在左指針的移動上。
參考:https://blog.csdn.net/SoulOH/article/details/81630807
20.推薦系統,考慮過分佈式系統嘛,QPS怎麼測試出來
參考:https://blog.csdn.net/silyvin/article/details/79143761
21.消費者生產者,寫寫僞代碼
答案:https://blog.csdn.net/yongf2014/article/details/46493129
22.寫一個list刪除目標元素的函數,然後寫個測試用例測試一下能不能通,爲什麼不能正向遍歷
參考:https://blog.csdn.net/qinaye/article/details/81875199