
31道Java核??試題,?次性打包送給你
先看再點贊,給???點思考的時間,微信搜索【沉默王?】關注這個靠才華茍且的程序員。本?GitHub已收錄,??還有?線??整
理的?試題,以及我的系列?章。
?哥,你好,找?作找了仨?,還沒有找到,很焦慮,我該怎么辦呢?你那有沒有Java??的?試題可以分享?波???
以上是讀者??給我發的私信,看完后于我?有戚戚焉啊,最近境況確實不容樂觀,并?是個?的原因造成的。那,既然需要
?試題,?哥就義不容辭,必須得準備?波。
這次我花了?周的時間,準備了31道Java核??試題,希望能夠幫助到??,以及其他和??類似情況的讀者朋友。
(后續我打算再花?周時間,更新第?波,同樣有31道,敬請期待)
01、請說出Java14版本中更新的重要功能
Java14發布于2020年3?17?,更新的重要功能有:
switch表達式
instanceo離開英語 f增強表達式,預覽功能
?本塊,第?次預覽
Records,預覽功能
剛好我之前寫過?篇?章,關于Java14的開箱體驗,很?,讀者朋友需要的話,可以點下?的鏈接看?看。
02、請說出Java13版本中更新的重要功能
Java13發布于2019年9?17?,更新的重要功能有:
?本塊,預覽功能
switch表達式,預覽功能
JavaSocket重新實現
eSystem()?法
?持Unicode12.1
可伸縮、低延遲的垃圾收集器改進,?于返回未使?的內存
03、請說出Java12版本中更新的重要功能
Java12發布于2019年3?19?,更新的重要功能有:
JVM更新
ch()?法
緊湊型數字格式
String類新增了?些?法,?如說indent()
04、請說出Java11版本中更新的重要功能
Java11是繼Java8之后的第?個商?版本,如果你下載的是OracleJDK,則需要進?付費;如果想繼續使?免費版
本,需要下載OpenJDK。
OracleJDK中會有?些OpenJDK沒有的、商?閉源的功能。
Java11更新的重要功能有:
可以直接使?java命令運?Java程序,源代碼將會隱式編譯和運?。
String類新增了?些?法,?如說isBlank()、lines()、strip()等等。
Files類新增了兩個讀寫?法,readString()和writeString()。
可以在Lambda表達式中使?var作為變量類型。
05、請說出Java10版本中更新的重要功能
Java10更新的重要功能有:
局部變量類型推斷,舉個例?,varlist=newArrayList();,可以使?var來作為變量類型,Java編譯器知道list的類型為
字符串的ArrayList。
增強。
提供了?組默認的根證書頒發機構(CA)。
06、請說出Java9版本中更新的重要功能
Java9更新的重要功能有:
模塊系統
不可變的List、Set、Map的???法
接?中可以有私有?法
垃圾收集器改進
07、請說出Java8版本中更新的重要功能
Java8發布于2014年3?份,可以說是Java6之后最重要的版本更新,深受開發者的喜愛。
函數式編程和
JavaDateTimeAPI
中可以使?默認?法和靜態?法
我強烈建議點開上?的鏈接閱讀以下,以正確理解這些概念。
08、請說出Java?向對象編程中的?些重要概念
封裝
多態
09、Java聲稱的平臺獨?性指的是什么?
常見的操作系統有Windows、Linux、OS-X,那么平臺獨?性意味著我們可以在任何操作系統中運?相同源代碼的Java程
序,?如說我們可以在Windows上編寫Java程序,然后在Linux上運?它。
10、什么是JVM?
JVM(JavaVirtualMachine)俗稱Java虛擬機。之所以稱為虛擬機,是因為它實際上并不存在。它提供了?種運?環
境,可供Java字節碼在上?運?。
JVM提供了以下操作:
加載字節碼
驗證字節碼
執?字節碼
提供運?時環境
JVM定義了以下內容:
存儲區
類?件格式
寄存器組
垃圾回收堆
致命錯誤報告等
我們來嘗試理解?下JVM的內部結構,它包含了類加載器(ClassLoader)、運?時數據區(RuntimeDataAreas)和
執?引擎(ExcutionEngine)。
1)類加載器
類加載器是JVM的?個?系統,?于加載類?件。每當我們運??個Java程序,它都會由類加載器?先加載。Java中有
三個內置的類加載器:
啟動類加載器(BootstrapClass-Loader),加載jre/lib包下?的jar?件,?如說常見的(包含了Java標
準庫下的所有類?件,?如說包下的類,包下的類,包下的類,包下的類,java.
sql包下的類)。
擴展類加載器(ExtensionorExtClass-Loader),加載jre/lib/ext包下?的jar?件。
應?類加載器(ApplicationorAppClas-Loader),根據程序的類路徑(classpath)來加載Java類。
?般來說,Java程序員并不需要直接同類加載器進?交互。JVM默認的?為就已經?夠滿??多數情況的需求了。不過,如
果遇到了需要和類加載器進?交互的情況,?對類加載器的機制?不是很了解的話,就不得不花?量的時間去調試
ClassNotFoundException和NoClassDefFoundError等異常。
對于任意?個類,都需要由它的類加載器和這個類本??同確定其在JVM中的唯?性。也就是說,如果兩個類的加載器不
同,即使兩個類來源于同?個字節碼?件,那這兩個類就必定不相等(?如兩個類的Class對象不equals)。
是不是有點暈,來來來,通過?段簡單的代碼了解下。
publicclassTest{
publicstaticvoidmain(String[]args){
ClassLoaderloader=ssLoader();
while(loader!=null){
n(ng());
loader=ent();
}
}
}
每個Java類都維護著?個指向定義它的類加載器的引?大叫英文 ,通過類名.ssLoader()可以獲取到此引?;然后通過l
ent()可以獲取類加載器的上層類加載器。
上?這段代碼的輸出結果如下:
er$AppClassLoader@18b4aac2
er$ExtClassLoader@4617c264
第??輸出為Test的類加載器,即應?類加載器,它是er$AppClassLoader類的實例;第??輸出為擴展
類加載器,是er$ExtClassLoader類的實例。那啟動類加載器呢?
按理說,擴展類加載器的上層類加載器是啟動類加載器,但在我這個版本的JDK中,擴展類加載器的getParent()返回nul
l。所以沒有輸出。
2)運?時數據區
運?時數據區?包含以下內容。
PC寄存器(PCRegister),也叫程序計數器(ProgramCounterRegister),是?塊較?的內存空間,它的作?可
以看做是當前線程所執?的字節碼的信號指?器。
JVM棧(JavaVirtualMachineStack),與PC寄存器?樣,JVM棧也是線程私有的。每?個JVM線程都有??
的JVM棧,這個棧與線程同時創建,它的?命周期與線程相同。
本地?法棧(NativeMethodStack),JVM可能會使?到傳統的棧來?持Native?法(使?Java語?以外的其它
語?[C語?]編寫的?法)的執?,這個棧就是本地?法棧。
堆(Heap),在JVM中,堆是可供各條線程共享的運?時內存區域,也是供所有類實例和數據對象分配內存的區域。
?法區(Methodarea),在JVM中,被加載類型的信息都保存在?法區中。包括類型信息(TypeInformation)和
?法列表(MethodTables)。?法區是所有線程共享的,所以訪問?法區信息的?法必須是線程安全的。
運?時常量池(RuntimeConstantPool),運?時常量池是每?個類或接?的常量池在運?時的表現形式,它包括了
編譯器可知的數值字?量,以及運?期解析后才能獲得的?法或字段的引?。簡??之,當?個?法或者變量被引?
時,JVM通過運?時常量區來查找?法或者變量在內存?的實際地址。
3)執?引擎
執?引擎包含了:
解釋器:讀取字節碼流,然后執?指令。因為它?條?條地解釋和執?指令,所以它可以很快地解釋字節碼,但是執?起
來會?較慢。
即時(Just-In-Time,JIT)編譯器:即時編譯器?來彌補解釋器的缺點,提?性能。執?引擎?先按照解釋執?的?式來
執?,然后在合適的時候,即時編譯器把整段字節碼編譯成本地代碼。然后,執?引擎就沒有必要再去解釋執??法了,
它可以直接通過本地代碼去執?。執?本地代碼??條?條進?解釋執?的速度快很多。編譯后的代碼可以執?的很快,
因為本地代碼是保存在緩存?的。
11、JDK和JVM有什么區別?
JDK是JavaDevelopmentKit的?字母縮寫,是提供給Java開發?員的軟件環境,包含JRE和?組開發?具??煞譃?/p>
以下版本:
標準版(?多數開發?員?的就是這個)
企業版
微型版
JDK包含了?個私有的JVM和?些其他資源,?如說編譯器(javac命令)、解釋器(java命令)等,幫助Java程序員
完成開發?作。
12、JVM和JRE有什么區別?
JavaRuntimeEnvironment(JRE)是JVM的實現。JRE由JVM和Java?進制?件以及其他類組成,可以執?任何
程序。JRE不包含Java編譯器,調試器等任何開發?具。
13、哪個類是所有類的超類?
是所有Java類的超類,我們不需要繼承它,因為是隱式繼承的。
14、為什么Java不?持多重繼承?
如果有兩個類共同繼承(extends)?個有特定?法的?類,那么該?法會被兩個?類重寫。然后,如果你決定同時繼承這兩
個?類,那么在你調?該重寫?法時,編譯器不能識別你要調?哪個?類的?法。這也正是著名的菱形問題,見下圖。
ClassC同時繼承了ClassA和ClassB,ClassC的對象在調?ClassA和ClassB中重載的?法時,就不知道該調?
ClassA的?法,還是ClassB的?法。
15、為什么Java不是純粹的?向對象編程語??
之所以不能說Java是純粹的?向對象編程語?,是因為Java?持基本數據類型,?如說int、short、long、double
等,盡管它們有??的包裝器類型,但它們的確不能算是對象。
16、path和classpath之間有什么區別?
path是操作系統?來查找可執??件的環境變量,我的電腦上就定義了下圖這些path變量,?如Java和Maven的。
classpath是針對Java??的,?于指定Java虛擬機載?的字節碼?件路徑。
17、Java中`main()`?法的重要性是什么?
每個程序都需要?個??,對于Java程序來說,??就是main?法。
publicstaticvoidmain(String[]args){}
public關鍵字是另外?個訪問修飾符,除了可以聲明?法和變量(所有類可見),還可以聲明類。main()?法必須聲明
為public。
static關鍵字表?該變量或?法是靜態變量或靜態?法,可以直接通過類訪問,不需要實例化對象來訪問。
void關鍵字?于指定?法沒有返回值。
另外,main關鍵字為?法的名字,Java虛擬機在執?程序時會尋找這個標識符;args為main()?法的參數名,它的類型
為?個String數組,也就是說,在使?java命令執?程序的玩雪的作文 時候,可以給main()?法傳遞字符串數組作為參數。
javaHelloWorld沉默王?沉默王三
javac命令?來編譯程序,java命令?來執?程序,HelloWorld為這段程序的類名,沉默王?和沉默王三為字符串數組,中
間通過空格隔開,然后就可以在main()?法中通過args[0]和args[1]獲取傳遞的參數值了。
publicclassHelloWorld{
publicstaticvoidmain(String[]args){
if("沉默王?".equals(args[0])){
}
if("沉默王三".equals(args[1])){
}
}
}
main()?法的寫法并不是唯?的,還有其他?種變體,盡管它們可能并不常見,可以簡單來了解?下。
第?種,把?括號[]往args靠近?不是String靠近:
publicstaticvoidmain(String[]args){}
第三種,把?括號[]放在args的右側:
publicstaticvoidmain(Stringargs[]){}
第四種,還可以把數組形式換成可變參數的形式:
args){}
第五種,在main()?法上添加另外?個修飾符strictfp,?于強調在處理浮點數時的兼容性:
publicstrictfpstaticvoidmain(String[]args){}
也可以在main()?法上添加final關鍵字或者synchronized關鍵字。
第六種,還可以為args參數添加final關鍵字:
publicstaticvoidmain(finalString[]args){}
第七種,最復雜的?種,所有可以添加的關鍵字統統添加上:
finalstaticsynchronizedstrictfpvoidmain(finalString[]args){}
當然了,并不需要為了裝逼特意把main()?法寫成上?提到的這些形式,使?IDE提供的默認形式就可以了。
18、Java的重寫(Override)和重載(Overload)有什么區別?
先來看?段重寫的代碼吧。
classLaoWang{
publicvoidwrite(){
n("?王寫了?本《基督?伯爵》");
}
}
publicclassXiaoWangextendsLaoWang{
@Override
publicvoidwrite(){
n("?王寫了?本《茶花?》");
}
}
重寫的兩個?法名相同,?法參數的個數也相同;不過?個?法在?類中,另外?個在?類中。就好像?類LaoWang有?個
write()?法(?參),?法體是寫?本《基督?伯爵》;?類XiaoWang重寫了?類的write()?法(?參),但?法體
是寫?本《茶花?》。
來寫?段測試代碼。
publicclassOverridingTest{
publicstaticvoidmain(String[]args){
LaoWangwang=newXiaoWang();
();
}
}
?家猜結果是什么?
?王寫了?本《茶花?》
在上?的代碼中,們聲明了?個類型為LaoWang的變量wang。在編譯期間,編譯器會檢查LaoWang類是否包含了writ
e()?法,發現LaoWang類有,于是編譯通過。在運?期間,new了?個XiaoWang對象,并將曹操簡介資料 其賦值給wang,此時
Java虛擬機知道wang引?的是XiaoWang對象,所以調?的是?類XiaoWang中的write()?法?不是?類
LaoWang中的write()?法,因此輸出結果為“?王寫了?本《茶花?》”。
再來看?段重載的代碼吧。
classLaoWang{
publicvoidread(){
n("?王讀了?本《Web全棧開發進階之路》");
}
publicvoidread(Stringbookname){
n("?王讀了?本《"+bookname+"》");
}
}
重載的兩個?法名相同,但?法參數的個數不同,另外也不涉及到繼承,兩個?法在同?個類中。就好像類LaoWang有兩個
?法,名字都是read(),但?個有參數(書名),另外?個沒有(只能讀寫死的?本書)。
來寫?段測試代碼。
publicclassOverloadingTest{
publicstaticvoidmain(String[]args){
LaoWangwang=newLaoWang感恩圖片帶字唯美圖片 ();
();
("?瓶");
}
}
這結果就不?猜了。變量wang的類型為LaoWang,流行音樂 ()調?的是?參的read()?法,因此先輸出“?王讀了
?本《Web全棧開發進階之路》”;("?瓶")調?的是有參的read(bookname)?法,因此后輸出“?王讀了?本
《?瓶》”。在編譯期間,編譯器就知道這兩個read()?法時不同的,因為它們的?法簽名(=?法名稱+?法參數)不同。
簡單的來總結?下:
1)編譯器?法決定調?哪個重寫的?法,因為只從變量的類型上是?法做出判斷的,要在運?時才能決定;但編譯器可以明確
地知道該調?哪個重載的?法,因為引?類型是確定的,參數個數決定了該調?哪個?法。
2)多態針對的是重寫,?不是重載。
如果在?個類中有多個相同名字的?法,但參數不同,則稱為?法重載。
?類中有?個?法,?類中有另外?個和它有相同簽名(?法名相同,參數相同、修飾符相同)的?法時,則稱為?法重
寫。?類在重寫?類?法的時候可以加?個@Override注解。
19、`main()`?法可以重載嗎?
可以,?個類中可以有多個名稱為“main”的?法:
publicclassMainTest{
publicstaticvoidmain(String[]args){
n("main(String[]args)");
}
publicstaticvoidmain(String[]args,Stringarg){
n("(String[]args,Stringarg");
}
}
但該類在運?的時候,只會找到?個??,即publicstaticvoidmain(String[]args)。
20、?個Java源?件中有多個public類嗎?
?個Java源?件中不能有多個public類。
21、什么是Java的package(包)?
在Java中,我們使?package(包)對相關的類、接?和?包進?分組。這樣做的好處有:
使相關類型更容易查找
避免命名沖突,?如說和不同
通過包和訪問權限控制符來限定類的可見性
可以使?package關鍵字來定義?個包名,需要注意的是,這?代碼必須處于?個類中的第??。強烈建議在包中聲明類,
不要缺省,否則就失去了包結構的帶來的好處。
包的命名應該遵守以下規則:
應該全部是?寫字母
可以包含多個單詞,單詞之間使?“.”連接,?如說
名稱由公司名或者組織名確定,采?倒序的?式,?如說,我個?博客的域名是,所以我創建的包名是就
是。
每個包或者?包都在磁盤上有??的?錄結構,如果Java?件時在包下,那么該?件所在的?錄結構就
應該是com->itwanger->xxxx。
默認情況下,包是默認導?的,我們不需要顯式地導?該包下的任何類。
;
publicclassPackageTest{
publicstaticvoidmain(String[]args){
ng(true);
}
}
Boolean類屬于包,當使?它的時候并不需要顯式導?。
22、什么是訪問權限修飾符?
訪問權限修飾符對于Java來說,?常重要,?前共有四種:public、private、protected和default(缺?。?。
?個類只能使?public或者default修飾,public修飾的類你之前已經見到過了,現在我來定義?個缺省權限修飾符的類
給你欣賞?下。
classDog{
}
哈哈,其實也沒啥可以欣賞的。缺省意味著這個類可以被同?個包下的其他類進?訪問;?public意味著這個類可以被所有
包下的類進?訪問。
假如硬要通過private和protected來修飾類的話,編譯器會??的,它不同意。
private可以?來修飾類的構造?法、字段和?法,只能被當前類進?訪問。protected也可以?來修飾類的構造?法、字段
和?法,但它的權限范圍更寬?些,可以被同?個包中的類進?訪問,或者當前類的?類。
可以通過下?這張圖來對??下四個權限修飾符之間的差別:
同?個類中,不管是哪種權限修飾符,都可以訪問;
同?個包下,private修飾的?法訪問;
?類可以訪問public和protected修飾的;
public修飾符?向世界,哈哈,可以被所有的地?訪問到。
23、什么是final關鍵字?
final關鍵字修飾類的時候,表?該類?法被繼承。?如,String類就是final的,?法被繼承。
final關鍵字修飾?法的時候,表??類?法覆蓋它。
final關鍵字修飾變量的時候,表?該變量只能被賦值?次,盡管變量的狀態可以更改。
關于final更詳細的內容,可以參照我之前寫了另外?篇?章:
24、什么是static關鍵字?
static關鍵字可以?來修飾類變量,使其具有全局性,即所有對象將共享同?個變量。
static關鍵字可以?來修飾?法,該?法稱為靜態?法,只可以訪問類的靜態變量,并且只能調?類的靜態?法。
關于static更詳細的內容,可以參照我之前寫了另外?篇?章:
25、finally和finalize有什么區別?
finally通常與try-catch塊?起使?,即使try-catch塊引發了異常,finally塊中的代碼也會被執?,?于釋放try塊中
創建的資源。
finalize()是Object類的?個特殊?法,當對象正在被垃圾回收時,垃圾收集器將會調?該?法??梢灾貙懺?法?于釋放
系統資源。
26、可以將?個類聲明為static的嗎?
不能將?個外部類聲明為static的,但可以將?個內部類聲明為static的——稱為靜態內部類。
27、什么是靜態導??
如果必須在?個類中使?其他類的靜態變量或者靜態?法,通常我們需要先導?該類,然后使?“類名.變量/?法”的形式調
?。
;
doubletest=*5;
也可以通過靜態導?的?式,就不需要再使?類名了。
;
doubletest=PI*5;
不過,靜態導?容易引發混亂(變量名或者?法名容易沖突),因此最好避免使?靜態導?。
28、什么是try-with-resources?
try-with-resources是Java7時引?的?個?動資源管理語句,在此之前,我們必須通過try-catch-finally的?式?動
關閉資源,當我們忘記關閉資源的時候,就容易導致內存泄漏。
關于try-with-resources更詳細的內容,可以參照我之前寫了另外?篇?章:
29、什么是multi-catch?
Java7改進的另外?個地?就是multi-catch,可以在單個catch中捕獲多個異常,當?個try塊拋出多個類似的異常
時,這種寫法更短,更清晰。
catch(IOException|SQLExceptionex){
(ex);
thrownewMyException(sage());
}
當有多個異常的時候,可以使?管道表?符“|”隔開。
30、什么是static塊?
static塊是由JavaClassLoader將類加載到內存中時執?的代碼塊。通常?于初始化類的靜態變量或者創建靜態資源。
31、什么是接??
接?是Java編程語?中的?個核?概念,不僅在JDK源碼中使?很多,還在Java設計模式、框架和?具中使?很多。接
?提供了?種在Java中實現抽象的?法,?于定義?類的?為約定。
關于接?更詳細的內容,可以參照我之前寫了另外?篇?章:
鳴謝
說句實在話,這31道Java核??試題在?試的過程中還是很常見的,值得好好復習?遍。關鍵是還有下?波,同樣31
道,望眼欲穿吧?
好了,我親愛的?伙伴們,能看到這?絕逼是最優秀的程序員,?哥必須伸出帥?的?拇指為你點個贊!
我是沉默王?,?枚有顏值卻靠才華茍且的程序員。關注即可提升學習效率,別忘了三連啊,點贊、收藏、留?,我不挑,奧
利給。
注:如果?章有任何問題,歡迎毫不留情地指正。
很多讀者都同情我說,“?哥母豬似的?更原創累不累?”我只能說寫作不易,且?且珍惜啊,歡迎微信搜索「沉默王?」第
?時間閱讀,回復「簡歷」更有我精?為你準備的簡歷模板,本?GitHub已收錄,歡迎star。
本文發布于:2023-03-16 22:46:15,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1678977976144803.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:jre是什么.doc
本文 PDF 下載地址:jre是什么.pdf
| 留言與評論(共有 0 條評論) |