Ⅰ Java中,在HashMap可以用put(Key, Value)添加元素, 如何在LinkedHashMap中添加(Key, Value)
和HashMap方法一樣,也是用put添加元素,LinkedHashMap也是java.util.Map的實現類
區別在於
Hashmap 是一個最常用的Map,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。 HashMap最多隻允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
LinkedHashMap 是HashMap的一個子類,保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比 LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。
TreeMap實現SortMap介面,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。
Ⅱ HashMap中的put如何才可以實現System.out.println("將map集合中添加:"+map.put(8, "李明"));顯示加入的內
哥們。你這個問題問的可以。
String name = "李明";
map.put(2,name);
System.out.println("將map集合中添加:"+name);
Ⅲ hashmap 中 hash 函數怎麼是是實現的還有哪些 hash 的實現方式
HashMap是對數據結構中哈希表(Hash
Table)的實現,Hash表又叫散列表。Hash表是根據關鍵碼Key來訪問其對應的值Value的數據結構,它通過一個映射函數把關鍵碼映射到表中一個位置來訪問該位置的值,從而加快查找的速度。這個映射函數叫做Hash函數,存放記錄的數組叫做Hash表。
在Java中,HashMap的內部實現結合了鏈表和數組的優勢,鏈接節點的數據結構是Entry
,每個Entry對象的內部又含有指向下一個Entry類型對象的引用,如以下代碼所示:
static
class
Entry
implements
Map.Entry
{
final
K
key;
V
value;
Entry
next;
//Entry類型內部有一個自己類型的引用,指向下一個Entry
final
int
hash;
...
}
在HashMap的構造函數中可以看到,Entry表被申明為了數組,如以下代碼所示:
public
HashMap()
{
this.loadFactor
=
DEFAULT_LOAD_FACTOR;
threshold
=
(int)(DEFAULT_INITIAL_CAPACITY
*
DEFAULT_LOAD_FACTOR);
table
=
new
Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
在以上構造函數中,默認的DEFAULT_INITIAL_CAPACITY值為16,DEFAULT_LOAD_FACTOR的值為0.75。
當put一個元素到HashMap中去時,其內部實現如下:
public
V
put(K
key,
V
value)
{
if
(key
==
null)
return
putForNullKey(value);
int
hash
=
hash(key.hashCode());
int
i
=
indexFor(hash,
table.length);
...
}
Ⅳ 求解hashmap()和它的put()方法,以及大家所說的Key……
hashmap()是(key,value)組成value可以 重復
set不能重復 就和數學里德set集合一樣
ArrayList是連續存儲的
Ⅳ hashmap的put方法
put
public V put(K key,
V value)
在此映射中關聯指定值與指定鍵。如果此映射以前包含了一個該鍵的映射關系,則舊值被替換。
指定者:
介面 Map<K,V> 中的 put
覆蓋:
類 AbstractMap<K,V> 中的 put
參數:
key - 指定值將要關聯的鍵。
value - 指定鍵將要關聯的值。
返回:
與指定鍵相關聯的舊值,如果鍵沒有任何映射關系,則返回 null。返回 null 還可能表示該 HashMap 以前將 null 與指定鍵關聯。
Ⅵ hashmap的put get方法詳細實現過程,會不會有什麼線程不安全的問題
HashMap底層是一個Entry數組,當發生hash沖突的時候,hashmap是採用鏈表的方式來解決的,在對應的數組位置存放鏈表的頭結點。對鏈表而言,新加入的節點會從頭結點加入。 javadoc中關於hashmap的一段描述如下: 此實現不是同步的。
Ⅶ hashmap底層是怎麼實現的
當我們往HashMap中put元素的時候,先根據key的hashCode重新計算hash值,根據hash值得到這個元素在數組中的位置(即下標),如果數組該位置上已經存放有其他元素了,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。如果數組該位置上沒有元素,就直接將該元素放到此數組中的該位置上。
addEntry(hash, key, value, i)方法根據計算出的hash值,將key-value對放在數組table的 i 索引處。addEntry 是HashMap 提供的一個包訪問許可權的方法(就是沒有public,protected,private這三個訪問許可權修飾詞修飾,為默認的訪問許可權,用default表示,但在代碼中沒有這個default),
Ⅷ HashMap內部是如何實現的
基於哈希表的 Map 介面的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恆久不變。
此實現假定哈希函數將元素適當地分布在各桶之間,可為基本操作(get 和 put)提供穩定的性能。迭代 collection 視圖所需的時間與 HashMap 實例的「容量」(桶的數量)及其大小(鍵-值映射關系數)成比例。所以,如果迭代性能很重要,則不要將初始容量設置得太高(或將載入因子設置得太低)。
HashMap 的實例有兩個參數影響其性能:初始容量 和載入因子。容量 是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。載入因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了載入因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。
通常,默認載入因子 (.75) 在時間和空間成本上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數 HashMap 類的操作中,包括 get 和 put 操作,都反映了這一點)。在設置初始容量時應該考慮到映射中所需的條目數及其載入因子,以便最大限度地減少 rehash 操作次數。如果初始容量大於最大條目數除以載入因子,則不會發生 rehash 操作。
如果很多映射關系要存儲在 HashMap 實例中,則相對於按需執行自動的 rehash 操作以增大表的容量來說,使用足夠大的初始容量創建它將使得映射關系能更有效地存儲。
注意,此實現不是同步的。如果多個線程同時訪問一個哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須 保持外部同步。(結構上的修改是指添加或刪除一個或多個映射關系的任何操作;僅改變與實例已經包含的鍵關聯的值不是結構上的修改。)這一般通過對自然封裝該映射的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用 Collections.synchronizedMap 方法來「包裝」該映射。最好在創建時完成這一操作,以防止對映射進行意外的非同步訪問,如下所示:
Map m = Collections.synchronizedMap(new HashMap(...));
由所有此類的「collection 視圖方法」所返回的迭代器都是快速失敗 的:在迭代器創建之後,如果從結構上對映射進行修改,除非通過迭代器本身的 remove 方法,其他任何時間任何方式的修改,迭代器都將拋出 。因此,面對並發的修改,迭代器很快就會完全失敗,而不冒在將來不確定的時間發生任意不確定行為的風險。
注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的並發修改時,不可能作出任何堅決的保證。快速失敗迭代器盡最大努力拋出 。因此,編寫依賴於此異常的程序的做法是錯誤的,正確做法是:迭代器的快速失敗行為應該僅用於檢測程序錯誤。
使用示例:
HashMap a = new HashMap();
a.put("name", "abcdef"); // key是name,value是字元串abcdef
System.out.println(a.get("name"));// 根據key取得其值並輸出
List list = new ArrayList();
list.add(a); // 加入1題所創建的hashmap
a = new HashMap(); // 創建另一個hashmap
a.put("name", "123456");//key是name,value是字元串123456
list.add(a);// 加入另一個hashmap
Ⅸ java map .put 方法
被222覆蓋了,因為你的兩個key都是1。Map是以K-Value的鍵值對形式來存儲的,不能包含相同的key,每個key只能映射一個value。
如果想實現一個key保存兩個value,可以參考以下代碼:
false
xx
xx nihao
containsKey---> false
str1 containsKey---> true
str2 containsKey---> true
value----> null
str1 value----> nihao
str2 value---->
我們可以知道IdentityHashMap是靠對象來判斷key是否相等的,如果我們一個key需要保存多個value的時候就需要使用到這個IdentityHashMap類,這樣我們我們就可以需要的時候使用到這個類了。
(9)hashmap的put方法是如何實現的擴展閱讀:
Map介面中鍵和值一一映射. 可以通過鍵來獲取值。
給定一個鍵和一個值,你可以將該值存儲在一個Map對象. 之後,你可以通過鍵來訪問對應的值。
當訪問的值不存在的時候,方法就會拋出一個NoSuchElementException異常.
當對象的類型和Map里元素類型不兼容的時候,就會拋出一個 ClassCastException異常。
當在不允許使用Null對象的Map中使用Null對象,會拋出一個NullPointerException 異常。
當嘗試修改一個只讀的Map時,會拋出一個UnsupportedOperationException異常。
Java官方APIMap(Java Platform SE 7)
菜鳥教程-Java Map 介面
Ⅹ hashmap put過程是什麼
put public V put(K key,V value)在此映射中關聯指定值與指定鍵。如果此映射以前包含了一個該鍵的映射關系,則舊值被替換。
指定者:介面Map<K,V> 中的 put。
覆蓋:類AbstractMap<K,V> 中的 put。
參數:key - 指定值將要關聯的鍵。
value - 指定鍵將要關聯的值。
返回:與指定鍵相關聯的舊值,如果鍵沒有任何映射關系,則返回 null。返回 null 還可能表示該 HashMap 以前將 null 與指定鍵關聯。
重要參數
HashMap 的實例有兩個參數影響其性能:初始容量 和載入因子。容量是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。載入因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了載入因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。