日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

大牛手把手教你!2021Java最新大厂面试真题

發(fā)布時(shí)間:2023/11/30 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大牛手把手教你!2021Java最新大厂面试真题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

眾所周知,軟件系統(tǒng)有三高:**高并發(fā)、高性能、高可用。**三者既有區(qū)別也有聯(lián)系,門門道道很多,全面討論可以大戰(zhàn)三天三夜。

高并發(fā)對(duì)于Java開發(fā)者來說都不陌生,每年天貓雙十一,秒殺大促等場(chǎng)景阿里都穩(wěn)穩(wěn)的扛住了如此大的并發(fā)量,因此說,阿里在這方面也有絕對(duì)的話語權(quán)。

可以從阿里等其他互聯(lián)網(wǎng)大廠的招聘要求上看到,有高并發(fā)開發(fā)經(jīng)驗(yàn)優(yōu)先考慮。因此,Java并發(fā)問題一直是各個(gè)大廠面試的重點(diǎn)之一。很多程序員每天忙著搬磚,平時(shí)接觸不到高并發(fā),哪天受不了跑去面試,還常常會(huì)被面試官犀利的高并發(fā)問題直接KO。

我們都知道高并發(fā)的基礎(chǔ)是并發(fā)編程,而阿里新推出的這份《新高并發(fā)寶典》層層深入,形成了一個(gè)很好的知識(shí)系統(tǒng),讓你在應(yīng)對(duì)面試官的時(shí)候完全不慌,所以今天我們就一起來學(xué)習(xí)一下阿里的高并發(fā)架構(gòu)吧。

類的生命周期

類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的整個(gè)生命周期包括:加載,驗(yàn)證,準(zhǔn)備,解析,初始化,使用,卸載這7個(gè)階段.其中其中驗(yàn)證、準(zhǔn)備、解析3個(gè)部分統(tǒng)稱為連接.

加載、驗(yàn)證、準(zhǔn)備、初始化和卸載這五個(gè)階段的順序是確定的,類型的加載過程必須按照這種順序按部就班地開始,而解析階段則不一定:它在某些情況下可以在初始化階段之后再開始,這是為了支持Java語言的運(yùn)行時(shí)綁定特性(也稱為動(dòng)態(tài)綁定或晚期綁定)

注意,這里的幾個(gè)階段是按順序開始,而不是按順序進(jìn)行或完成,因?yàn)檫@些階段通常都是互相交叉地混合進(jìn)行的,通常在一個(gè)階段執(zhí)行的過程中調(diào)用或激活另一個(gè)階段。

加載:查找并加載類的二進(jìn)制數(shù)據(jù)

在加載階段,虛擬機(jī)需要完成以下3件事情:

  • 1)通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。
  • 2)將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
  • 3)在內(nèi)存中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口。

驗(yàn)證:確保被加載的類的正確性

驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。驗(yàn)證階段大致會(huì)完成4個(gè)階段的檢驗(yàn)動(dòng)作:

  • 文件格式驗(yàn)證: 驗(yàn)證字節(jié)流是否符合Class文件格式的規(guī)范;例如: 是否以0xCAFEBABE開頭、主次版本號(hào)是否在當(dāng)前虛擬機(jī)的處理范圍之內(nèi)、常量池中的常量是否有不被支持的類型。
  • 元數(shù)據(jù)驗(yàn)證:對(duì)字節(jié)碼描述的信息進(jìn)行語義分析(注意: 對(duì)比javac編譯階段的語義分析),以保證其描述的信息符合Java語言規(guī)范的要求;例如: 這個(gè)類是否有父類,除了java.lang.Object之外。
  • 字節(jié)碼驗(yàn)證:通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的、符合邏輯的。
  • 符號(hào)引用驗(yàn)證:確保解析動(dòng)作能正確執(zhí)行。

驗(yàn)證階段是非常重要的,但不是必須的,它對(duì)程序運(yùn)行期沒有影響,如果所引用的類經(jīng)過反復(fù)驗(yàn)證,那么可以考慮采用-Xverifynone參數(shù)來關(guān)閉大部分的類驗(yàn)證措施,以縮短虛擬機(jī)類加載的時(shí)間。

準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值

準(zhǔn)備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,這些變量所使用的內(nèi)存都將在方法區(qū)中進(jìn)行分配

該階段的注意事項(xiàng):

  • 這時(shí)候進(jìn)行內(nèi)存分配的僅包括類變量(被static修飾的變量),而不包括實(shí)例變量,實(shí)例變量將會(huì)在對(duì)象實(shí)例化時(shí)隨著對(duì)象一起分配在Java堆中。
  • 這里所設(shè)置的初始值通常情況下是數(shù)據(jù)類型默認(rèn)的零值(如0、0L、null、false等),而不是被在Java代碼中被顯式地賦予的值。

比如:假設(shè)一個(gè)類變量的定義為: public static int value = 3;那么變量value在準(zhǔn)備階段過后的初始值為0,而不是3,因?yàn)檫@時(shí)候尚未開始執(zhí)行任何Java方法,而把value賦值為3的put static指令是在程序編譯后,存放于類構(gòu)造器()方法之中的,所以把value賦值為3的動(dòng)作將在初始化階段才會(huì)執(zhí)行。

  • 對(duì)基本數(shù)據(jù)類型來說,對(duì)于類變量(static)和全局變量,如果不顯式地對(duì)其賦值而直接使用,則系統(tǒng)會(huì)為其賦予默認(rèn)的零值,而對(duì)于局部變量來說,在使用前必須顯式地為其賦值,否則編譯時(shí)不通過。

  • 對(duì)于同時(shí)被static和final修飾的常量,必須在聲明的時(shí)候就為其顯式地賦值,否則編譯時(shí)不通過;而只被final修飾的常量則既可以在聲明時(shí)顯式地為其賦值,也可以在類初始化時(shí)顯式地為其賦值,總之,在使用前必須為其顯式地賦值,系統(tǒng)不會(huì)為其賦予默認(rèn)零值。

  • 對(duì)于引用數(shù)據(jù)類型reference來說,如數(shù)組引用、對(duì)象引用等,如果沒有對(duì)其進(jìn)行顯式地賦值而直接使用,系統(tǒng)都會(huì)為其賦予默認(rèn)的零值,即null。

  • 如果在數(shù)組初始化時(shí)沒有對(duì)數(shù)組中的各元素賦值,那么其中的元素將根據(jù)對(duì)應(yīng)的數(shù)據(jù)類型而被賦予默認(rèn)的零值。

  • 如果類字段的字段屬性表中存在ConstantValue屬性,即同時(shí)被final和static修飾,那么在準(zhǔn)備階段變量value就會(huì)被初始化為ConstValue屬性所指定的值。假設(shè)上面的類變量value被定義為: public static final int value = 3;編譯時(shí)Javac將會(huì)為value生成ConstantValue屬性,在準(zhǔn)備階段虛擬機(jī)就會(huì)根據(jù)ConstantValue的設(shè)置將value賦值為3。我們可以理解為static final常量在編譯期就將其結(jié)果放入了調(diào)用它的類的常量池中

解析:把類中的符號(hào)引用轉(zhuǎn)換為直接引用

解析階段是虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過程,解析動(dòng)作主要針對(duì)類或接口、字段、類方法、接口方法、方法類型、方法句柄和調(diào)用點(diǎn)限定符7類符號(hào)引用進(jìn)行。符號(hào)引用就是一組符號(hào)來描述目標(biāo),可以是任何字面量。

直接引用就是直接指向目標(biāo)的指針、相對(duì)偏移量或一個(gè)間接定位到目標(biāo)的句柄。

初始化:對(duì)類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作

初始化,為類的靜態(tài)變量賦予正確的初始值,JVM負(fù)責(zé)對(duì)類進(jìn)行初始化,主要對(duì)類變量進(jìn)行初始化。在Java中對(duì)類變量進(jìn)行初始值設(shè)定有兩種方式:

  • 聲明類變量是指定初始值
  • 使用靜態(tài)代碼塊為類變量指定初始值

類初始化的步驟

  • 假如這個(gè)類還沒有被加載和連接,則程序先加載并連接該類
  • 假如該類的直接父類還沒有被初始化,則先初始化其直接父類
  • 假如類中有初始化語句,則系統(tǒng)依次執(zhí)行這些初始化語句

觸發(fā)類初始化的時(shí)機(jī)

只有當(dāng)對(duì)類的主動(dòng)使用的時(shí)候才會(huì)導(dǎo)致類的初始化,類的主動(dòng)使用包括以下六種:

  • 使用new關(guān)鍵字實(shí)例化對(duì)象的時(shí)候。

  • 讀取或設(shè)置一個(gè)類型的靜態(tài)字段(被final修飾、已在編譯期把結(jié)果放入常量池的靜態(tài)字段除外)的時(shí)候。

  • 調(diào)用一個(gè)類型的靜態(tài)方法的時(shí)候。

  • 使用java.lang.reflect包的方法對(duì)類型進(jìn)行反射調(diào)用的時(shí)候,如果類型沒有進(jìn)行過初始化,則需要先觸發(fā)其初始化。

  • 當(dāng)初始化類的時(shí)候,如果發(fā)現(xiàn)其父類還沒有進(jìn)行過初始化,則需要先觸發(fā)其父類的初始化。

  • 當(dāng)虛擬機(jī)啟動(dòng)時(shí),用戶需要指定一個(gè)要執(zhí)行的主類(包含main()方法的那個(gè)類),虛擬機(jī)會(huì)先初始化這個(gè)主類。

以下幾種情況不會(huì)執(zhí)行類初始化

  • 通過子類引用父類的靜態(tài)字段,只會(huì)觸發(fā)父類的初始化,而不會(huì)觸發(fā)子類的初始化。

  • 定義對(duì)象數(shù)組,不會(huì)觸發(fā)該類的初始化。

  • 常量在編譯期間會(huì)存入調(diào)用類的常量池中,本質(zhì)上并沒有直接引用定義常量的類,不會(huì)觸 發(fā)定義常量所在的類。

  • 通過類名獲取 Class 對(duì)象,不會(huì)觸發(fā)類的初始化。

  • 通過 Class.forName 加載指定類時(shí),如果指定參數(shù) initialize 為 false 時(shí),也不會(huì)觸發(fā)類初 始化,其實(shí)這個(gè)參數(shù)是告訴虛擬機(jī),是否要對(duì)類進(jìn)行初始化。

  • 通過 ClassLoader 默認(rèn)的 loadClass 方法,也不會(huì)觸發(fā)初始化動(dòng)作。

  • 使用

    類訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口, 對(duì)象是Heap區(qū)的數(shù)據(jù)。

    卸載

    Java虛擬機(jī)將結(jié)束生命周期的幾種情況

    • 執(zhí)行了System.exit()方法
    • 程序正常執(zhí)行結(jié)束
    • 程序在執(zhí)行過程中遇到了異常或錯(cuò)誤而異常終止
    • 由于操作系統(tǒng)出現(xiàn)錯(cuò)誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止

    類加載器

    什么是類加載器

    虛擬機(jī)設(shè)計(jì)團(tuán)隊(duì)把類加載階段中的“通過一個(gè)類的全限定名來獲取描述此類的二進(jìn)制字節(jié)流”這個(gè)動(dòng)作放到Java虛擬機(jī)外部去實(shí)現(xiàn),以便讓應(yīng)用程序自己決定如何去獲取所需要的類。 實(shí)現(xiàn)這個(gè)動(dòng)作的代碼模塊稱為“類加載器”。

    類加載器的層次

    雙親委派模型要求除了頂層的啟動(dòng)類加載器外,其余的類加載器都應(yīng)有自己的父類加載器。不過這里類加載器之間的父子關(guān)系一般不是以繼承(Inheritance)的關(guān)系來實(shí)現(xiàn)的,而是通常使用組合(Composition)關(guān)系來復(fù)用父加載器的代碼。

    從Java虛擬機(jī)的角度來講,只存在兩種不同的類加載器:一種是啟動(dòng)類加載器(Bootstrap ClassLoader),這個(gè)類加載器使用C++語言實(shí)現(xiàn),是虛擬機(jī)自身的一部分;另一種就是所有其他的類加載器,這些類加載器都由Java語言實(shí)現(xiàn),獨(dú)立于虛擬機(jī)外部,并且全都繼承自抽象類java.lang.ClassLoader。

    從Java開發(fā)人員的角度來看,類加載器還可以劃分得更細(xì)致一些,絕大部分Java程序都會(huì)使用到以下3種系統(tǒng)提供的類加載器:

    啟動(dòng)類加載器(Bootstrap ClassLoader)

    這個(gè)類將器負(fù)責(zé)將存放在<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數(shù)所指定的路徑中的,并且是虛擬機(jī)識(shí)別的(按照文件名識(shí)別,如rt.jar、tools.jar,名字不符合的類庫即使放在lib目錄中也不會(huì)被加載)類庫加載到虛擬機(jī)內(nèi)存中。

    擴(kuò)展類加載器(Extension ClassLoader)

    這個(gè)加載器由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn),它負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫,開發(fā)者可以直接使用擴(kuò)展類加載器。

    應(yīng)用程序類加載器(Application ClassLoader)

    這個(gè)類加載器由sun.misc.Launcher$AppClassLoader來實(shí)現(xiàn)。由于應(yīng)用程序類加載器是ClassLoader類中的getSystem-ClassLoader()方法的返回值,所以有些場(chǎng)合中也稱它為“系統(tǒng)類加載器”。

    它負(fù)責(zé)加載用戶類路徑(ClassPath)上所有的類庫,開發(fā)者同樣可以直接在代碼中使用這個(gè)類加載器。如果應(yīng)用程序中沒有自定義過自己的類加載器,一般情況下這個(gè)就是程序中默認(rèn)的類加載器。

    我們的應(yīng)用程序都是由這3種類加載器互相配合進(jìn)行加載的,如果有必要,還可以加入自己定義的類加載器。

    最后

    為什么我不完全主張自學(xué)?
    平臺(tái)上的大牛基本上都有很多年的工作經(jīng)驗(yàn)了,你有沒有想過之前行業(yè)的門檻是什么樣的,現(xiàn)在行業(yè)門檻是什么樣的?以前企業(yè)對(duì)于程序員能力要求沒有這么高,甚至十多年前你只要會(huì)寫個(gè)“Hello World”,你都可以入門這個(gè)行業(yè),所以以前要入門是完全可以入門的。
    ②現(xiàn)在也有一些優(yōu)秀的年輕大牛,他們或許也是自學(xué)成才,但是他們一定是具備優(yōu)秀的學(xué)習(xí)能力,優(yōu)秀的自我管理能力(時(shí)間管理,靜心堅(jiān)持等方面)以及善于發(fā)現(xiàn)問題并總結(jié)問題。
    如果說你認(rèn)為你的目標(biāo)十分明確,能做到第②點(diǎn)所說的幾個(gè)點(diǎn),以目前的市場(chǎng)來看,你才真正的適合去自學(xué)。

    除此之外,對(duì)于絕大部分人來說,報(bào)班一定是最好的一種快速成長的方式。但是有個(gè)問題,現(xiàn)在市場(chǎng)上的培訓(xùn)機(jī)構(gòu)質(zhì)量參差不齊,如果你沒有找準(zhǔn)一個(gè)好的培訓(xùn)班,完全是浪費(fèi)精力,時(shí)間以及金錢,這個(gè)需要自己去甄別選擇。

    我個(gè)人建議線上比線下的性價(jià)比更高,線下培訓(xùn)價(jià)格基本上沒2W是下不來的,線上教育現(xiàn)在比較成熟了,此次疫情期間,學(xué)生基本上都感受過線上的學(xué)習(xí)模式。相比線下而言,線上的優(yōu)勢(shì)以我的了解主要是以下幾個(gè)方面:
    ①價(jià)格:線上的價(jià)格基本上是線下的一半;
    ②老師:相對(duì)而言線上教育的師資力量比線下更強(qiáng)大也更加豐富,資源更好協(xié)調(diào);
    ③時(shí)間:學(xué)習(xí)時(shí)間相對(duì)而言更自由,不用裸辭學(xué)習(xí),適合邊學(xué)邊工作,降低生活壓力;
    ④課程:從課程內(nèi)容來說,確實(shí)要比線下講的更加深入。

    應(yīng)該學(xué)哪些技術(shù)才能達(dá)到企業(yè)的要求?(下圖總結(jié))

    Java全套資料免費(fèi)領(lǐng)取方式:戳這里

    應(yīng)該學(xué)哪些技術(shù)才能達(dá)到企業(yè)的要求?(下圖總結(jié))*

    Java全套資料免費(fèi)領(lǐng)取方式:戳這里

    [外鏈圖片轉(zhuǎn)存中…(img-x2tOn3d1-1624444120528)]

    [外鏈圖片轉(zhuǎn)存中…(img-Avamedja-1624444120529)]

    總結(jié)

    以上是生活随笔為你收集整理的大牛手把手教你!2021Java最新大厂面试真题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。