2019年_BATJ大廠面試題總結-字節跳動篇

1.hashmap,hashmap擴容是需要重新哈希嗎?如果二次哈希後還是哈希衝突呢?

答案:https://blog.csdn.net/u012712901/article/details/78313130?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

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

23.虛引用有哪些應用場景

答案:Java的強引用,軟引用,弱引用,虛引用及其使用場景

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章