您的位置:首頁>正文

永不過時的java經典基礎題目(一)

心有乾貨 才能臨危不懼

提醒:越是貌似簡單的面試題其中的玄機就越多, 需要面試者有相當深厚的功力。

1、String 是最基本的資料類型嗎?

答:不是。

Java中的基底資料型別只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitive type)和枚舉類型(enumeration type), 剩下的都是參考類型(reference type)。

2、float f=3.4;是否正確?

答:不正確。 3.4是雙精度數, 將雙精度型(double)賦值給浮點型(float)屬於下轉型(down-casting, 也稱為窄化)會造成精度損失, 因此需要強制類型轉換float f =(float)3.4; 或者寫成float f =3.4F.

3、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?

答:對於short s1 = 1; s1 = s1 + 1;由於1是int類型, 因此s1+1運算結果也是int 型, 需要強制轉換類型才能賦值給short型。 而short s1 = 1; s1 += 1;可以正確編譯, 因為s1+= 1;相當於s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。

4.&和&&的區別?

答:雖然二者都要求運算子左右兩端的布林值都是true整個運算式的值才是true。

但&&(也稱短路與運算), 如果&&左邊的運算式的值是false, 右邊的運算式會被直接短路掉, 不會進行運算。 很多時候我們常用&&而不是&。

例如在驗證用戶登錄時判定用戶名不是null而且不是空字串,

應當寫為:username != null &&!username.equals(“”), 二者的順序不能交換, 更不能用&運算子, 因為第一個條件如果不成立, 根本不能進行字串的equals比較, 否則會產生NullPointerException異常。

注意:邏輯或運算子(|)和短路或運算子(||)的差別也是如此。

5.int和Integer有什麼區別?

答:Java為了程式設計的方便還是引入了基底資料型別, 但是為了能夠將這些基底資料型別當成物件操作, Java為每一個基底資料型別都引入了對應的包裝類型(wrapper class), int的包裝類就是Integer, 從Java 5開始引入了自動裝箱/拆箱機制, 使得二者可以相互轉換。

Java 為每個原始類型提供了包裝類型:

- 原始類型: boolean, char, byte, short, int, long, float, double

- 包裝類型:Boolean, Character, Byte, Short, Integer, Long, Float, Double

面試真題:代碼如下, 請回答輸出結果:

Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;

System.out.println(f1 == f2);

System.out.println(f3 == f4);

如果不明就裡很容易認為兩個輸出要麼都是true要麼都是false。 首先需要注意的是f1、f2、f3、f4四個變數都是Integer物件引用,

所以下面的==運算比較的不是值而是引用。 裝箱的本質是什麼呢?當我們給一個Integer物件賦一個int值的時候, 會調用Integer類的靜態方法valueOf, 如果看看valueOf的原始程式碼就知道發生了什麼。

簡單的說, 如果整型字面量的值在-128到127之間, 那麼不會new新的Integer物件,

而是直接引用常量池中的Integer物件, 所以上面的面試題中f1==f2的結果是true, 而f3==f4的結果是false。

6.解釋記憶體中的棧(stack)、堆(heap)和靜態區(static area)的用法。

答:通常我們定義一個基底資料型別的變數, 一個物件的引用, 還有就是函式呼叫的現場保存都使用記憶體中的棧空間;而通過new關鍵字和構造器創建的物件放在堆空間;程式中的字面量(literal)如直接書寫的100、”hello”和常量都是放在靜態區中。 棧空間操作起來最快但是棧很小, 通常大量的物件都是放在堆空間, 理論上整個記憶體沒有被其他進程使用的空間甚至硬碟上的虛擬記憶體都可以被當成堆空間來使用。

1String str = new String("hello");

上面的語句中變數str放在棧上, 用new創建出來的字串物件放在堆上, 而”hello”這個字面量放在靜態區。

補充:較新版本的Java(從Java 6的某個更新開始)中使用了一項叫”逃逸分析”的技術, 可以將一些局部物件放在棧上以提升物件的操作性能。

7.Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?

答:Math.round(11.5)的返回值是12, Math.round(-11.5)的返回值是-11。

解析:四捨五入的原理是在參數上加0.5然後進行下取整。

8.用最有效率的方法計算2乘以8?

答: 2

解析:java中有三種移位運算子:

>> : 右移運算子, num >> 1,相當於num除以2

>>> : 無符號右移, 忽略符號位元, 空位都以0補齊

9.構造器(constructor)是否可被重寫(override)?

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

10、重載(Overload)和重寫(Override)的區別。 重載的方法能否根據返回類型進行區分?

答:方法的重載和重寫都是實現多態的方式, 區別在於前者實現的是編譯時的多態性, 而後者實現的是運行時的多態性。 重載發生在一個類中, 同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(裡氏代換原則)。重載對返回類型沒有特殊的要求。

圖文並茂,寫了個類:

如果面試題這樣問:為什麼不能根據返回類型來區分重載?該知道如何回答了吧

11、是否可以繼承String類?

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

補充:繼承String本身就是一個錯誤的行為,對String類型最好的重用方式是關聯關係(Has-A)和依賴關係(Use-A)而不是繼承關係(Is-A)。

12、String和StringBuilder、StringBuffer的區別?

答:Java平臺提供了兩種類型的字串:String和StringBuffer/StringBuilder,它們可以儲存和操作字串。其中String是唯讀字串,也就意味著String引用的字串內容是不能被改變的。而StringBuffer/StringBuilder類表示的字串物件可以直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單執行緒環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。

面試題1 - 什麼情況下用+運算子進行字元串連接比調用StringBuffer/StringBuilder物件的append方法連接字串性能更好?

答:如果使用少量的字串操作,使用 (+運算子)連接字串;

如果頻繁的對大量字串進行操作,則使用

1:全域變數或者需要多執行緒支援則使用StringBuffer;

2:區域變數或者單執行緒不涉及執行緒安全則使有StringBuilder。

補充:String物件的intern方法會得到字串物件在常量池中對應的版本的引用(如果常量池中有一個字串與String物件的equals結果是true),如果常量池中沒有對應的字串,則該字串將被添加到常量池中,然後返回常量池中字串的引用。

同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(裡氏代換原則)。重載對返回類型沒有特殊的要求。

圖文並茂,寫了個類:

如果面試題這樣問:為什麼不能根據返回類型來區分重載?該知道如何回答了吧

11、是否可以繼承String類?

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

補充:繼承String本身就是一個錯誤的行為,對String類型最好的重用方式是關聯關係(Has-A)和依賴關係(Use-A)而不是繼承關係(Is-A)。

12、String和StringBuilder、StringBuffer的區別?

答:Java平臺提供了兩種類型的字串:String和StringBuffer/StringBuilder,它們可以儲存和操作字串。其中String是唯讀字串,也就意味著String引用的字串內容是不能被改變的。而StringBuffer/StringBuilder類表示的字串物件可以直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單執行緒環境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。

面試題1 - 什麼情況下用+運算子進行字元串連接比調用StringBuffer/StringBuilder物件的append方法連接字串性能更好?

答:如果使用少量的字串操作,使用 (+運算子)連接字串;

如果頻繁的對大量字串進行操作,則使用

1:全域變數或者需要多執行緒支援則使用StringBuffer;

2:區域變數或者單執行緒不涉及執行緒安全則使有StringBuilder。

補充:String物件的intern方法會得到字串物件在常量池中對應的版本的引用(如果常量池中有一個字串與String物件的equals結果是true),如果常量池中沒有對應的字串,則該字串將被添加到常量池中,然後返回常量池中字串的引用。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示