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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

java

java程序语言228_2019年Java面试题基础系列228道(5)

發(fā)布時(shí)間:2024/7/5 java 194 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java程序语言228_2019年Java面试题基础系列228道(5) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

21、存在兩個(gè)類(lèi),B 繼承 A,C 繼承 B,我們能將 B 轉(zhuǎn)換為C 么?如 C = (C) B;

這屬于強(qiáng)制類(lèi)型轉(zhuǎn)換,如果被轉(zhuǎn)換的B實(shí)例不是C類(lèi)型,會(huì)有異常

比如你的ABC分別對(duì)應(yīng)動(dòng)物,貓,黑貓。

向上轉(zhuǎn)型就是比如

C c = new C();

B b = c;

你把c轉(zhuǎn)型為B,黑貓是貓嗎?是啊,所以這是ok的。

但是反過(guò)來(lái)

B b = new B();

C c = (C)b;

這就不ok了,只知道這個(gè)b是一只貓,他不一定是黑貓。

但如果這個(gè)b已經(jīng)確定是一只黑貓了,那就可以轉(zhuǎn)型了

B b = new C();

C c = (C)b;

這里的b本來(lái)就是黑貓啊。

22、哪個(gè)類(lèi)包含 clone 方法?是 Cloneable 還是 Object?

java.lang.Cloneable 是一個(gè)標(biāo)示性接口,不包含任何方法,clone 方法在object 類(lèi)中定義。并且需要知道 clone() 方法是一個(gè)本地方法,這意味著它是由c 或 c++ 或 其他本地語(yǔ)言實(shí)現(xiàn)的。

23、Java 中 ++ 操作符是線(xiàn)程安全的嗎?

不是線(xiàn)程安全的操作。它涉及到多個(gè)指令,如讀取變量值,增加,然后存儲(chǔ)回內(nèi)存,這個(gè)過(guò)程可能會(huì)出現(xiàn)多個(gè)線(xiàn)程交差。

24、a = a + b 與 a += b 的區(qū)別

+= 隱式的將加操作的結(jié)果類(lèi)型強(qiáng)制轉(zhuǎn)換為持有結(jié)果的類(lèi)型。如果兩這個(gè)整型相加,如 byte、short 或者 int,首先會(huì)將它們提升到 int 類(lèi)型,然后在執(zhí)行加法操作。如果加法操作的結(jié)果比 a 的最大值要大,則 a+b 會(huì)出現(xiàn)編譯錯(cuò)誤,但是

bytea =127;byteb =127;b =a +b;// error : cannot convert from int to byteb +=a;// ok

(譯者注:這個(gè)地方應(yīng)該表述的有誤,其實(shí)無(wú)論 a+b 的值為多少,編譯器都會(huì)報(bào)錯(cuò),因?yàn)?a+b 操作會(huì)將 a、b 提升為 int 類(lèi)型,所以將 int 類(lèi)型賦值給 byte就會(huì)編譯出錯(cuò))

25、我能在不進(jìn)行強(qiáng)制轉(zhuǎn)換的情況下將一個(gè) double 值賦值給long 類(lèi)型的變量嗎?

不行,你不能在沒(méi)有強(qiáng)制類(lèi)型轉(zhuǎn)換的前提下將一個(gè) double 值賦值給 long 類(lèi)型的變量,因?yàn)?double 類(lèi)型的范圍比 long 類(lèi)型更廣,所以必須要進(jìn)行強(qiáng)制轉(zhuǎn)換。

26、3*0.1 == 0.3 將會(huì)返回什么?true 還是 false?

false,因?yàn)橛行└↑c(diǎn)數(shù)不能完全精確的表示出來(lái)。

27、int 和 Integer 哪個(gè)會(huì)占用更多的內(nèi)存?

Integer 對(duì)象會(huì)占用更多的內(nèi)存。Integer 是一個(gè)對(duì)象,需要存儲(chǔ)對(duì)象的元數(shù)據(jù)。但是 int 是一個(gè)原始類(lèi)型的數(shù)據(jù),所以占用的空間更少。

28、為什么 Java 中的 String 是不可變的(Immutable)?

Java 中的 String 不可變是因?yàn)?Java 的設(shè)計(jì)者認(rèn)為字符串使用非常頻繁,將字符串設(shè)置為不可變可以允許多個(gè)客戶(hù)端之間共享相同的字符串。

29、我們能在 Switch 中使用 String 嗎?

從 Java 7 開(kāi)始,我們可以在 switch case 中使用字符串,但這僅僅是一個(gè)語(yǔ)法糖。內(nèi)部實(shí)現(xiàn)在 switch 中使用字符串的 hash code。

30、Java 中的構(gòu)造器鏈?zhǔn)鞘裁?#xff1f;

當(dāng)你從一個(gè)構(gòu)造器中調(diào)用另一個(gè)構(gòu)造器,就是 Java 中的構(gòu)造器鏈。這種情況只在重載了類(lèi)的構(gòu)造器的時(shí)候才會(huì)出現(xiàn)。

31、64 位 JVM 中,int 的長(zhǎng)度是多數(shù)?

Java 中,int 類(lèi)型變量的長(zhǎng)度是一個(gè)固定值,與平臺(tái)無(wú)關(guān),都是 32 位。意思就是說(shuō),在32位和64位的java虛擬機(jī)中,int 類(lèi)型的長(zhǎng)度是相同的。

32、Serial 與 Parallel GC 之間的不同之處?

Serial 與 Parallel 在 GC 執(zhí)行的時(shí)候都會(huì)引起 stop-the-world。它們之間主要不同 serial 收集器是默認(rèn)的復(fù)制收集器,執(zhí)行 GC 的時(shí)候只有一個(gè)線(xiàn)程,而parallel 收集器使用多個(gè) GC 線(xiàn)程來(lái)執(zhí)行。

33、32 位和 64 位的 JVM,int 類(lèi)型變量的長(zhǎng)度是多數(shù)?

32 位和 64 位的 JVM 中,int 類(lèi)型變量的長(zhǎng)度是相同的,都是 32 位或者 4個(gè)字節(jié)。

34、Java 中 WeakReference 與 SoftReference 的區(qū)別?

35、WeakHashMap 是怎么工作的?

WeakHashMap 的工作與正常的 HashMap 類(lèi)似,但是使用弱引用作為 key,意思就是當(dāng) key 對(duì)象沒(méi)有任何引用時(shí),key/value 將會(huì)被回收。

36、JVM 選項(xiàng) -XX:+UseCompressedOops 有什么作用?為什么要使用?

到 64 位的 JVM主要?jiǎng)訖C(jī)在于可以指定最大堆大小,通過(guò)壓縮 OOP 可以節(jié)省一定的內(nèi)存。通過(guò)-XX:+UseCompressedOops 選項(xiàng),JVM 會(huì)使用 32 位的 OOP,而不是 64 位的 OOP。

37、怎樣通過(guò) Java 程序來(lái)判斷 JVM 是 32 位 還是 64位?

你可以檢查某些系統(tǒng)屬性如 sun.arch.data.model 或 os.arch 來(lái)獲取該信息。

38、32 位 JVM 和 64 位 JVM 的最大堆內(nèi)存分別是多數(shù)?

理論上說(shuō)上 32 位的 JVM 堆內(nèi)存可以到達(dá) 2^32,即 4GB,但實(shí)際上會(huì)比這個(gè)小很多。不同操作系統(tǒng)之間不同,如 Windows 系統(tǒng)大約 1.5 GB,Solaris 大約3GB。64 位 JVM 允許指定最大的堆內(nèi)存,理論上可以達(dá)到 2^64,這是一個(gè)非常大的數(shù)字,實(shí)際上你可以指定堆內(nèi)存大小到 100GB。甚至有的 JVM,如 Azul,堆內(nèi)存到 1000G 都是可能的。

39、JRE、JDK、JVM 及 JIT 之間有什么不同?

JRE 代表 Java 運(yùn)行 時(shí)(Java run-time),是 運(yùn) 行 Java 引用所必須的。JDK 代表 Java 開(kāi)發(fā)工具(Java development kit),是 Java 程序的開(kāi)發(fā)工具,如 Java編譯器,它也包含 JRE。JVM 代表 Java 虛擬機(jī)(Java virtual machine),它的責(zé)任是運(yùn)行 Java 應(yīng)用。JIT 代表即時(shí)編譯(Just In Time compilation),當(dāng)代碼執(zhí)行的次數(shù)超過(guò)一定的閾值時(shí),會(huì)將 Java 字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點(diǎn)代碼會(huì)被準(zhǔn)換為本地代碼,這樣有利大幅度提高 Java 應(yīng)用的性能。

40、解釋 Java 堆空間及 GC?

當(dāng)通過(guò) Java 命令啟動(dòng) Java 進(jìn)程的時(shí)候,會(huì)為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對(duì)象的時(shí)候,就從對(duì)空間中分配內(nèi)存。GC 是 JVM 內(nèi)部的一個(gè)進(jìn)程,回收無(wú)效對(duì)象的內(nèi)存用于將來(lái)的分配。

41、你能保證 GC 執(zhí)行嗎?

不能,雖然你可以調(diào)用 System.gc() 或者 Runtime.gc(),但是沒(méi)有辦法保證 GC的執(zhí)行。

42、怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比?

可以通過(guò) java.lang.Runtime 類(lèi)中與內(nèi)存相關(guān)方法來(lái)獲取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過(guò)這些方法你也可以獲取到堆使用的百分比及堆內(nèi)存的剩余空間。Runtime.freeMemory() 方法返回剩余空間的字節(jié)數(shù),Runtime.totalMemory()方法總內(nèi)存的字節(jié)數(shù),Runtime.maxMemory() 返回最大內(nèi)存的字節(jié)數(shù)。

43、Java 中堆和棧有什么區(qū)別?

JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線(xiàn)程之間共享,而堆被整個(gè) JVM 的所有線(xiàn)程共享。

44、“a==b”和”a.equals(b)”有什么區(qū)別?

如果 a 和 b 都是對(duì)象,則 a==b 是比較兩個(gè)對(duì)象的引用,只有當(dāng) a 和 b 指向的是堆中的同一個(gè)對(duì)象才會(huì)返回 true,而 a.equals(b) 是進(jìn)行邏輯比較,所以通常需要重寫(xiě)該方法來(lái)提供邏輯一致性的比較。例如,String 類(lèi)重寫(xiě) equals() 方法,所以可以用于兩個(gè)不同對(duì)象,但是包含的字母相同的比較。

45、a.hashCode() 有什么用?與 a.equals(b) 有什么關(guān)系?

hashCode() 方法是相應(yīng)對(duì)象整型的 hash 值。它常用于基于 hash 的集合類(lèi),如 Hashtable、HashMap、LinkedHashMap 等等。它與 equals() 方法關(guān)系特別緊密。根據(jù) Java 規(guī)范,兩個(gè)使用 equal() 方法來(lái)判斷相等的對(duì)象,必須具有相同的 hash code。

46、final、finalize 和 finally 的不同之處?

final 是一個(gè)修飾符,可以修飾變量、方法和類(lèi)。如果 final 修飾變量,意味著該變量的值在初始化后不能被改變。finalize 方法是在對(duì)象被回收之前調(diào)用的方法,給對(duì)象自己最后一個(gè)復(fù)活的機(jī)會(huì),但是什么時(shí)候調(diào)用 finalize 沒(méi)有保證。finally是一個(gè)關(guān)鍵字,與 try 和 catch 一起用于異常的處理。finally 塊一定會(huì)被執(zhí)行,無(wú)論在 try 塊中是否有發(fā)生異常。

47、Java 中的編譯期常量是什么?使用它又什么風(fēng)險(xiǎn)?

公共靜態(tài)不可變(public static final )變量也就是我們所說(shuō)的編譯期常量,這里的 public 可選的。實(shí)際上這些變量在編譯時(shí)會(huì)被替換掉,因?yàn)榫幾g器知道這些變量的值,并且知道這些變量在運(yùn)行時(shí)不能改變。這種方式存在的一個(gè)問(wèn)題是你使用了一個(gè)內(nèi)部的或第三方庫(kù)中的公有編譯時(shí)常量,但是這個(gè)值后面被其他人改變了,但是你的客戶(hù)端仍然在使用老的值,甚至你已經(jīng)部署了一個(gè)新的 jar。為了避免這種情況,當(dāng)你在更新依賴(lài) JAR 文件時(shí),確保重新編譯你的程序。

48、List、Set、Map 和 Queue 之間的區(qū)別(答案)

List 是一個(gè)有序集合,允許元素重復(fù)。它的某些實(shí)現(xiàn)可以提供基于下標(biāo)值的常量訪(fǎng)問(wèn)時(shí)間,但是這不是 List 接口保證的。Set 是一個(gè)無(wú)序集合。

49、poll() 方法和 remove() 方法的區(qū)別?

poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素,但是 poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但是 remove() 失敗的時(shí)候會(huì)拋出異常。

50、Java 中 LinkedHashMap 和 PriorityQueue 的區(qū)別是什么?

PriorityQueue 保證最高或者最低優(yōu)先級(jí)的的元素總是在隊(duì)列頭部,但是LinkedHashMap 維持的順序是元素插入的順序。當(dāng)遍歷一個(gè) PriorityQueue時(shí),沒(méi)有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。

40、解釋 Java 堆空間及 GC?

當(dāng)通過(guò) Java 命令啟動(dòng) Java 進(jìn)程的時(shí)候,會(huì)為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對(duì)象的時(shí)候,就從對(duì)空間中分配內(nèi)存。GC 是 JVM 內(nèi)部的一個(gè)進(jìn)程,回收無(wú)效對(duì)象的內(nèi)存用于將來(lái)的分配。

41、你能保證 GC 執(zhí)行嗎?

不能,雖然你可以調(diào)用 System.gc() 或者 Runtime.gc(),但是沒(méi)有辦法保證 GC的執(zhí)行。

42、怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比?

可以通過(guò) java.lang.Runtime 類(lèi)中與內(nèi)存相關(guān)方法來(lái)獲取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過(guò)這些方法你也可以獲取到堆使用的百分比及堆內(nèi)存的剩余空間。Runtime.freeMemory() 方法返回剩余空間的字節(jié)數(shù),Runtime.totalMemory()方法總內(nèi)存的字節(jié)數(shù),Runtime.maxMemory() 返回最大內(nèi)存的字節(jié)數(shù)。

43、Java 中堆和棧有什么區(qū)別?

JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線(xiàn)程之間共享,而堆被整個(gè) JVM 的所有線(xiàn)程共享。

44、“a==b”和”a.equals(b)”有什么區(qū)別?

如果 a 和 b 都是對(duì)象,則 a==b 是比較兩個(gè)對(duì)象的引用,只有當(dāng) a 和 b 指向的是堆中的同一個(gè)對(duì)象才會(huì)返回 true,而 a.equals(b) 是進(jìn)行邏輯比較,所以通常需要重寫(xiě)該方法來(lái)提供邏輯一致性的比較。例如,String 類(lèi)重寫(xiě) equals() 方法,所以可以用于兩個(gè)不同對(duì)象,但是包含的字母相同的比較。

45、a.hashCode() 有什么用?與 a.equals(b) 有什么關(guān)系?

hashCode() 方法是相應(yīng)對(duì)象整型的 hash 值。它常用于基于 hash 的集合類(lèi),如 Hashtable、HashMap、LinkedHashMap 等等。它與 equals() 方法關(guān)系特別緊密。根據(jù) Java 規(guī)范,兩個(gè)使用 equal() 方法來(lái)判斷相等的對(duì)象,必須具有相同的 hash code。

46、final、finalize 和 finally 的不同之處?

final 是一個(gè)修飾符,可以修飾變量、方法和類(lèi)。如果 final 修飾變量,意味著該變量的值在初始化后不能被改變。finalize 方法是在對(duì)象被回收之前調(diào)用的方法,給對(duì)象自己最后一個(gè)復(fù)活的機(jī)會(huì),但是什么時(shí)候調(diào)用 finalize 沒(méi)有保證。finally是一個(gè)關(guān)鍵字,與 try 和 catch 一起用于異常的處理。finally 塊一定會(huì)被執(zhí)行,無(wú)論在 try 塊中是否有發(fā)生異常。

47、Java 中的編譯期常量是什么?使用它又什么風(fēng)險(xiǎn)?

公共靜態(tài)不可變(public static final )變量也就是我們所說(shuō)的編譯期常量,這里的 public 可選的。實(shí)際上這些變量在編譯時(shí)會(huì)被替換掉,因?yàn)榫幾g器知道這些變量的值,并且知道這些變量在運(yùn)行時(shí)不能改變。這種方式存在的一個(gè)問(wèn)題是你使用了一個(gè)內(nèi)部的或第三方庫(kù)中的公有編譯時(shí)常量,但是這個(gè)值后面被其他人改變了,但是你的客戶(hù)端仍然在使用老的值,甚至你已經(jīng)部署了一個(gè)新的 jar。為了避免這種情況,當(dāng)你在更新依賴(lài) JAR 文件時(shí),確保重新編譯你的程序。

48、List、Set、Map 和 Queue 之間的區(qū)別(答案)

List 是一個(gè)有序集合,允許元素重復(fù)。它的某些實(shí)現(xiàn)可以提供基于下標(biāo)值的常量訪(fǎng)問(wèn)時(shí)間,但是這不是 List 接口保證的。Set 是一個(gè)無(wú)序集合。

49、poll() 方法和 remove() 方法的區(qū)別?

poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素,但是 poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但是 remove() 失敗的時(shí)候會(huì)拋出異常。

50、Java 中 LinkedHashMap 和 PriorityQueue 的區(qū)別是什么?

PriorityQueue 保證最高或者最低優(yōu)先級(jí)的的元素總是在隊(duì)列頭部,但是LinkedHashMap 維持的順序是元素插入的順序。當(dāng)遍歷一個(gè) PriorityQueue時(shí),沒(méi)有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java程序语言228_2019年Java面试题基础系列228道(5)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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