java基礎知識總結21-30

21.Iterator和ListIterator的區別是什么?

下面列出了他們的區別:

Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。

Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以后向。

ListIterator實現了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個和后一個元素的索引,等等。


22.快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什么?

一:快速失敗(fail—fast)

在用迭代器遍歷一個集合對象時,如果遍歷過程中對集合對象的內容進行了修改(增加、刪除、修改),則會拋出Concurrent Modification Exception。

原理:迭代器在遍歷時直接訪問集合中的內容,并且在遍歷過程中使用一個

? ? ? ? modCount 變量。集合在被遍歷期間如果內容發生變化,就會改變modCount的值。每當迭代器使用hashNext()/next()遍歷下一個元素之前,都會檢測modCount變量是否為expectedmodCount值,是的話就返回遍歷;否則拋出異常,終止遍歷。

????? 注意:這里異常的拋出條件是檢測到 modCount!=expectedmodCount 這個條件。如果集合發生變化時修改modCount值剛好又設置為了expectedmodCount值,則異常不會拋出。因此,不能依賴于這個異常是否拋出而進行并發操作的編程,這個異常只建議用于檢測并發修改的bug。

????? 場景:java.util包下的集合類都是快速失敗的,不能在多線程下發生并發修改(迭代過程中被修改)。

??? 二:安全失敗(fail—safe)

????? 采用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先復制原有集合內容,在拷貝的集合上進行遍歷。

原理:由于迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改并不能被迭代器檢測到,所以不會觸發Concurrent Modification Exception。

缺點:基于拷貝內容的優點是避免了Concurrent Modification Exception,但同樣地,迭代器并不能訪問到修改后的內容,即:迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝,在遍歷期間原集合發生的修改迭代器是不知道的。

? 場景:java.util.concurrent包下的容器都是安全失敗,可以在多線程下并發使用,并發修改。

23.Java中的HashMap的工作原理是什么?http://www.cnblogs.com/chengxiao/p/6059914.html

Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然后把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。

為什么hashmap不安全?http://www.importnew.com/22011.html

24.hashCode()和equals()方法的重要性體現在什么地方?

HashMap的很多函數要基于equal()函數和hashCode()函數。hashCode()用來定位要存放的位置,equal()用來判斷是否相等

那么,相等的概念是什么?

Object版本的equal只是簡單地判斷是不是同一個實例。但是有的時候,我們想要的的是邏輯上的相等。比如有一個學生類student,有一個屬性studentID,只要studentID相等,不是同一個實例我們也認為是同一學生。當我們認為判定equals的相等應該是邏輯上的相等而不是只是判斷是不是內存中的同一個東西的時候,就需要重寫equal()。而涉及到HashMap的時候,重寫了equals(),就需要重寫hashCode()

我們總結一下幾條基本原則

1. 同一個對象(沒有發生過修改)無論何時調用hashCode()得到的返回值必須一樣。

如果一個key對象在put的時候調用hashCode()決定了存放的位置,而在get的時候調用hashCode()得到了不一樣的返回值,這個值映射到了一個和原來不一樣的地方,那么肯定就找不到原來那個鍵值對了。

2. hashCode()的返回值相等的對象不一定相等,通過hashCode()和equals()必須能唯一確定一個對象

不相等的對象的hashCode()的結果可以相等。hashCode()在注意關注碰撞問題的時候,也要關注生成速度問題,完美hash不現實

3. 一旦重寫了equals()函數(重寫equals的時候還要注意要滿足自反性、對稱性、傳遞性、一致性),就必須重寫hashCode()函數。而且hashCode()的生成哈希值的依據應該是equals()中用來比較是否相等的字段

如果兩個由equals()規定相等的對象生成的hashCode不等,對于hashMap來說,他們很可能分別映射到不同位置,沒有調用equals()比較是否相等的機會,兩個實際上相等的對象可能被插入不同位置,出現錯誤。其他一些基于哈希方法的集合類可能也會有這個問題

25.HashMap和Hashtable有什么區別?

HashMap和Hashtable都實現了Map接口,因此很多特性非常相似。但是,他們有以下不同點:

HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。

Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環境,而Hashtable適合于多線程環境。

HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。

一般認為Hashtable是一個遺留的類。

26.數組(Array)和列表(ArrayList)有什么區別?什么時候應該使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同點:

Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。

Array大小是固定的,ArrayList的大小是動態變化的。

ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

對于基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

27.ArrayList和LinkedList有什么區別?

ArrayList和LinkedList都實現了List接口,他們有以下的不同點:

ArrayList是基于索引的數據接口,它的底層是數組。它可以以O(1)時間復雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是O(n)。

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

LinkedList比ArrayList更占內存,因為LinkedList為每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。

也可以參考ArrayList vs. LinkedList。

28.Comparable和Comparator接口是干什么的?列出它們的區別。

Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明已經存在的對象小于,等于,大于輸入對象。

Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小于,等于,大于第二個參數。equals()方法需要一個對象作為參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator并且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。

29.什么是Java優先級隊列(Priority Queue)?

PriorityQueue是一個基于優先級堆的無界隊列,它的元素是按照自然順序(natural order)排序的。在創建的時候,我們可以給它提供一個負責給元素排序的比較器。PriorityQueue不允許null值,因為他們沒有自然順序,或者說他們沒有任何的相關聯的比較器。最后,PriorityQueue不是線程安全的,入隊和出隊的時間復雜度是O(log(n))。深入理解Java PriorityQueue - CarpenterLee - 博客園

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374