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

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

生活随笔

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

java

【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(二)

發(fā)布時(shí)間:2025/3/8 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

21.在Java中,如何跳出當(dāng)前的多重嵌套循環(huán)?

答:在最外層循環(huán)前加一個(gè)標(biāo)記如A,然后用break A;可以跳出多重循環(huán)。(Java中支持帶標(biāo)簽的break和continue語(yǔ)句,作用有點(diǎn)類似于C和C++中的goto語(yǔ)句,但是就像要避免使用goto一樣,應(yīng)該避免使用帶標(biāo)簽的break和continue,因?yàn)樗粫?huì)讓你的程序變得更優(yōu)雅,很多時(shí)候甚至有相反的作用,所以這種語(yǔ)法其實(shí)不知道更好)

22.構(gòu)造器(constructor)是否可被重寫(override)?

答:構(gòu)造器不能被繼承,因此不能被重寫,但可以被重載。

23.兩個(gè)對(duì)象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對(duì)不對(duì)?

答:不對(duì),如果兩個(gè)對(duì)象x和y滿足x.equals(y) == true,它們的哈希碼(hash code)應(yīng)當(dāng)相同。Java對(duì)于eqauls方法和hashCode方法是這樣規(guī)定的:

(1)如果兩個(gè)對(duì)象相同(equals方法返回true),那么它們的hashCode值一定要相同;

(2)如果兩個(gè)對(duì)象的hashCode相同,它們并不一定相同。

當(dāng)然,你未必要按照要求去做,但是如果你違背了上述原則就會(huì)發(fā)現(xiàn)在使用容器時(shí),相同的對(duì)象可以出現(xiàn)在Set集合中,同時(shí)增加新元素的效率會(huì)大大下降(對(duì)于使用哈希存儲(chǔ)的系統(tǒng),如果哈希碼頻繁的沖突將會(huì)造成存取性能急劇下降)。

補(bǔ)充:關(guān)于equals和hashCode方法,很多Java程序都知道,但很多人也就是僅僅知道而已,在Joshua Bloch的大作《Effective Java》(很多軟件公司,《Effective Java》、《Java編程思想》以及《重構(gòu):改善既有代碼質(zhì)量》是Java程序員必看書籍,如果你還沒(méi)看過(guò),那就趕緊去亞馬遜買一本吧)中是這樣介紹equals方法的:首先equals方法必須滿足自反性(x.equals(x)必須返回true)、對(duì)稱性(x.equals(y)返回true時(shí),y.equals(x)也必須返回true)、傳遞性(x.equals(y)和y.equals(z)都返回true時(shí),x.equals(z)也必須返回true)和一致性(當(dāng)x和y引用的對(duì)象信息沒(méi)有被修改時(shí),多次調(diào)用x.equals(y)應(yīng)該得到同樣的返回值),而且對(duì)于任何非null值的引用x,x.equals(null)必須返回false。實(shí)現(xiàn)高質(zhì)量的equals方法的訣竅包括:1.使用==操作符檢查"參數(shù)是否為這個(gè)對(duì)象的引用";2.使用instanceof操作符檢查"參數(shù)是否為正確的類型";3.對(duì)于類中的關(guān)鍵屬性,檢查參數(shù)傳入對(duì)象的屬性是否與之相匹配;4.編寫完equals方法后,問(wèn)自己它是否滿足對(duì)稱性、傳遞性、一致性;5.重寫equals時(shí)總是要重寫hashCode;6.不要將equals方法參數(shù)中的Object對(duì)象替換為其他的類型,在重寫時(shí)不要忘掉@Override注解。

24.是否可以繼承String類?

答:String 類是final類,不可以被繼承。

補(bǔ)充:繼承String本身就是一個(gè)錯(cuò)誤的行為,對(duì)String類型最好的重用方式是關(guān)聯(lián)關(guān)系(Has-A)和依賴關(guān)系(Use-A)而不是繼承關(guān)系(Is-A)。

25.當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

答:是值傳遞。Java語(yǔ)言的方法調(diào)用只支持參數(shù)的值傳遞。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的屬性可以在被調(diào)用過(guò)程中被改變,但對(duì)對(duì)象引用的改變是不會(huì)影響到調(diào)用者的。C++和C#中可以通過(guò)傳引用或傳輸出參數(shù)來(lái)改變傳入的參數(shù)的值。在C#中可以編寫如下所示的代碼,但是在Java中卻做不到。

namespace CS01 {

class Program {public static void swap(ref int x, ref int y) {int temp = x;x = y;y = temp;}public static void Main (string[] args) {int a = 5, b = 10;swap (ref a, ref b);// a = 10, b = 5;Console.WriteLine ("a = {0}, b = {1}", a, b);}}

}

說(shuō)明:Java中沒(méi)有傳引用實(shí)在是非常的不方便,這一點(diǎn)在Java 8中仍然沒(méi)有得到改進(jìn),正是如此在Java編寫的代碼中才會(huì)出現(xiàn)大量的Wrapper類(將需要通過(guò)方法調(diào)用修改的引用置于一個(gè)Wrapper類中,再將Wrapper對(duì)象傳入方法),這樣的做法只會(huì)讓代碼變得臃腫,尤其是讓從C和C++轉(zhuǎn)型為Java程序員的開(kāi)發(fā)者無(wú)法容忍。

26.String和StringBuilder、StringBuffer的區(qū)別?

答:(1)String和StringBuffer、StringBuider:

①String:是不可變字符序列;②StringBuffer、StringBuider:是可變字符序列;

③String覆蓋了equals方法和hashCode方法,而StringBuffer沒(méi)有覆蓋equals方法和hashCode方法,所以,將StringBuffer對(duì)象存儲(chǔ)進(jìn)Java集合類中時(shí)會(huì)出現(xiàn)問(wèn)題。

(2)StringBuffer和StringBuider:

①StringBuffer:是JDK1.0版本的,線程安全,效率低;②StringBuilder:是JDK1.5版本的,線程不安全,效率高;

③如果一個(gè)字符串變量是在方法里面定義,這種情況只可能有一個(gè)線程訪問(wèn)它,不存在不安全的因素了,則用StringBuilder。如果要在類里面定義成員變量,并且這個(gè)類的實(shí)例對(duì)象會(huì)在多線程環(huán)境下使用,那么最好用StringBuffer。

27.描述一下JVM加載class文件的原理機(jī)制?

答:JVM中類的裝載是由類加載器(ClassLoader)和它的子類來(lái)實(shí)現(xiàn)的,Java中的類加載器是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件,它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件中的類。

由于Java的跨平臺(tái)性,經(jīng)過(guò)編譯的Java源程序并不是一個(gè)可執(zhí)行程序,而是一個(gè)或多個(gè)類文件。當(dāng)Java程序需要使用某個(gè)類時(shí),JVM會(huì)確保這個(gè)類已經(jīng)被加載、連接(驗(yàn)證、準(zhǔn)備和解析)和初始化。類的加載是指把類的.class文件中的數(shù)據(jù)讀入到內(nèi)存中,通常是創(chuàng)建一個(gè)字節(jié)數(shù)組讀入.class文件,然后產(chǎn)生與所加載類對(duì)應(yīng)的Class對(duì)象。加載完成后,Class對(duì)象還不完整,所以此時(shí)的類還不可用。當(dāng)類被加載后就進(jìn)入連接階段,這一階段包括驗(yàn)證、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號(hào)引用替換為直接引用)三個(gè)步驟。最后JVM對(duì)類進(jìn)行初始化,包括:1)如果類存在直接的父類并且這個(gè)類還沒(méi)有被初始化,那么就先初始化父類;2)如果類中存在初始化語(yǔ)句,就依次執(zhí)行這些初始化語(yǔ)句。

類的加載是由類加載器完成的,類加載器包括:根加載器(BootStrap)、擴(kuò)展加載器(Extension)、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)。從Java 2(JDK 1.2)開(kāi)始,類加載過(guò)程采取了父親委托機(jī)制(PDM)。PDM更好的保證了Java平臺(tái)的安全性,在該機(jī)制中,JVM自帶的Bootstrap是根加載器,其他的加載器都有且僅有一個(gè)父類加載器。類的加載首先請(qǐng)求父類加載器加載,父類加載器無(wú)能為力時(shí)才由其子類加載器自行加載。JVM不會(huì)向Java程序提供對(duì)Bootstrap的引用。下面是關(guān)于幾個(gè)類加載器的說(shuō)明:

Bootstrap:一般用本地代碼實(shí)現(xiàn),負(fù)責(zé)加載JVM基礎(chǔ)核心類庫(kù)(rt.jar);

Extension:從java.ext.dirs系統(tǒng)屬性所指定的目錄中加載類庫(kù),它的父加載器是Bootstrap;

System:又叫應(yīng)用類加載器,其父類是Extension。它是應(yīng)用最廣泛的類加載器。它從環(huán)境變量classpath或者系統(tǒng)屬性java.class.path所指定的目錄中記載類,是用戶自定義加載器的默認(rèn)父加載器。

28.抽象類(abstract class)和接口(interface)有什么異同?

答:(1)成員特點(diǎn):

①構(gòu)造方法:接口沒(méi)有;抽象類有;

②成員變量:接口中只有常量;抽象類中常量、變量都可;

③成員方法:接口只有抽象方法;抽象類中抽象方法、非抽象方法都可;

(2)關(guān)系特點(diǎn):

①類與類:只有單繼承,但可以多層繼承;

②類與接口:實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn);

③接口與接口:繼承關(guān)系,可以單繼承,也可以多繼承;

(3)設(shè)計(jì)理念:

①接口是簡(jiǎn)單工廠設(shè)計(jì)模式,like a的關(guān)系 ,接口中定義的是該繼承體系的擴(kuò)展功能;

③抽象類是模板設(shè)計(jì)模式,is a的關(guān)系,抽象類中定義的是繼承體系的共×××;

29.Java中會(huì)存在內(nèi)存泄漏嗎,請(qǐng)簡(jiǎn)單描述?

答:理論上Java因?yàn)橛欣厥諜C(jī)制(GC)不會(huì)存在內(nèi)存泄露問(wèn)題(這也是Java被廣泛使用于服務(wù)器端編程的一個(gè)重要原因);然而在實(shí)際開(kāi)發(fā)中,可能會(huì)存在無(wú)用但可達(dá)的對(duì)象,這些對(duì)象不能被GC回收,因此也會(huì)導(dǎo)致內(nèi)存泄露的發(fā)生。例如Hibernate的Session(一級(jí)緩存)中的對(duì)象屬于持久態(tài),垃圾回收器是不會(huì)回收這些對(duì)象的,然而這些對(duì)象中可能存在無(wú)用的垃圾對(duì)象,如果不及時(shí)關(guān)閉(close)或清空(flush)一級(jí)緩存就可能導(dǎo)致內(nèi)存泄露。

30.抽象的(abstract)方法是否可同時(shí)是靜態(tài)的(static),是否可同時(shí)是本地方法(native),是否可同時(shí)被synchronized修飾?

答:都不能。抽象方法需要子類重寫,而靜態(tài)的方法是無(wú)法被重寫的,因此二者是矛盾的。本地方法是由本地代碼(如C代碼)實(shí)現(xiàn)的方法,而抽象方法是沒(méi)有實(shí)現(xiàn)的,也是矛盾的。synchronized和方法的實(shí)現(xiàn)細(xì)節(jié)有關(guān),抽象方法不涉及實(shí)現(xiàn)細(xì)節(jié),因此也是相互矛盾的。

31.是否可以從一個(gè)靜態(tài)(static)方法內(nèi)部發(fā)出對(duì)非靜態(tài)(non-static)方法的調(diào)用?

答:不可以,靜態(tài)方法只能訪問(wèn)靜態(tài)成員,因?yàn)榉庆o態(tài)方法的調(diào)用要先創(chuàng)建對(duì)象,在調(diào)用靜態(tài)方法時(shí)可能對(duì)象并沒(méi)有被初始化。

32.GC是什么?為什么要有GC?

答:GC是垃圾收集的意思,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,從而有效的防止內(nèi)存泄露。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉顯示的垃圾回收調(diào)用。

33.String st = null和 String st =“ ”的區(qū)別?String s = new String("xyz")創(chuàng)建了幾個(gè)對(duì)象?

答:(1)String st = null表示聲明了一個(gè)String對(duì)象的引用str,但是沒(méi)有為其分配存內(nèi)存空間。

(2)String st =“ ”表示創(chuàng)建了一個(gè)長(zhǎng)度等于0的空字符串,并在內(nèi)存中分配了內(nèi)存空間。

(3)String st = new String(“xyz”);表示創(chuàng)建了兩個(gè)對(duì)象:

①堆內(nèi)存中一個(gè)new String;②常量池中一個(gè)字符串。

34.接口是否可繼承(extends)接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承具體類(concrete class)?

答:接口可以繼承接口,而且支持多重繼承。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類可繼承具體類也可以繼承抽象類。

35.Anonymous Inner Class(匿名內(nèi)部類)是否可以繼承其它類?是否可以實(shí)現(xiàn)接口?

答:可以繼承其他類或?qū)崿F(xiàn)其他接口,在Swing編程和Android開(kāi)發(fā)中常用此方式來(lái)實(shí)現(xiàn)事件監(jiān)聽(tīng)和回調(diào)。

36.內(nèi)部類可以引用它的包含類(外部類)的成員嗎?有沒(méi)有什么限制?

答:一個(gè)內(nèi)部類對(duì)象可以訪問(wèn)創(chuàng)建它的外部類對(duì)象的成員,包括私有成員。

37.final、finally和finalized的區(qū)別?

答:(1)final:被final修飾的類,不被能繼承;被final修飾的方法,不能被重寫;被fianl修飾的量,為常量,只能被賦值一次;

(2)finally:異常處理,和try、catch結(jié)合使用,可加可不加,用于執(zhí)行一些必須執(zhí)行的代碼,如釋放資源等;

(3)finalized:Object類中的方法,其中定義了對(duì)象要被垃圾回收器回收之前,要做的一些清理工作。

38.數(shù)據(jù)類型之間的轉(zhuǎn)換?

答:(1)如何將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型?

調(diào)用基本數(shù)據(jù)類型對(duì)應(yīng)的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應(yīng)基本類型;

(2)如何將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串?

一種方法是將基本數(shù)據(jù)類型與空字符串("")連接(+)即可獲得其所對(duì)應(yīng)的字符串;另一種方法是調(diào)用String類中的valueOf()方法返回相應(yīng)字符串

39.如何實(shí)現(xiàn)字符串的反轉(zhuǎn)及替換?

答:方法很多,可以自己寫實(shí)現(xiàn)也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常見(jiàn)的面試題是用遞歸實(shí)現(xiàn)字符串反轉(zhuǎn),代碼如下所示:

public static String reverse(String originStr) {if(originStr == null || originStr.length() <= 1)return originStr;return reverse(originStr.substring(1)) + originStr.charAt(0);}

40.怎樣將GB2312編碼的字符串轉(zhuǎn)換為ISO-8859-1編碼的字符串?

答:代碼如下所示:

String s1 = "你好";

String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

轉(zhuǎn)載于:https://blog.51cto.com/13919357/2162509

總結(jié)

以上是生活随笔為你收集整理的【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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