1. 程式人生 > >2018java面試題

2018java面試題

String能被繼承嗎?為什麼?

不可以,因為String類有final修飾符,而final不能被繼承的,實現細節不允許改變。平常我們定義的String str = " a ";其實和String str = new String("a");還是有差異的。

前者預設呼叫的String.valueof來返回String的例項物件,至於呼叫哪個則取決於你的賦值,比如String num = 1;呼叫的是public static String valueOf(int i){

   return Integer.toString(i);

}

後者則是呼叫如下部分:

public String(String original) { 
this.value = original.value; 
this.hash = original.hash; 

最後我們的變數都儲存在一個char陣列中。

private final char value[];

String, Stringbuffer, StringBuilder 的區別。

String 字串常量(final修飾,不可被繼承),String是常量,當建立之後即不能更改。(可以通過StringBuffer和StringBuilder建立String物件(常用的兩個字串操作類)。) 

StringBuffer 字串變數(執行緒安全),其也是final類別的,不允許被繼承,其中的絕大多數方法都進行了同步處理,包括常用的Append方法也做了同步處理。其自jdk1.0起就已經出現。其toString方法會進行物件快取,以減少元素的複製開銷。

public synchronized String toString() { 
if (toStringCache == null) { 
toStringCache = Arrays.copyOfRange(value, 0, count); 

return new String(toStringCache, true); 
}

StringBuilder 字串變數,(非執行緒安全)其自jdk1.5起開始出現。與StringBuffer一樣都繼承和實現同一個介面和類,方法除了沒有使用synch修飾以外基本一致,不同之處在於最後toString的時候,會直接返回一個新物件。

public String toString() { 
// Create a copy, don’t share the array 
return new String(value, 0, count); 
}

ArrayList 和 LinkedList 有什麼區別。

ArrayList和LinkedList都實現了List介面,有以下的不同點: 

1.ArrayList是基於索引的資料介面。它的底層是陣列。它可以以O(1)時間複雜度對元素進行隨機訪問。以此對應,LinkedList是以元素列表的形式儲存的資料,每一個元素都和它的前一個後一個元素連結在一起,在這種情況下,查詢某個元素的時間複雜度是O(n)。 

2.相對於ArrayList,LinkedList的插入,新增,刪除操作速度更快,因為當元素被新增到集合任意位置的時候,不需要像陣列那樣重新計算大小或者是更新索引。

3.LinkedList比ArrayList更佔記憶體,因為LinkedList為每一個節點儲存了兩個引用,一個指向前一個元素,一個指向下一個元素。

 

講講類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,當 new 的時候, 他們的執行順序。

父類靜態代變數、 
父類靜態程式碼塊、 
子類靜態變數、 
子類靜態程式碼塊、

父類非靜態變數(父類例項成員變數)、 
父類建構函式、 
子類非靜態變數(子類例項成員變數)、 
子類建構函式。

用過哪些 Map 類,都有什麼區別,HashMap 是執行緒安全的嗎,併發下使用的 Map 是什麼,他們內部原理分別是什麼,比如儲存方式, hashcode,擴容, 預設容量等。

hashMap是執行緒不安全的,HashMap是陣列+連結串列+紅黑樹(JDK1.8增加了紅黑樹部分)實現的,採用雜湊表來儲存的,

參照該連結:http://www.wityx.com/post/466_1_1.html

JAVA8 的 ConcurrentHashMap 為什麼放棄了分段鎖,有什麼問題嗎,如果你來設計,你如何設計。

有沒有順序的Map實現類,如果有,他們是怎麼保證有序的。

TreeMap和LinkedHashMap是有序的(TreeMap預設升序,LinkedHashMap則記錄了插入順序)。

參照:http://www.wityx.com/post/456_1_1.html

抽象類和介面的區別,類可以繼承多個類麼,介面可以繼承多個介面麼,類可以實現多個介面麼。

1、抽象類和介面都不能直接例項化,如果要例項化,抽象類變數必須指向實現所有抽象方法的子類物件,介面變數必須指向實現所有介面方法的類物件。 

2、抽象類要被子類繼承,介面要被類實現。  

3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現 

4、接口裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。 

5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該        類也只能為抽象類。 

6、抽象方法只能申明,不能實現。abstract void abc();不能寫成abstract void abc(){}。 

7、抽象類裡可以沒有抽象方法 。

8、如果一個類裡有抽象方法,那麼這個類只能是抽象類 。

9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。 

10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。

 

繼承和聚合的區別在哪。

繼承指的是一個類(稱為子類、子類介面)繼承另外一個類(稱為父類、父介面)的功能,並可以增加它自己的新功能,繼承是類與類或者介面之間最常見的關係。在java中此類關係通過關鍵字exetents明確標識,在設計時候一般沒有爭議性。