【庫(kù)學(xué)科技】32道常見的Java基礎(chǔ)面試題

內(nèi)容整理自網(wǎng)上。

1.什么是 Java 虛擬機(jī)(JVM)丑瞧?為什么 Java 被稱作是“平臺(tái)無(wú)關(guān)的編程語(yǔ)言”趾痘?

Java 虛擬機(jī)是一個(gè)可以執(zhí)行 Java 字節(jié)碼的虛擬機(jī)進(jìn)程。Java 源文件被編譯成能被 Java 虛擬機(jī)執(zhí)行的字節(jié)碼文件。

Java 被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái)姿现,而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫或者是重新編譯肠仪。Java 虛擬機(jī)讓這個(gè)變?yōu)榭赡埽驗(yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性备典。

2.JDK异旧、JRE、JVM 分別是什么關(guān)系提佣?

JDK 即為 Java 開發(fā)工具包吮蛹,包含編寫 Java 程序所必須的編譯、運(yùn)行等開發(fā)工具以及 JRE拌屏。開發(fā)工具如:用于編譯 Java 程序的 javac 命令潮针、用于啟動(dòng) JVM 運(yùn)行 Java 程序的 Java 命令、用于生成文檔的 Javadoc 命令以及用于打包的 jar 命令等等倚喂。

JRE 即為 Java 運(yùn)行環(huán)境每篷,提供了運(yùn)行 Java 應(yīng)用程序所必須的軟件環(huán)境,包含有 Java 虛擬機(jī)(JVM)和豐富的系統(tǒng)類庫(kù)端圈。系統(tǒng)類庫(kù)即為 Java 提前封裝好的功能類焦读,只需拿來(lái)直接使用即可,可以大大的提高開發(fā)效率舱权。

JVM 即為 Java 虛擬機(jī)矗晃,提供了字節(jié)碼文件(.class)的運(yùn)行環(huán)境支持。 簡(jiǎn)單說(shuō)宴倍,就是 JDK 包含 JRE 包含 JVM张症。

3.Java 支持的數(shù)據(jù)類型有哪些?

Java 支持的數(shù)據(jù)類型包括基本數(shù)據(jù)類型和引用類型鸵贬∷姿基本數(shù)據(jù)類型如下。 整數(shù)值型:byte恭理,short拯辙,int,long
字符型:char
浮點(diǎn)類型:float颜价,double
布爾型:boolean
整數(shù)默認(rèn) int 型涯保,小數(shù)默認(rèn)是 double 型。Float 和 long 類型的必須加后綴周伦。比如 float f = 100f夕春。

首先知道 String 是引用類型不是基本類型,引用類型聲明的變量是指該變量在內(nèi)存中實(shí)際存儲(chǔ)的是一個(gè)引用地址专挪,實(shí)體在堆中及志。引用類型包括類片排、接口、數(shù)組等速侈。String 類還是 final 修飾的率寡。

4.什么是自動(dòng)拆裝箱?

自動(dòng)裝箱和拆箱就是基本類型和引用類型之間的轉(zhuǎn)換倚搬,至于為什么要轉(zhuǎn)換冶共,因?yàn)榛绢愋娃D(zhuǎn)換為引用類型后,就可以 new 對(duì)象每界,從而調(diào)用包裝類中封裝好的方法進(jìn)行基本類型之間的轉(zhuǎn)換或者 toString(當(dāng)然用類名直接調(diào)用也可以捅僵,便于一眼看出該方法是靜態(tài)的),還有就是如果集合中想存放基本類型眨层,泛型的限定類型只能是對(duì)應(yīng)的包裝類型庙楚。

5.什么是面向?qū)ο螅?/p>

面向?qū)ο笫且环N思想,世間萬(wàn)物都可以看做一個(gè)對(duì)象趴樱,這里只討論面向?qū)ο缶幊蹋∣OP)馒闷,Java 是一個(gè)支持并發(fā)、基于類和面向?qū)ο蟮挠?jì)算機(jī)編程語(yǔ)言叁征,面向?qū)ο筌浖_發(fā)具有以下優(yōu)點(diǎn):代碼開發(fā)模塊化窜司,更易維護(hù)和修改;代碼復(fù)用性強(qiáng)航揉;增強(qiáng)代碼的可靠性和靈活性;增加代碼的可讀性金刁。

6.面向?qū)ο蟮乃拇蠡咎匦裕?/p>

抽象:提取現(xiàn)實(shí)世界中某事物的關(guān)鍵特性帅涂,為該事物構(gòu)建模型的過程。對(duì)同一事物在不同的需求下尤蛮,需要提取的特性可能不一樣媳友。得到的抽象模型中一般包含:屬性(數(shù)據(jù))和操作(行為)。這個(gè)抽象模型我們稱之為類产捞,對(duì)類進(jìn)行實(shí)例化得到對(duì)象醇锚。

封裝:封裝可以使類具有獨(dú)立性和隔離性,保證類的高內(nèi)聚坯临。只暴露給類外部或者子類必須的屬性和操作焊唬。類封裝的實(shí)現(xiàn)依賴類的修飾符(public、protected 和 private 等)看靠。

繼承:對(duì)現(xiàn)有類的一種復(fù)用機(jī)制赶促。一個(gè)類如果繼承現(xiàn)有的類,則這個(gè)類將擁有被繼承類的所有非私有特性(屬性和操作)挟炬。這里指的繼承包含:類的繼承和接口的實(shí)現(xiàn)鸥滨。

多態(tài):多態(tài)是在繼承的基礎(chǔ)上實(shí)現(xiàn)的嗦哆。多態(tài)的三個(gè)要素:繼承、重寫和父類引用指向子類對(duì)象婿滓。父類引用指向不同的子類對(duì)象時(shí)老速,調(diào)用相同的方法,呈現(xiàn)出不同的行為凸主,就是類多態(tài)特性橘券。多態(tài)可以分成編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。

抽象秕铛、封裝约郁、繼承和多態(tài)是面向?qū)ο蟮幕A(chǔ)。

7但两、& 與 && 的區(qū)別鬓梅?

& 運(yùn)算符有兩種用法:(1) 按位與,(2) 邏輯與谨湘。&& 運(yùn)算符是短路與運(yùn)算绽快。

邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運(yùn)算符左右兩端的布爾值都是 true 整個(gè)表達(dá)式的值才是 true紧阔。&& 之所以稱為短路運(yùn)算是因?yàn)榉话眨绻?&& 左邊的表達(dá)式的值是 false,右邊的表達(dá)式會(huì)被直接短路掉擅耽,不會(huì)進(jìn)行運(yùn)算活孩。

很多時(shí)候我們可能都需要用 && 而不是 &,例如在驗(yàn)證用戶登錄時(shí)判定用戶名不是 null 而且不是空字符串乖仇,應(yīng)當(dāng)寫為:

username != null && !username.equals(“”)

二者的順序不能交換憾儒,更不能用 & 運(yùn)算符,因?yàn)榈谝粋€(gè)條件如果不成立乃沙,根本不能進(jìn)行字符串的 equals 比較起趾,否則會(huì)產(chǎn)生 NullPointerException 異常。

注意:邏輯或運(yùn)算符(|)和短路或運(yùn)算符(||)的差別也是如此警儒。

8.什么是值傳遞和引用傳遞训裆?

值傳遞是對(duì)基本型變量而言的,傳遞的是該變量的一個(gè)副本蜀铲,改變副本不影響原變量边琉。

引用傳遞一般是對(duì)于對(duì)象型變量而言的,傳遞的是該對(duì)象地址的一個(gè)副本蝙茶,并不是原對(duì)象本身艺骂。一般認(rèn)為,Java 內(nèi)的傳遞都是值傳遞隆夯,Java 中實(shí)例對(duì)象的傳遞是引用傳遞钳恕。

9.是否可以在 static 環(huán)境中訪問非 static 變量别伏?

static 變量在 Java 中是屬于類的,它在所有的實(shí)例中的值是一樣的忧额。當(dāng)類被 Java 虛擬機(jī)載入的時(shí)候厘肮,會(huì)對(duì) static 變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來(lái)訪問非 static 的變量睦番,編譯器會(huì)報(bào)錯(cuò)类茂,因?yàn)檫@些變量還沒有被創(chuàng)建出來(lái),還沒有跟任何實(shí)例關(guān)聯(lián)上托嚣。

10.Java 中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思巩检?

Java 中的方法重載發(fā)生在同一個(gè)類里面兩個(gè)或者是多個(gè)方法的方法名相同但是參數(shù)不同的情況。與此相對(duì)示启,方法覆蓋是說(shuō)子類重新定義了父類的方法兢哭。方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型夫嗓。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問迟螺。

11,Java 支持多繼承么?

Java 中類不支持多繼承舍咖,只支持單繼承(即一個(gè)類只有一個(gè)父類)矩父。 但是 Java 中的接口支持多繼承,即一個(gè)子接口可以有多個(gè)父接口排霉。(接口的作用是用來(lái)擴(kuò)展對(duì)象的功能窍株,一個(gè)子接口繼承多個(gè)父接口,說(shuō)明子接口擴(kuò)展了多個(gè)功能攻柠,當(dāng)類實(shí)現(xiàn)接口時(shí)夹姥,類就擴(kuò)展了相應(yīng)的功能)。

12.Java 中辙诞,什么是構(gòu)造方法?什么是構(gòu)造方法重載轻抱?什么是復(fù)制構(gòu)造方法飞涂?

當(dāng)新對(duì)象被創(chuàng)建的時(shí)候,構(gòu)造方法會(huì)被調(diào)用祈搜。每一個(gè)類都有構(gòu)造方法较店。在程序員沒有給類提供構(gòu)造方法的情況下,Java 編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造方法容燕。

Java 中構(gòu)造方法重載和方法重載很相似梁呈。可以為一個(gè)類創(chuàng)建多個(gè)構(gòu)造方法蘸秘。每一個(gè)構(gòu)造方法必須有它自己唯一的參數(shù)列表官卡。

Java 不支持像 C++ 中那樣的復(fù)制構(gòu)造方法蝗茁,這個(gè)不同點(diǎn)是因?yàn)槿绻悴蛔约簩憳?gòu)造方法的情況下,Java 不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造方法寻咒。

13.接口和抽象類的區(qū)別是什么哮翘?

從設(shè)計(jì)層面來(lái)說(shuō),抽象是對(duì)類的抽象毛秘,是一種模板設(shè)計(jì)饭寺,接口是行為的抽象,是一種行為的規(guī)范叫挟。

Java 提供和支持創(chuàng)建抽象類和接口艰匙。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于: 接口中所有的方法隱含的都是抽象的抹恳,而抽象類則可以同時(shí)包含抽象和非抽象的方法员凝。

類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類适秩。類可以不實(shí)現(xiàn)抽象類和接口聲明的所有方法绊序,當(dāng)然,在這種情況下秽荞,類也必須得聲明成是抽象的骤公。

抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。 Java 接口中聲明的變量默認(rèn)都是 final 的扬跋。抽象類可以包含非 final 的變量阶捆。Java 接口中的成員函數(shù)默認(rèn)是 public 的。抽象類的成員函數(shù)可以是 private钦听,protected 或者是 public洒试。

接口是絕對(duì)抽象的,不可以被實(shí)例化朴上。抽象類也不可以被實(shí)例化垒棋,但是,如果它包含 main 方法的話是可以被調(diào)用的痪宰。也可以參考 JDK8 中抽象類和接口的區(qū)別叼架。

14.用最有效率的方法計(jì)算 2 乘以 8?

2 << 3(左移3位相當(dāng)于乘以2的3次方衣撬,右移3位相當(dāng)于除以2的3次方)乖订。

15.手寫單例模式(餓漢和懶漢模式)和工廠模式?
餓漢模式
//餓漢式單例類.在類初始化時(shí)具练,已經(jīng)自行實(shí)例化
public class Singleton1 {
//私有的默認(rèn)構(gòu)造子
private Singleton1() {}
//已經(jīng)自行實(shí)例化
private static final Singleton1 single = new Singleton1();
//靜態(tài)工廠方法
public static Singleton1 getInstance() {
return single;
}
} 懶漢模式
//懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗?br> public class Singleton2 {
//私有的默認(rèn)構(gòu)造子
private Singleton2() {}
//注意乍构,這里沒有final
private static Singleton2 single=null;
//靜態(tài)工廠方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
工廠模式,也可以參考之前的設(shè)計(jì)模式中的工廠模式扛点,文末有鏈接哥遮。
interface IFactory{
public IProduct createProduct();
}
Class Factory implements IFactory{
public IProduct createProduct()
{
return new Product();
}
}
Public class client{
Public Static void main (String [] args){
IFactory factory=new Factory();
IProduct product=factory.createProduct();
product.ProductMethod();
}
}

16.String和StringBuilder岂丘、StringBuffer的區(qū)別?

Java 平臺(tái)提供了兩種類型的字符串:String 和 StringBuffer/StringBuilder昔善,它們可以儲(chǔ)存和操作字符串元潘。

其中 String 是只讀字符串,也就意味著 String 引用的字符串內(nèi)容是不能被改變的君仆。

而 StringBuffer/StringBuilder 類表示的字符串對(duì)象可以直接進(jìn)行修改翩概。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法完全相同返咱,區(qū)別在于它是在單線程環(huán)境下使用的钥庇,因?yàn)樗乃蟹矫娑紱]有被 synchronized 修飾,因此它的效率也比 StringBuffer 要高咖摹。

17.Java 集合框架有哪些评姨?說(shuō)出一些集合框架的優(yōu)點(diǎn)?

每種編程語(yǔ)言中都有集合萤晴,最初的 Java 版本包含幾種集合類:Vector吐句、Stack、HashTable 和 Array店读。隨著集合的廣泛使用嗦枢,Java1.2 提出了囊括所有集合接口、實(shí)現(xiàn)和算法的集合框架屯断。在保證線程安全的情況下使用泛型和并發(fā)集合類文虏,Java 已經(jīng)經(jīng)歷了很久。它還包括在 Java 并發(fā)包中殖演,阻塞接口以及它們的實(shí)現(xiàn)氧秘。集合框架的部分優(yōu)點(diǎn)如下: (1)使用核心集合類降低開發(fā)成本,而非實(shí)現(xiàn)我們自己的集合類趴久。 (2)隨著使用經(jīng)過嚴(yán)格測(cè)試的集合框架類丸相,代碼質(zhì)量會(huì)得到提高。 (3)通過使用 JDK 附帶的集合類彼棍,可以降低代碼維護(hù)成本已添。 (4)復(fù)用性和可操作性。

18.集合框架中的泛型有什么優(yōu)點(diǎn)滥酥?

Java1.5 引入了泛型,所有的集合接口和實(shí)現(xiàn)都大量地使用它畦幢。泛型允許我們?yōu)榧咸峁┮粋€(gè)可以容納的對(duì)象類型坎吻。因此,如果你添加其它類型的任何元素宇葱,它會(huì)在編譯時(shí)報(bào)錯(cuò)瘦真。這避免了在運(yùn)行時(shí)出現(xiàn) ClassCastException刊头,因?yàn)槟銓?huì)在編譯時(shí)得到報(bào)錯(cuò)信息。泛型也使得代碼整潔诸尽,我們不需要使用顯式轉(zhuǎn)換和 instanceOf 操作符原杂。它也給運(yùn)行時(shí)帶來(lái)好處,因?yàn)椴粫?huì)產(chǎn)生類型檢查的字節(jié)碼指令您机。

19.Java 集合框架的基礎(chǔ)接口有哪些穿肄?

Collection 為集合層級(jí)的根接口。一個(gè)集合代表一組對(duì)象际看,這些對(duì)象即為它的元素咸产。Java 平臺(tái)不提供這個(gè)接口任何直接的實(shí)現(xiàn)。

Set 是一個(gè)不能包含重復(fù)元素的集合仲闽。這個(gè)接口對(duì)數(shù)學(xué)集合抽象進(jìn)行建模脑溢,被用來(lái)代表集合,就如一副牌赖欣。

List 是一個(gè)有序集合屑彻,可以包含重復(fù)元素。你可以通過它的索引來(lái)訪問任何元素顶吮。List 更像長(zhǎng)度動(dòng)態(tài)變換的數(shù)組社牲。

Map 是一個(gè)將 key 映射到 value 的對(duì)象。一個(gè) Map 不能包含重復(fù)的 key云矫,每個(gè) key 最多只能映射一個(gè) value膳沽。

一些其它的接口有 Queue、Dequeue让禀、SortedSet挑社、SortedMap 和 ListIterator。

20.為何 Collection 不從 Cloneable 和 Serializable 接口繼承巡揍?

Collection 接口指定一組對(duì)象感帅,對(duì)象即為它的元素宗兼。如何維護(hù)這些元素由 Collection 的具體實(shí)現(xiàn)決定。例如,一些如 List 的 Collection 實(shí)現(xiàn)允許重復(fù)的元素争拐,而其它的如 Set 就不允許。很多 Collection 實(shí)現(xiàn)有一個(gè)公有的 clone 方法捕传。然而鬼悠,把它放到集合的所有實(shí)現(xiàn)中也是沒有意義的。這是因?yàn)?Collection 是一個(gè)抽象表現(xiàn)捌木,重要的是實(shí)現(xiàn)油坝。

當(dāng)與具體實(shí)現(xiàn)打交道的時(shí)候,克隆或序列化的語(yǔ)義和含義才發(fā)揮作用。所以澈圈,具體實(shí)現(xiàn)應(yīng)該決定如何對(duì)它進(jìn)行克隆或序列化彬檀,或它是否可以被克隆或序列化。在所有的實(shí)現(xiàn)中授權(quán)克隆和序列化瞬女,最終導(dǎo)致更少的靈活性和更多的限制窍帝,特定的實(shí)現(xiàn)應(yīng)該決定它是否可以被克隆和序列化。

21.為何 Map 接口不繼承 Collection 接口诽偷?

盡管 Map 接口和它的實(shí)現(xiàn)也是集合框架的一部分坤学,但 Map 不是集合,集合也不是 Map渤刃。因此拥峦,Map 繼承 Collection 毫無(wú)意義,反之亦然卖子。

如果 Map 繼承 Collection 接口略号,那么元素去哪兒?Map 包含key-value 對(duì)洋闽,它提供抽取 key 或 value 列表集合的方法玄柠,但是它不適合“一組對(duì)象”規(guī)范。

22.什么是迭代器(Iterator)诫舅?

Iterator 接口提供了很多對(duì)集合元素進(jìn)行迭代的方法羽利。每一個(gè)集合類都包含了可以返回迭代器實(shí)例的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接調(diào)用集合的 remove(Object Obj) 刪除刊懈,可以通過迭代器的 remove() 方法刪除这弧。

23.Iterator 和 ListIterator 的區(qū)別是什么?

Iterator 可用來(lái)遍歷 Set 和 List 集合虚汛,但是 ListIterator 只能用來(lái)遍歷 List匾浪。

Iterator 對(duì)集合只能是前向遍歷,ListIterator 既可以前向也可以后向卷哩。

ListIterator 實(shí)現(xiàn)了 Iterator 接口蛋辈,并包含其他的功能。比如:增加元素将谊,替換元素冷溶,獲取前一個(gè)和后一個(gè)元素的索引等等。

24.Java 中的 HashMap 的工作原理是什么尊浓?

我們知道在 Java 中最常用的兩種結(jié)構(gòu)是數(shù)組和模擬指針(引用)逞频,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都可以利用這兩種來(lái)組合實(shí)現(xiàn),HashMap 也是如此栋齿。實(shí)際上 HashMap 是一個(gè)“鏈表散列”苗胀。

HashMap 是基于 hashing 的原理托酸,我們使用 put(key, value) 存儲(chǔ)對(duì)象到 HashMap 中,使用 get(key) 從 HashMap 中獲取對(duì)象柒巫。當(dāng)我們給 put() 方法傳遞鍵和值時(shí),我們先對(duì)鍵調(diào)用 hashCode() 方法谷丸,返回的 hashCode 用于找到 bucket 位置來(lái)儲(chǔ)存 Entry 對(duì)象堡掏。

25.當(dāng)兩個(gè)對(duì)象的 hashcode 相同會(huì)發(fā)生什么?

因?yàn)?hashcode 相同刨疼,所以它們的 bucket 位置相同泉唁,“碰撞”會(huì)發(fā)生。因?yàn)?HashMap 使用鏈表存儲(chǔ)對(duì)象揩慕,這個(gè) Entry(包含有鍵值對(duì)的 Map.Entry 對(duì)象)會(huì)存儲(chǔ)在鏈表中亭畜。

26.如果兩個(gè)鍵的 hashcode 相同,你如何獲取值對(duì)象迎卤?

當(dāng)我們調(diào)用 get() 方法拴鸵,HashMap 會(huì)使用鍵對(duì)象的 hashcode 找到 bucket 位置,然后會(huì)調(diào)用 keys.equals() 方法去找到鏈表中正確的節(jié)點(diǎn)蜗搔,最終找到要找的值對(duì)象劲藐。

27.hashCode() 和 equals() 方法有何重要性?

HashMap 使用 Key 對(duì)象的 hashCode() 和 equals() 方法去決定 key-value 對(duì)的索引樟凄。當(dāng)我們?cè)囍鴱?HashMap 中獲取值的時(shí)候聘芜,這些方法也會(huì)被用到。

如果這些方法沒有被正確地實(shí)現(xiàn)缝龄,在這種情況下汰现,兩個(gè)不同 Key 也許會(huì)產(chǎn)生相同的 hashCode() 和 equals() 輸出,HashMap 將會(huì)認(rèn)為它們是相同的叔壤,然后覆蓋它們瞎饲,而非把它們存儲(chǔ)到不同的地方。

同樣的百新,所有不允許存儲(chǔ)重復(fù)數(shù)據(jù)的集合類都使用 hashCode() 和 equals() 去查找重復(fù)企软,所以正確實(shí)現(xiàn)它們非常重要。equals() 和 hashCode() 的實(shí)現(xiàn)應(yīng)該遵循以下規(guī)則:

如果 o1.equals(o2)饭望,那么o1.hashCode() == o2.hashCode()總是為true的仗哨。 如果 o1.hashCode() == o2.hashCode(),并不意味著o1.equals(o2)會(huì)為true铅辞。

28.HashMap 和 HashTable 有什么區(qū)別厌漂?

HashMap 是非線程安全的,HashTable 是線程安全的斟珊。
HashMap 的鍵和值都允許有 null 值存在苇倡,而 HashTable 則不行。
因?yàn)榫€程安全的問題,HashMap 效率比 HashTable 的要高旨椒。
HashTable 是同步的晓褪,而 HashMap 不是。因此综慎,HashMap 更適合于單線程環(huán)境涣仿,而 HashTable 適合于多線程環(huán)境。
一般現(xiàn)在不建議用 HashTable示惊,一是 HashTable 是遺留類好港,內(nèi)部實(shí)現(xiàn)很多沒優(yōu)化和冗余。二是即使在多線程環(huán)境下米罚,現(xiàn)在也有同步的 ConcurrentHashMap 替代钧汹,沒有必要因?yàn)槭嵌嗑€程而用 HashTable。

29.如何決定選用 HashMap 還是 TreeMap录择?

對(duì)于在 Map 中插入拔莱、刪除和定位元素這類操作,HashMap 是最好的選擇糊肠。然而辨宠,假如你需要對(duì)一個(gè)有序的 key 集合進(jìn)行遍歷, TreeMap 是更好的選擇货裹∴托危基于你的 collection 的大小,也許向 HashMap 中添加元素會(huì)更快弧圆,將 map 換為 TreeMap 進(jìn)行有序 key 的遍歷赋兵。

30.ArrayList 和 Vector 有何異同點(diǎn)?

ArrayList 和 Vector 在很多時(shí)候都很類似搔预。
(1)兩者都是基于索引的霹期,內(nèi)部由一個(gè)數(shù)組支持。
(2)兩者維護(hù)插入的順序拯田,我們可以根據(jù)插入順序來(lái)獲取元素历造。
(3)ArrayList 和 Vector 的迭代器實(shí)現(xiàn)都是 fail-fast 的。
(4)ArrayList 和 Vector 兩者允許 null 值船庇,也可以使用索引值對(duì)元素進(jìn)行隨機(jī)訪問吭产。
以下是ArrayList和Vector的不同點(diǎn)。
(1)Vector 是同步的鸭轮,而 ArrayList 不是臣淤。然而,如果你尋求在迭代的時(shí)候?qū)α斜磉M(jìn)行改變窃爷,你應(yīng)該使用 CopyOnWriteArrayList邑蒋。
(2)ArrayList 比 Vector 快姓蜂,它因?yàn)橛型剑粫?huì)過載医吊。
(3)ArrayList 更加通用钱慢,因?yàn)槲覀兛梢允褂?Collections 工具類輕易地獲取同步列表和只讀列表。

31.Array 和 ArrayList 有何區(qū)別卿堂?什么時(shí)候更適合用 Array滩字?

Array 可以容納基本類型和對(duì)象,而 ArrayList 只能容納對(duì)象御吞。 Array 是指定大小的,而 ArrayList 大小是固定的漓藕。Array 沒有提供 ArrayList 那么多功能陶珠,比如 addAll、removeAll 和 iterator 等享钞。盡管 ArrayList 明顯是更好的選擇揍诽,但也有些時(shí)候 Array 比較好用,比如下面的三種情況栗竖。
(1)如果列表的大小已經(jīng)指定暑脆,大部分情況下是存儲(chǔ)和遍歷它們。
(2)對(duì)于遍歷基本數(shù)據(jù)類型狐肢,盡管 Collections 使用自動(dòng)裝箱來(lái)減輕編碼任務(wù)添吗,在指定大小的基本類型的列表上工作也會(huì)變得很慢。
(3)如果你要使用多維數(shù)組份名,使用 [][] 比 List碟联。

32.快速失敗(fail-fast)和安全失斀┫佟(fail-safe)的區(qū)別是什么鲤孵?

快速失敗:當(dāng)你在迭代一個(gè)集合的時(shí)候辰如,如果有另一個(gè)線程正在修改你正在訪問的那個(gè)集合時(shí)普监,就會(huì)拋出一個(gè) ConcurrentModification 異常。 在 java.util 包下的都是快速失敗琉兜。

安全失斂:你在迭代的時(shí)候會(huì)去底層集合做一個(gè)拷貝,所以你在修改上層集合的時(shí)候是不會(huì)受影響的呕童,不會(huì)拋出 ConcurrentModification 異常漆际。在java.util.concurrent 包下的全是安全失敗的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夺饲,一起剝皮案震驚了整個(gè)濱河市奸汇,隨后出現(xiàn)的幾起案子施符,更是在濱河造成了極大的恐慌,老刑警劉巖擂找,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戳吝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贯涎,警方通過查閱死者的電腦和手機(jī)听哭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)塘雳,“玉大人陆盘,你說(shuō)我怎么就攤上這事“苊鳎” “怎么了隘马?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妻顶。 經(jīng)常有香客問我酸员,道長(zhǎng),這世上最難降的妖魔是什么讳嘱? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任幔嗦,我火速辦了婚禮,結(jié)果婚禮上沥潭,老公的妹妹穿的比我還像新娘邀泉。我一直安慰自己,他們只是感情好钝鸽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布呼渣。 她就那樣靜靜地躺著,像睡著了一般寞埠。 火紅的嫁衣襯著肌膚如雪屁置。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天仁连,我揣著相機(jī)與錄音蓝角,去河邊找鬼。 笑死饭冬,一個(gè)胖子當(dāng)著我的面吹牛使鹅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昌抠,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼患朱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炊苫?” 一聲冷哼從身側(cè)響起裁厅,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冰沙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后执虹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓挥,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年袋励,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侥啤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茬故,死狀恐怖盖灸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情磺芭,我是刑警寧澤糠雨,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站徘跪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琅攘。R本人自食惡果不足惜垮庐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坞琴。 院中可真熱鬧哨查,春花似錦、人聲如沸剧辐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荧关。三九已至溉奕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忍啤,已是汗流浹背加勤。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留同波,地道東北人鳄梅。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像未檩,于是被迫代替她去往敵國(guó)和親戴尸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355