Hashtable,HashMap,TreeMap有什麼區別?Vector,ArrayList,LinkedList有什麼區別?int和Integer有什麼區別?

接着上篇繼續更新。html

/*請尊重做者勞動成果,轉載請標明原文連接:*/java

/* http://www.javashuo.com/article/p-mejzzbml-ga.html* /編程

題目一:Hashtable,HashMap,TreeMap有什麼區別?數組

通常回答:
Hashtable 是早期 Java 類庫提供的一個哈希表實現,自己是同步的,不支持 null 鍵和值,因爲同步致使的性能開銷,因此已經不多被推薦使用。
HashMap 是應用更加普遍的哈希表實現,行爲上大體上與 HashTable 一致,主要區別在於 HashMap 不是同步的,支持 null 鍵和值等。一般狀況下,HashMap 進行 put 或者 get 操做,能夠達到常數時間的性能,因此它是絕大部分利用鍵值對存取場景的首選,好比,實現一個用戶 ID 和用戶信息對應的運行時存儲結構。
TreeMap 則是基於紅黑樹的一種提供順序訪問的 Map,和 HashMap 不一樣,它的 get、put、remove 之類操做都是 O(log(n))的時間複雜度,具體順序能夠由指定的 Comparator 來決定,或者根據鍵的天然順序來判斷。
 
擴展一下,看看JAVA集合的全集。
上述類圖中,實線邊框的是實現類,好比ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,好比AbstractCollection,AbstractList,AbstractMap等,而點線邊框的是接口,好比Collection,Iterator,List等。
發現一個特色,上述全部的集合類,都實現了Iterator接口,這是一個用於遍歷集合中元素的接口,主要包含hashNext(),next(),remove()三種方法。它的一個子接口LinkedIterator在它的基礎上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說若是是先Iterator接口,那麼在遍歷集合中元素的時候,只能日後遍歷,被遍歷後的元素不會在遍歷到,一般無序集合實現的都是這個接口,好比HashSet,HashMap;而那些元素有序的集合,實現的通常都是LinkedIterator接口,實現這個接口的集合能夠雙向遍歷,既能夠經過next()訪問下一個元素,又能夠經過previous()訪問前一個元素,好比ArrayList。
還有一個特色就是抽象類的使用。若是要本身實現一個集合類,去實現那些抽象的接口會很是麻煩,工做量很大。這個時候就可使用抽象類,這些抽象類中給咱們提供了許多現成的實現,咱們只須要根據本身的需求重寫一些方法或者添加一些方法就能夠實現本身須要的集合類,工做流昂大大下降。

題目二:Vector,ArrayList,LinkedList有什麼區別?緩存

通常回答:
Vector 是 Java 早期提供的線程安全的動態數組,若是不須要線程安全,並不建議選擇,畢竟同步是有額外開銷的。Vector 內部是使用對象數組來保存數據,能夠根據須要自動的增長容量,當數組已滿時,會建立新的數組,並拷貝原有數組數據。
ArrayList 是應用更加普遍的動態數組實現,它自己不是線程安全的,因此性能要好不少。與 Vector 近似,ArrayList 也是能夠根據須要調整容量,不過二者的調整邏輯有所區別,Vector 在擴容時會提升 1 倍,而 ArrayList 則是增長 50%。
LinkedList 顧名思義是 Java 提供的雙向鏈表,因此它不須要像上面兩種那樣調整容量,它也不是線程安全的。
 
繼續擴展一下,仍是先看上題中的集合框架圖。
咱們能夠看到 Java 的集合框架,Collection 接口是全部集合的根,而後擴展開提供了三大類集合,分別是:
List,也就是咱們前面介紹最多的有序集合,它提供了方便的訪問、插入、刪除等操做。
Set,Set 是不容許重複元素的,這是和 List 最明顯的區別,也就是不存在兩個對象 equals 返回 true。咱們在平常開發中有不少須要保證元素惟一性的場合。
Queue/Deque,則是 Java 提供的標準隊列結構的實現,除了集合的基本功能,它還支持相似先入先出(FIFO, First-in-First-Out)或者後入先出(LIFO,Last-In-First-Out)等特定行爲。這裏不包括 BlockingQueue,由於一般是併發編程場合,因此被放置在併發包裏。
每種集合的通用邏輯,都被抽象到相應的抽象類之中,好比 AbstractList 就集中了各類 List 操做的通用部分。這些集合不是徹底孤立的,好比,LinkedList 自己,既是 List,也是 Deque 哦。
若是閱讀過更多源碼,你會發現,其實,TreeSet 代碼裏實際默認是利用 TreeMap 實現的,Java 類庫建立了一個 Dummy 對象「PRESENT」做爲 value,而後全部插入的元素實際上是以鍵的形式放入了 TreeMap 裏面;同理,HashSet 其實也是以 HashMap 爲基礎實現的,原來他們只是 Map 類的馬甲!

題目三:int和Integer有什麼區別?安全

通常回答:
int 是咱們常說的整形數字,是 Java 的 8 個原始數據類型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。 Java 語言雖然號稱一切都是對象,但原始數據類型是例外。
Integer 是 int 對應的包裝類,它有一個 int 類型的字段存儲數據,而且提供了基本操做,好比數學運算、int 和字符串之間轉換等。在 Java 5 中,引入了自動裝箱和自動拆箱功能(boxing/unboxing),Java 能夠根據上下文,自動進行轉換,極大地簡化了相關編程。
 
擴展:
這裏很容易就想到裝箱和拆箱。 裝箱就是自動將基本數據類型轉換爲包裝器類型;拆箱就是自動將包裝器類型轉換爲基本數據類型。
這個過程是自動執行的,那麼咱們須要看看它的執行過程:
public class Main {
public static void main(String[] args) {
//自動裝箱
Integer total = 99;
//自定拆箱
int totalprim = total;
}
}

反編譯class文件以後獲得以下內容:併發

javap -c StringTest
Integer total = 99; 
執行上面那句代碼的時候,系統爲咱們執行了: 
Integer total = Integer.valueOf(99);
int totalprim = total; 
執行上面那句代碼的時候,系統爲咱們執行了: 
int totalprim = total.intValue();
那麼何時會進行封箱拆箱呢?
當一個基礎數據類型與封裝類進行==、+、-、*、/運算時,會將封裝類進行拆箱,對基礎數據類型進行運算。
須要注意的是:
1. 裝箱操做會建立對象,頻繁的裝箱操做會消耗許多內存,影響性能,因此能夠避免裝箱的時候應該儘可能避免。
2.自動拆箱實際是jvm 調用了 intValue 方法,因此性能上不會有影響。
3.除double 和float 兩種類型之外,其餘基本類型入Integer值 在 -128 ~ 127之間時不會新建一個Integer 對象而是從緩存中獲取。因此在作 == 判斷時 要注意值得大小,若是超過範圍,則兩個值 雖然同樣但  == 比較的結果會是FALSE。
4.Integer 類型的比較最好用 compare 。
5.比較二者(int 與 Integer變量) 時,能夠用拆箱 (用intValue方法),沒影響的。
相關文章
相關標籤/搜索