2018JAVA面試題附答案

JAVA基礎

JAVA中的幾種基本類型,各佔用多少字節?

String能被繼承嗎?爲何?

不能夠,由於String類有final修飾符,而final不能被繼承的,實現細節不容許改變。日常咱們定義的String str = " a ";其實和String str = new String("a");仍是有差別的。java

前者默認調用的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數組中。ui

private final char value[];this

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增長了紅黑樹部分)實現的,採用哈希表來存儲的,

參照該連接:https://zhuanlan.zhihu.com/p/21673805 

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

參照:https://yq.aliyun.com/articles/36781

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

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

參照:http://uule.iteye.com/blog/1522291

抽象類和接口的區別,類能夠繼承多個類麼,接口能夠繼承多個接口麼,類能夠實現多個接口麼。

一、抽象類和接口都不能直接實例化,若是要實例化,抽象類變量必須指向實現全部抽象方法的子類對象,接口變量必須指向實現全部接口方法的類對象。 

二、抽象類要被子類繼承,接口要被類實現。  

三、接口只能作方法申明,抽象類中能夠作方法申明,也能夠作方法實現 

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

五、抽象類裏的抽象方法必須所有被子類所實現,若是子類不能所有實現父類抽象方法,那麼該子類只能是抽象類。一樣,一個實現接口的時候,如不能所有實現接口方法,那麼該        類也只能爲抽象類。 

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

七、抽象類裏能夠沒有抽象方法 。

八、若是一個類裏有抽象方法,那麼這個類只能是抽象類 。

九、抽象方法要被實現,因此不能是靜態的,也不能是私有的。 

十、接口可繼承接口,並可多繼承接口,但類只能單根繼承。

 

繼承和聚合的區別在哪。

繼承指的是一個類(稱爲子類、子類接口)繼承另一個類(稱爲父類、父接口)的功能,並能夠增長它本身的新功能,繼承是類與類或者接口之間最多見的關係。在java中此類關係經過關鍵字exetents明確標識,在設計時候通常沒有爭議性。

相關文章
相關標籤/搜索