1. 程式人生 > >ArrayList和Vector的區別,HashMap和Hashtable的區別以及執行緒安全的理解

ArrayList和Vector的區別,HashMap和Hashtable的區別以及執行緒安全的理解

就ArrayList與Vector主要從二方面來說.

一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的

二.資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的一半

就HashMap與HashTable主要從三方面來說。

一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現

二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的

三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

什麼是執行緒安全?

   如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。

  或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。

舉例

比如一個 ArrayList 類,在新增一個元素的時候,它可能會有兩步來完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

  在單執行緒執行的情況下,如果 Size = 0,新增一個元素後,此元素在位置 0,而且 Size=1;

  而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 A 先將元素存放在位置 0。但是此時 CPU 排程執行緒A暫停,執行緒 B 得到執行的機會。執行緒B也向此 ArrayList 新增元素,因為此時 Size 仍然等於 0 (注意哦,我們假設的是新增一個元素是要兩個步驟哦,而執行緒A僅僅完成了步驟1),所以執行緒B也將元素存放在位置0。然後執行緒A和執行緒B都繼續執行,都增加 Size 的值。

  那好,現在我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等於 2。這就是“執行緒不安全”了。

相關推薦

JDK7JDK8中HashMap的資料結構以及執行安全無序

JDK7中HashMap實現jdk7中HashMap的資料結構是陣列+連結串列來實現的,底層維護著一個數組,每個陣列項是一個Entry;transient Entry<K,V>[] table;static class Entry<K,V> imple

ArrayListVector區別,HashMapHashtable區別以及執行安全理解

就ArrayList與Vector主要從二方面來說. 一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 二.資料增長:當需要增長時,Vector預設增長為原來一培,而ArrayList卻是原來的

ArrayListVector區別,HashMapHashtable區別以及執行安全理解【轉】

http://www.cnblogs.com/xionglee/articles/1554701.html 就ArrayList與Vector主要從二方面來說. 一.同步性:Vector是執行緒安全的,也就是說是同步的,而ArrayList是執行緒序不安全的,不是同步的 二.資料增長:當需要增長時,Ve

ArrayListVectorHashMapHashTable、HashSet的默認初始容量、加載因子、擴容增量、具體區別

以及 內存 高效率 數組元素 調整 增量 [] key存在 集合 要討論這些常用的默認初始容量和擴容的原因是:當底層實現涉及到擴容時,容器或重新分配一段更大的連續內存(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配內存),要將容器原來的數據全部復制到新的內

Collection與Collections、ArrayListVectorHashMapHashtable(面試常用)

Collections與Collection 1. Collections是java.util下的類,它包含有各種有關集合操作的靜態方法2. Collection是java.util下的介面,它是各種集合結構的父介面   ArrayList和Vector1. 同步性: Vector是執行緒安全

ArrayListVectorHashMapHashTable、HashSet的預設初始容量、載入因子、擴容增量

主要是面試被問到了,來記錄一下。 這裡要討論這些常用的預設初始容量和擴容的原因是: 當底層實現涉及到擴容時,容器或重新分配一段更大的連續記憶體(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配記憶體),要將容器原來的資料全部複製到新的記憶體上,這無疑使效率

單例模式(懶漢式餓漢式)及如何實現執行安全

單例模式有兩種:懶漢式和餓漢式。 1 #include <iostream> 2 3 using namespace std; 4 5 6 // 保證在整個程式執行期間,最多隻能有一個物件例項 7 8 9 // 懶漢式 10 // 1 、建構函式私有化 11

Linux多執行學習(4) --讀寫鎖其他型別的鎖以及執行安全

多執行緒學習總結(1):https://blog.csdn.net/hansionz/article/details/84665815 多執行緒學習總結(2):https://blog.csdn.net/hansionz/article/details/84675536 多執行緒學習總結

2015我想Java聊聊之StringBuffer是如何保證執行安全

經常有關String,StringBuffer,StringBuilder之間比較的論調出現,結論通常是單執行緒情況下StringBuilder效能優於StringBuffer,但StringBuilder是執行緒不安全的,所以多執行緒併發程式設計時候要用Str

同步容器(如Vector)並不是所有操作都執行安全

這裡是網友們的回答 @趙鵬: size方法和get方法,如果集合的長度變化了,可能丟擲異常, @aold619: 去網上查了資料:“有條件的執行緒安全 我們在 7 月份的檔案“ 併發集合類”中討論了有條件的執行緒安全。有條件的執行緒安全類對於單獨的操作可以是執行緒安全的,但是某些操作序列可能需要外部

常用物件API(ArrayListVector,LinkedList的儲存效能特性,HashMapHashTable區別)

ArrayList,Vector,LinkedList的儲存效能和特性: ArrayList和Vector都是使用陣列的方式來儲存資料,此陣列元 素數大於實際儲存的資料以便增加和插入元素, 它們都允許直接按序 號索引元素, 但是插入元素要涉及陣列元素移動等記憶體操作, 所以

【java】 HashMap的工作原理+HashMapHashtable區別+HashMapHashSet的區別

本文由 ImportNew - 唐小娟 翻譯自 Javarevisited。 HashMap的工作原理是近年來常見的Java面試題。幾乎每個Java程式設計師都知道HashMap,都知道哪裡要用HashMap,知道Hashtable和HashMa

關於hashmaphashtable區別,及如何使hashmap變得執行安全?(除了synchronized)---concurrentHashmap

我們都知道hashmap是執行緒不安全的,而效率也比較高,他允許我們存入null鍵及null值; 而 hashtable 是執行緒安全的,其效率比較低,不允許我們存入null鍵和null值; 除了非同步及允許使用null值,hashmap與hashtable基本相同; 那麼為什麼hash

VectorArrayList區別以及Vector並非是絕對執行安全

首先看這兩類都實現List介面,而List介面一共有三個實現類,分別是ArrayList、Vector和LinkedList。List用於存放多個元素,能夠維護元素的次序,並且允許元素的重複。3個具體實現類的相關區別如下:ArrayList是最常用的List實現類,內部是通過

ArrayList LinkedList Vector使用上有什麼區別?實現上有什麼區別

ArrayList 和 Vector 使用上有什麼區別?實現上有什麼區別? Vector和ArrayList在使用上非常相似,都可用來表示一組數量可變的物件應用 的集合,並且可以隨機地訪問其中的元素。 1 Vector的方法都是同步的(Synchroni

Java容器類List、ArrayListVector及map、HashTableHashMap區別

List和Map是介面,ArrayList和HashMap分別是它們的實現類. ArrayList和HashMap是非同步的,Vector和HashTable是同步的,所以Vector和HashTable是執行緒安全的,而 ArrayList和HashMap並不是執行緒安全的

Java基礎之集合類如ArrayList、LinkedList、HashMapHashTable區別

ArrayList是一個動態陣列,有下標LinkedList是一個雙向連結串列,一個指標指向下一個相同點:都繼承自Collections類,放動態資料。不同點:後者有指標,增加一個數據,只用斷開一個連線,分別將新資料連上刪除一個數據,區別在於如果這個資料位於陣列中間,後者只用

JDK7JDK8中HashMap實現的區別

在JDK7中,HashMap是基於一個數組和多個連結串列的實現**(位桶+連結串列)**,當遇到雜湊衝突時,就將對應的元素以連結串列的形式儲存。但是這樣子的話HashMap的效能就會比較低,因為如果當資料比較多,發生衝突的元素也會越來越多,這時候連結串列中就會儲存有很多元素,在查詢上會消耗O

C++中陣列、連結串列vector等容器之間的區別

1. 各個容器之間區別 ① vector   (連續的空間儲存,可以使用[]操作符)快速的訪問隨機的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開始分配的空

(轉)HashMap底層實現原理/HashMapHashTable區別/HashMap與HashSet區別

eem 實現原理 ger 銀行 索引 target 聲明 到你 們的 ①HashMap的工作原理 HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算has