javahash存儲
⑴ java集合:關於hashmap存儲一個對象,中間改變對象的值,為什麼再remove不能用新名字來刪除
這個得看hashset的源碼了,內部會以hashcode或其經過某種演算法得到的二次hash值為key來組織存儲數據。
你重寫了book的hashcode方法,並且內部用到了name來計算hashcode,那麼當你修改了name後,它的hashcode自然變了,那麼它就在原來的hashset里找不到了,自然刪除不掉。
⑵ java 為什麼使用hashmap
首先當我們需要存儲數據的時候,動態數組雖然能夠自動擴容,但是必須在初始時刻指定初始容量。而對於那些在編譯時無法確定具體的數量即動態增長的數據,就需要用到Java集合類了。對於ArrayList 和 LinkedList,還有 Vector它們都有一些缺點,要麼插入刪除速度慢、要麼就是遍歷速度慢。那麼有沒有一種插入、刪除、遍歷都比較不錯的集合類呢?於是 HashMap 就出現了。HashMap 是一個散列表,它存儲的是一組鍵值對(key-value)的集合,並實現快速的查找。
(1)為了實現快速查找,HashMap 選擇了數組而不是鏈表。以利用數組的索引實現 O(1) 復雜度的查找效率。
(2)為了利用索引查找,HashMap 引入 Hash 演算法, 將 key 映射成數組下標: key -> Index。
(3)引入 Hash 演算法又導致了 Hash 沖突。為了解決 Hash 沖突,HashMap 採用鏈地址法,在沖突位置轉為使用鏈表存儲。
(4)鏈表存儲過多的節點又導致了在鏈表上節點的查找性能的惡化。為了優化查找性能,HashMap 在鏈表長度超過 8 之後轉而將鏈表轉變成紅黑樹,以將 O(n) 復雜度的查找效率提升至 O(log n)。
【綜上】
HashMap 存在的意義就是實現一種快速的查找並且插入、刪除性能都不錯的一種 K/V(key/value)數據結構。
附上一位博主的高見:網頁鏈接
⑶ java中hashtable怎樣存儲數據和讀取數據
Hashtable-哈希表類\x0d\x0a\x0d\x0a以哈希表的形式存儲數據,數據的形式是鍵值對.\x0d\x0a特點:\x0d\x0a查找速度快,遍歷相對慢\x0d\x0a鍵值不能有空指針和重復數據\x0d\x0a\x0d\x0a創建\x0d\x0aHashtable ht=new \x0d\x0aHashtable();\x0d\x0a\x0d\x0a添值\x0d\x0a\x0d\x0aht.put(1,"Andy");\x0d\x0aht.put(2,"Bill");\x0d\x0aht.put(3,"Cindy");\x0d\x0aht.put(4,"Dell");\x0d\x0aht.put(5,"Felex");\x0d\x0aht.put(6,"Edinburg");\x0d\x0aht.put(7,"Green");\x0d\x0a\x0d\x0a取值\x0d\x0a\x0d\x0aString str=ht.get(1);\x0d\x0aSystem.out.println(str);// Andy\x0d\x0a\x0d\x0a對鍵進行遍歷\x0d\x0a\x0d\x0aIterator it = ht.keySet().iterator();\x0d\x0a\x0d\x0awhile (it.hasNext()) {\x0d\x0a Integer key = (Integer)it.next();\x0d\x0a \x0d\x0aSystem.out.println(key);\x0d\x0a}\x0d\x0a\x0d\x0a對值進行遍歷\x0d\x0a\x0d\x0aIterator it = ht.values().iterator();\x0d\x0a\x0d\x0awhile (it.hasNext()) {\x0d\x0a String value =(String) it.next();\x0d\x0a \x0d\x0aSystem.out.println(value);\x0d\x0a}\x0d\x0a\x0d\x0a取Hashtable記錄數\x0d\x0a\x0d\x0aHashtable ht=new Hashtable();\x0d\x0a\x0d\x0aht.put(1,"Andy");\x0d\x0aht.put(2,"Bill");\x0d\x0aht.put(3,"Cindy");\x0d\x0aht.put(4,"Dell");\x0d\x0aht.put(5,"Felex");\x0d\x0aht.put(6,"Edinburg");\x0d\x0aht.put(7,"Green");\x0d\x0a\x0d\x0aint i=ht.size();// 7\x0d\x0a\x0d\x0a刪除元素\x0d\x0a\x0d\x0aHashtable ht=new Hashtable();\x0d\x0a\x0d\x0aht.put(1,"Andy");\x0d\x0aht.put(2,"Bill");\x0d\x0aht.put(3,"Cindy");\x0d\x0aht.put(4,"Dell");\x0d\x0aht.put(5,"Felex");\x0d\x0aht.put(6,"Edinburg");\x0d\x0aht.put(7,"Green");\x0d\x0a\x0d\x0aht.remove(1);\x0d\x0aht.remove(2);\x0d\x0aht.remove(3);\x0d\x0aht.remove(4);\x0d\x0a\x0d\x0aSystem.out.println(ht.size());// 3\x0d\x0a\x0d\x0aIterator it = ht.values().iterator();\x0d\x0a\x0d\x0awhile (it.hasNext()) {\x0d\x0a // Get value\x0d\x0a String value =(String) \x0d\x0ait.next();\x0d\x0a System.out.println(value);\x0d\x0a}
⑷ java中map與hashmap的區別
看看下面這個會更好
HashMap是Hashtable的輕量級實現(非線程安全
的實現),他們都完成了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
HashMap 把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。
Hashtable和HashMap採用的hash/rehash演算法都大概一樣,所以性能不會有很大的差異。