2018java多线程面试题_2018JAVA面试题附答案
JAVA基礎(chǔ)
1.JAVA中的幾種基本類型,各占用多少字節(jié)?
2.String能被繼承嗎?為什么?
不可以,因?yàn)镾tring類有final修飾符,而final不能被繼承的,實(shí)現(xiàn)細(xì)節(jié)不允許改變。平常我們定義的String str = " a ";其實(shí)和String str = new String("a");還是有差異的。
前者默認(rèn)調(diào)用的String.valueof來返回String的實(shí)例對(duì)象,至于調(diào)用哪個(gè)則取決于你的賦值,比如String num = 1;調(diào)用的是public static String valueOf(int i){
return?Integer.toString(i);
}
后者則是調(diào)用如下部分:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
最后我們的變量都存儲(chǔ)在一個(gè)char數(shù)組中。
private final char value[];
3.String, Stringbuffer, StringBuilder 的區(qū)別。
String 字符串常量(final修飾,不可被繼承),String是常量,當(dāng)創(chuàng)建之后即不能更改。(可以通過StringBuffer和StringBuilder創(chuàng)建String對(duì)象(常用的兩個(gè)字符串操作類)。)
StringBuffer 字符串變量(線程安全),其也是final類別的,不允許被繼承,其中的絕大多數(shù)方法都進(jìn)行了同步處理,包括常用的Append方法也做了同步處理。其自jdk1.0起就已經(jīng)出現(xiàn)。其toString方法會(huì)進(jìn)行對(duì)象緩存,以減少元素的復(fù)制開銷。
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 字符串變量,(非線程安全)其自jdk1.5起開始出現(xiàn)。與StringBuffer一樣都繼承和實(shí)現(xiàn)同一個(gè)接口和類,方法除了沒有使用synch修飾以外基本一致,不同之處在于最后toString的時(shí)候,會(huì)直接返回一個(gè)新對(duì)象。
public String toString() {
// Create a copy, don’t share the array
return new String(value, 0, count);
}
4.ArrayList 和 LinkedList 有什么區(qū)別。
ArrayList和LinkedList都實(shí)現(xiàn)了List接口,有以下的不同點(diǎn):
1.ArrayList是基于索引的數(shù)據(jù)接口。它的底層是數(shù)組。它可以以O(shè)(1)時(shí)間復(fù)雜度對(duì)元素進(jìn)行隨機(jī)訪問。以此對(duì)應(yīng),LinkedList是以元素列表的形式存儲(chǔ)的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)后一個(gè)元素鏈接在一起,在這種情況下,查找某個(gè)元素的時(shí)間復(fù)雜度是O(n)。
2.相對(duì)于ArrayList,LinkedList的插入,添加,刪除操作速度更快,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引。
3.LinkedList比ArrayList更占內(nèi)存,因?yàn)長(zhǎng)inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。
5.講講類的實(shí)例化順序,比如父類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,子類靜態(tài)數(shù)據(jù),構(gòu)造函數(shù),字段,當(dāng) new 的時(shí)候, 他們的執(zhí)行順序。
父類靜態(tài)代變量、
父類靜態(tài)代碼塊、
子類靜態(tài)變量、
子類靜態(tài)代碼塊、
父類非靜態(tài)變量(父類實(shí)例成員變量)、
父類構(gòu)造函數(shù)、
子類非靜態(tài)變量(子類實(shí)例成員變量)、
子類構(gòu)造函數(shù)。
6.用過哪些 Map 類,都有什么區(qū)別,HashMap 是線程安全的嗎,并發(fā)下使用的 Map 是什么,他們內(nèi)部原理分別是什么,比如存儲(chǔ)方式, hashcode,擴(kuò)容, 默認(rèn)容量等。
hashMap是線程不安全的,HashMap是數(shù)組+鏈表+紅黑樹(JDK1.8增加了紅黑樹部分)實(shí)現(xiàn)的,采用哈希表來存儲(chǔ)的,
JAVA8 的 ConcurrentHashMap 為什么放棄了分段鎖,有什么問題嗎,如果你來設(shè)計(jì),你如何設(shè)計(jì)。
有沒有順序的Map實(shí)現(xiàn)類,如果有,他們是怎么保證有序的。
TreeMap和LinkedHashMap是有序的(TreeMap默認(rèn)升序,LinkedHashMap則記錄了插入順序)。
7.抽象類和接口的區(qū)別,類可以繼承多個(gè)類么,接口可以繼承多個(gè)接口么,類可以實(shí)現(xiàn)多個(gè)接口么。
1、抽象類和接口都不能直接實(shí)例化,如果要實(shí)例化,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對(duì)象,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對(duì)象。
2、抽象類要被子類繼承,接口要被類實(shí)現(xiàn)。
3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實(shí)現(xiàn)
4、接口里定義的變量只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量。
5、抽象類里的抽象方法必須全部被子類所實(shí)現(xiàn),如果子類不能全部實(shí)現(xiàn)父類抽象方法,那么該子類只能是抽象類。同樣,一個(gè)實(shí)現(xiàn)接口的時(shí)候,如不能全部實(shí)現(xiàn)接口方法,那么該 ? ? ? ?類也只能為抽象類。
6、抽象方法只能申明,不能實(shí)現(xiàn)。abstract void abc();不能寫成abstract void abc(){}。
7、抽象類里可以沒有抽象方法 。
8、如果一個(gè)類里有抽象方法,那么這個(gè)類只能是抽象類 。
9、抽象方法要被實(shí)現(xiàn),所以不能是靜態(tài)的,也不能是私有的。
10、接口可繼承接口,并可多繼承接口,但類只能單根繼承。
8.繼承和聚合的區(qū)別在哪。
繼承指的是一個(gè)類(稱為子類、子類接口)繼承另外一個(gè)類(稱為父類、父接口)的功能,并可以增加它自己的新功能,繼承是類與類或者接口之間最常見的關(guān)系。在java中此類關(guān)系通過關(guān)鍵字exetents明確標(biāo)識(shí),在設(shè)計(jì)時(shí)候一般沒有爭(zhēng)議性。
總結(jié)
以上是生活随笔為你收集整理的2018java多线程面试题_2018JAVA面试题附答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中参数存储_Java中函数参数传
- 下一篇: java url特殊字符处理_简单实例处