被虐的有點慘的有贊Java面試解析

2022-01-28 zhisheng

之前自己寫了點面經,裡面只有題目,沒有答案,結果一個朋友說要針對這些題目做個解答,沒想過過了這麼久,終於看到發了出來了,於是就轉過來了,大家看看吧,雖說不一定就一定面試遇得到同樣的問題。

我的有贊面經,如果對面經感興趣,可以在公眾號裡面回復"面經"即可以看到更多我以前寫的。昨天的一面面試解析:Java 面試解析(有贊一面)

以下是朋友的文章,請閱讀。

本文的題目出自博客
http://www.54tianzhisheng.cn/2018/07/12/youzan/
但是作者沒有給出答案,博主鬥膽來製作答案版。

引言

說在前面的話:
本文適合人群:急等著換工作的人
我承認刷面試題很有用的,縱觀幾年來的JAVA面試題,你會發現每家都差不多。比如,你仔細觀察,你會發現,HashMap的出現機率未免也太高了吧!連考察的知識點都一樣,什麼hash碰撞啊,並發問題啊!再比如JVM,無外乎考內存結構,GC算法等!因此,如果是為了面試,完全是有套路可以準備的!記住,基礎再好,也架不住面試官天馬行空的問,所以刷面試題還是很有必要的!

本文不適合人群:專攻JAVA某方面技術的人
因為這類人專攻JAVA某塊技術,知識容易出現死角。貿然閱讀本文,發現自己一堆題目都不會,會覺得有一種挫敗感,發現自己連校招生都不如。然而,會點面試題不算什麼,畢竟Homebrew作者也出現過解不出面試題,被Google拒絕,緣由就是,因為他不會翻轉二叉樹。難道你能說Homebrew的作者水平有問題!

正文

1、HashMap,源碼級別的問了,包括為什麼線程不安全
評註:這問題一面的時候問過了,嗯,說明大家以後面試,不管是幾面,複習過的知識點還是要複習,畢竟一面的面試官只會告訴二面的面試官印象,不會具體聊問了啥問題!比如,我和二面面試官說,這個候選人基礎還不錯,那二面面試官就會覺得:"咦,這個人基礎不錯,我試試是不是真的是這樣!"所以難免會出現一樣的題目!
另外,此題不好答。因為是關於源碼級別的問,需要複習的知識點很多。大家關注一下我,我會出一篇對HashMap能問的知識點總結。比如jdk1.7和jdk1.8的hashmap結構區別、hashmap並發問題,哈希衝突的常見解決手段等!
回答: 略去。

2、死鎖
評註:這問題一面的時候問過了,嗯,凸顯!
回答: 死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去,如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。

產生死鎖的原因主要是:

因為系統資源不足。

進程運行推進的順序不合適。

資源分配不當等。

3、Synchronized 和 ReentrantLock 鎖機制,怎麼判斷重入鎖的,會不會是死鎖?
評註:並發基礎問題,懂並發編程的,應該都會。
回答:
先答區別:
API方面:synchronized既可以修飾方法,也可以修飾代碼塊。ReentrantLock只能在方法體中使用。
公平鎖:synchronized的鎖是非公平鎖,ReentrantLock默認情況下也是非公平鎖,但可以通過帶布爾值的構造函數要求使用公平鎖。
等待可中斷:假如業務代碼中有兩個線程,Thread1 Thread2。假設 Thread1 獲取了對象object的鎖,Thread2將等待Thread1釋放object的鎖。

使用synchronized。如果Thread1不釋放,Thread2將一直等待,不能被中斷。synchronized也可以說是Java提供的原子性內置鎖機制。內部鎖扮演了互斥鎖(mutual exclusion lock ,mutex)的角色,一個線程引用鎖的時候,別的線程阻塞等待。

使用ReentrantLock。如果Thread1不釋放,Thread2等待了很長時間以後,可以中斷等待,轉而去做別的事情。

至於判斷重入鎖,ReenTrantLock的字面意思就是再進入的鎖,其實synchronized關鍵字所使用的鎖也是可重入的,兩者關於這個的區別不大。兩者都是同一個線程沒進入一次,鎖的計數器都自增1,所以要等到鎖的計數器下降為0時才能釋放鎖。

4、進程和線程的區別?
評註:作業系統的題目,很常規!
回答:
進程:是執行中一段程序,即一旦程序被載入到內存中並準備執行,它就是一個進程。進程是表示資源分配的的基本概念,又是調度運行的基本單位,是系統中的並發執行的單位。

線程:單個進程中執行中每個任務就是一個線程。線程是進程中執行運算的最小單位。

一個線程只能屬於一個進程,但是一個進程可以擁有多個線程。多線程處理就是允許一個進程中在同一時刻執行多個任務。

線程是一種輕量級的進程,與進程相比,線程給作業系統帶來側創建、維護、和管理的負擔要輕,意味著線程的代價或開銷比較小。

5、進程之間如何保證同步?
評註:作業系統老題了,四種方法!
回答:上網給大家找了一張圖!

6、分布式鎖
評註:此題問的沒頭沒尾的,分布式鎖可以問的點很多,比如實現方式啊?性能差距啊?
回答:這題如果要詳答,看我的另一篇文章《分布式之抉擇分布式鎖》
分布式鎖有三種實現方式:資料庫、緩存、Zookeeper,這裡我直接羅列一下各種鎖的對比吧

從理解的難易程度角度(從低到高)
資料庫 > 緩存 > Zookeeper

從實現的複雜性角度(從低到高)
Zookeeper >= 緩存 > 資料庫

從性能角度(從高到低)
緩存 > Zookeeper >= 資料庫

從可靠性角度(從高到低)
Zookeeper > 緩存 > 資料庫

7、對象 GC
評註:一面問過,把一面的回答貼過來!
回答:
這個算法的基本思路是通過一些列稱為「GC Roots」的對象作為起始點,從這些點開始向下搜索,搜索走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明對象需要被回收.
如圖:


上圖中o3,o4對象沒有任何GC Roots可達到,所有這兩個對象不可用了,需要被GC回收
Java可作為GC Roots的對象包括下面幾種:

虛擬機棧中引用的對象

方法區中類靜態屬性引用的對象

方法區中產量引用的對象

本地方法棧中JNI引用的對象

8、垃圾回收算法
評註:一面問過,把一面的回答貼過來!
回答:
標記-清除算法、標記整理算法、複製算法、分代收集算法

9、JVM 參數
評註:這個回答還是略去吧,這個問題範圍太大,我不知道該怎麼答。
回答:略去。

10、OOM 出現的有哪些場景?為什麼會發生?
評註:常規題,只是情況太多了!
回答:
OOM for Heap (java.lang.OutOfMemoryError: Java heap space):heap的最大值不滿足需要,將設置heap的最大值調高即可。
OOM for StackOverflowError (Exception in thread "main" java.lang.StackOverflowError):如果線程請求的棧深度大於虛擬機所允許的最大深度,將拋出StackOverflowError異常。
OOM for GC (java.lang.OutOfMemoryError: GC overhead limit exceeded):此OOM是由於JVM在GC時,對象過多,導致內存溢出。
OOM for native thread created (java.lang.OutOfMemoryError: unable to create new native thread):這個異常問題本質原因是我們創建了太多的線程,而能創建的線程數是有限制的,導致了異常的發生。
OOM for allocate huge array (Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit):此類信息表明應用程式試圖分配一個大於堆大小的數組。例如,如果應用程式new一個數組對象,大小為512M,但是最大堆大小為256M,因此OutOfMemoryError會拋出,因為數組的大小超過虛擬機的限制。
OOM for small swap (Exception in thread "main": java.lang.OutOfMemoryError: request bytes for . Out of swap space? ):拋出這類錯誤,是由於從native堆中分配內存失敗,並且堆內存可能接近耗盡。
OOM for exhausted native memory (java.lang.OutOfMemoryErr java.io.FileInputStream.readBytes(Native Method)):由於Native memory被耗盡導致的。

11、JVM 內存結構說下吧
評註:常規題,學過JVM的都會!
回答:來一張圖就好了。
有5大內存區域,按照是否被線程所共享可分為兩部分,一部分是線程獨佔區域,包括Java棧,本地方法棧和程序計數器。還有一部分是被線程所共享的,包括方法區和堆。注意了,下一題就是問的是堆和棧的共享問題!
如下圖所示

12、堆和棧的共享問題?
評註:常規題,大家應該都答的上來,屬應屆生常見問題!
回答:
棧內存的一個特點是數據共享,比如你線程中執行下面兩句話

int i = 1;
int j = 1;

如下圖所示


前面定義了i=1,i和1都在棧內存內,如果再定義一個j=1,此時將j放入棧內存,然後查找棧內存中是否有1,如果有則j指向1。
堆內存沒有數據共享的特點,比如你線程中執行了下面兩句話

String s =  new  String( "Hello World" );
String w = new  String( "Hello World" );

此時如下圖所示

13、有比較過 Http 和 RPC 嗎?
評註:此題我按我的理解來答。我不確定對不對,因此我覺得http和rpc沒啥可比性,不是一個級別的概念。
回答:
只要是遠程調用都可以叫RPC,和是不是通過http沒什麼關係。
那麼,調用過程,也就是通信過程之間需要協議,可以是HTTP協議、dubbo協議等、其他協議等。

14、HttpClient 你說說裡面的具體實現吧?(涉及了哪些東西)
評註:此題只能回答一個大概,我找了一個架構圖來進行說明
回答:
如下圖所示


Httpclient將對接的伺服器或者集群(相同域名)稱為route,並為每個route建立若干連接,並池化在連接池裡。Client通過tcp/ip協議發送請求以及接受應答,在發送請求前和接收應答後都會經由interceptor進行鏈式處理,在httpclient裡這些interceptor被稱為HttpProcessor,負責處理諸如設置報文頭,報文體,編碼格式等以及解析報文頭,報文體,解碼格式等http規範報文格式範疇內的事情。

15、那要你設計一個高性能的 Http ,你會怎麼設計?
評註:此題,作者漏了最重要的主語。。。Http什麼?Http伺服器麼?HTTP接口?此題範圍太大,都可以單獨寫文章了。可以關注作者,後面寫。
回答:略去

關注我

相關焦點

  • JAVA面試解析(有贊二面)
    也是《JAVA面試解析(有贊一面)》,這篇文章的續!引言說在前面的話:本文適合人群:急等著換工作的人我承認刷面試題很有用的,縱觀幾年來的JAVA面試題,你會發現每家都差不多。比如,你仔細觀察,你會發現,HashMap的出現機率未免也太高了吧!連考察的知識點都一樣,什麼hash碰撞啊,並發問題啊!
  • JAVA面試解析(有贊一面)
    引言說在前面的話:本文適合人群:急等著換工作的人我承認刷面試題很有用的,縱觀幾年來的JAVA面試題,你會發現每家都差不多。比如,你仔細觀察,你會發現,HashMap的出現機率未免也太高了吧!連考察的知識點都一樣,什麼hash碰撞啊,並發問題啊!再比如JVM,無外乎考內存結構,GC算法等!因此,如果是為了面試,完全是有套路可以準備的!
  • 一些經典Java面試題&答案解析 || 附《Effective Java》中文版
    我們給大家準備了一些面試題,所有題目都是經過精心挑選的,很基礎又考驗求職者的基本功,應該說被面試到的機率很大。希望能對你有所幫助。1、下列代碼輸出內容是什麼?(2) 運用反射手段,調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。(3) 調用對象的clone()方法。(4) 運用反序列化手段,調用java.io.ObjectInputStream對象的 readObject()方法。
  • 一位Java後臺工程師的面試經歷
    遊趣科技面試的時候剛剛面試完亞馬遜被鄙視了,心情抑鬱而且公司產品也不太看好,所以面試的時候就沒有太有興趣,最終談offer的時候就沒麻煩HR了。 中型公司核心部門:先鋒支付,京東到家支付,美團支付 面試java支付工程師,很明顯這是該公司的核心部門,所以面試考察的東西也十分多。而且這三家公司面試類型相同,結果也都沒有給offer,相對來說更有共性。
  • 知名網際網路公司校招 Java 開發崗面試知識點解析
    接口可以多繼承;內存: Java 有自動內存管理機制,不需要程式設計師手動釋放無用內存。 5)Java 中的值傳遞和引用傳遞解析:這類題目,面試官會手寫一個例子,讓你說出函數執行結果,詳細舉例請查閱我的博客:Java 值傳遞和引用傳遞基礎分析。
  • Java面試經典題解析——談談你對Java平臺的理解?
    其實這個問題,問得有點籠統。題目本身是非常開放的,往往考察的是多個方面,比如,基礎知識理解是否很清楚;是否掌握 Java平臺主要模塊和運行原理等。我個人覺得這種籠統的問題,有時候回答得稍微片面也很正常,大多數有經驗的面試官,不會因為一道題就對面試者輕易地下結論。通常會儘量引導面試者,把他的真實水平展現出來,這種問題就是做個開場熱身,面試官經常會根據你的回答擴展相關問題。
  • 《靈劍山》小琉璃解除封印黑化,雙重人格帶感,小海要被虐慘了!
    就如近日熱播仙俠劇《從前有座靈劍山》中的琉璃仙。這個角色與其神秘的身世,就像未知的謎團等待我們逐一打開。這位琉璃仙師姐似乎就開始有些不大對勁,總感覺她的體內還有另外一個人的存在,所以看上去有點像精神分裂。有著不為人知另一面的小琉璃說黑化那就是一瞬間的事,從目前看琉璃仙有很多時候狀態不對勁。
  • 面試乾貨 | Java 能否自定義一個類叫 java.lang.System?
    博客地址:https://blog.csdn.net/m0_43452671緣起:一個面試題最近在上下班地鐵刷博客,無意刷到一個面試題,號稱很多程式設計師的烈士公墓:java 能否自己寫一個類叫 java.lang.System博主也提供了相關的答案:一般情況下是不可以的,但是可以通過特殊的處理來達到目的,這個特殊的處理就是自己寫個類加載器來加載自己寫的這個 j
  • Java面試寶典最新版!(附答案+解析)
    Tips該寶典集合了面試中遇到的問題,是程式設計師找工作面試時常見的面試題目,為廣大學生提供真實的面試體驗
  • Java經典面試題答案解析(1-80題)
    Java泛型和類型擦除這個面試題,可以看我這篇文章哈~Java程式設計師必備基礎:泛型解析13. int和Integer 有什麼區別,還有Integer緩存的實現這裡考察3個知識點吧:int 是基本數據類型,interger 是 int 的封裝類int 默認值為 0 ,而interger 默認值為 null, Interger使用需要判空處理
  • Java面試寶典2018年最新版!(附答案+解析)
    ,為廣大學子提供真實的面試體驗,學習面試技巧,讓自己在未來的面試中能得心應手。希望大家都能順利地通過面試,拿到自己心儀的offer~需要的同學趕緊收藏轉發哦!如果喜歡,請你點讚、轉發、評論、收藏,每一個回應都是對我們的鼓勵!
  • Java程式設計師面試必備:Volatile全方位解析
    前言volatile是Java程式設計師必備的基礎,也是面試官非常喜歡問的一個話題,本文跟大家一起開啟vlatile學習之旅,如果有不正確的地方,也麻煩大家指出哈,一起相互學習~1.volatile的用法 2.vlatile變量的作用 3.現代計算機的內存模型(計算機模型
  • Java面試官:String長度有限制嗎?是多少?
    是的有,而且在JVM編譯中還有規範,而且有的家人們在面試的時候也遇到了,本人就遇到過面試的時候問這個的,而且在之前開發的中也真實地遇到過這個String長度限制的場景(將某固定文件轉碼成Base64的形式用字符串存儲,在運行時需要的時候在轉回來,當時文件比較大),那這個規範限制到底是怎麼樣的,咱們話不多說先瞜瞜去。
  • Java面試的的時候你被提過哪些問題?
    同學們在踏出校園那一刻起,邊開始進入了社會,面臨著找工作、面試,那麼,當你被面試的時候,哪些Java題被面試官提問過?下面這些是常被問到的面試題,如果你覺得還有一些經常提到的,我沒有寫出來的,歡迎補充。J2SE基礎:1. 九種基本數據類型的大小,以及他們的封裝類。2. Switch能否用string做參數?3. equals與==的區別。4. Object有哪些公用方法?
  • 100多道經典的JAVA面試題及答案解析(8)
    100多道經典的JAVA面試題及答案解析(8) 本文我們將要討論Java面試中的各種不同類型的面試題,它們可以讓僱主測試應聘者的Java和通用的面向對象編程的能力。
  • GitHub爆贊!阿里P8架構師力薦的 Java源碼解析及面試合集
    前言:換工作的 Java 工程師小夥伴們有沒有被大廠的技術虐得體無完膚的經歷?那是因為你還不了解大廠的面試套路。Java 的底層實現是常被問到的,也就是 Java 源碼。如果啃不下來,很可能就與大廠失之交臂。
  • 7年.NET 面試 Java 的尷尬歷程
    這樣子LZ天真覺得使用JAVA開發也能熟能生巧(PS:沒有這樣的自我滿足也不會有後面第一次面試JAVA的尷尬)。在這樣的一度滿足之下LZ決定第一次出去面試JAVA高級開發試試水。後來經過大學好基友的提醒,把簡歷改成2年.NET開發,5年JAVA開發,才能陸續收到面試通知。面試第二坑(基礎知識、數據結構).NET招聘者眾所周知,近年來.NET面試者日益減少,優秀.NETer開發更是少之又少,尤其在各大高校取消C#這門課程之後,.NETer的招聘更是難上加難。所以在面試的時候自然而然就會降低要求,基本只要求思路清晰,上手快,能有創新和開闊性思維就更優的招聘方法來篩選求職者。
  • 給Java程式設計師的20個鍊表面試題
    如何在面試中解決鍊表編程問題?為了解決基於鍊表的問題,有必要充分了解遞歸,因為鍊表就是一個遞歸數據結構。如果從鍊表中取一個節點,剩餘數據結構仍然構成一個鍊表。也正是因此,許多鍊表問題的遞歸解決方案比迭代解決方案更加簡單。這些問題也可以用分而治之的技巧解決,將一個問題分成多個子問題,直到能完全解決它們。
  • 面試官:Java 反射是什麼?我有點懵了!
    ");Class.forName()字節碼已經加載到java虛擬機中,去得到字節碼;java虛擬機中還沒有生成字節碼 用類加載器進行加載,加載的字節碼緩衝到虛擬機中。 java.util.Stack.pop()public java.lang.Object java.util.Stack.push(java.lang.Object)public boolean java.util.Stack.empty()public synchronized java.lang.Object java.util.Stack.peek()public
  • 《上陽賦》章子怡被虐慘!楊祐寧演女主初戀,被吐槽沒有CP感
    《上陽賦》章子怡被虐慘!楊祐寧演女主初戀,被吐槽沒有CP感 文/聽歌打娛 《上陽賦》開播第一天豆瓣評分5.9,對於章子怡主演的首部電視劇來說,這個評分很低了!