A. java.util.hashtable實現了哪個interface
一、Map
map介面,集合類的介面,聲明了map的常用方法。所有的map都繼承自改介面
二、java.io.Serializable介面,
介面里沒有聲明任何方法,該介面用來實現對象的序列化反序列化功能
三、java.lang.Cloneable
介面里沒有聲明任何方法,該介面實現對象復制功能
四. AbstractMap
重要的類:AbstractMap<K,V>
AbstractMap抽象類實現了一些簡單且通用的方法,
在這個抽象類中有兩個方法非常值得關注,keySet和values方法源碼的實現可以說是教科書式的典範。
抽象類通常作為一種骨架實現,為各自子類實現公共的方法。
Java中Map類型的數據結構有相當多,AbstractMap作為它們的骨架實現實現了Map介面部分方法,也就是說為它的子類各種Map提供了公共的方法,沒有實現的方法各種Map可能有所不同。
抽象類不能通過new關鍵字直接創建抽象類的實例,但它可以有構造方法。AbstractMap提供了一個protected修飾的無參構造方法,意味著只有它的子類才能訪問(當然它本身就是一個抽象類,其他類也不能直接對其實例化),也就是說只有它的子類才能調用這個無參的構造方法。
在Map介面中其內部定義了一個Entry介面,這個介面是Map映射的內部實現用於維護一個key-value鍵值對,key-value存儲在這個Map.Entry中。AbstractMap對這個內部介面進行了實現,一共有兩個:一個是可變的SimpleEntry和一個是不可變的SimpleImmutableEntry。
1. SimpleEntry
1.1 定義
實現了Map.Entry<K, V>介面,並且實現了Serializable(可被序列化)。它的方法比較簡單都是取值存值的操作,對於key值的定義是一個final修飾意味著是一個不可變的引用。
1.2 setValue
ll另外其setValue方法稍微特殊,存入value值返回的並不是存入的值,而是返回的以前的舊值。
源碼:
1.3 equals和hashCode
需要重點學習的是它重寫的equals和hashCode方法。
eq方法
要想正確重寫equals方法並能正確使用,通常還需要重寫hashCode方法。因為集合中的元素,判斷是否一樣時,先hash再equals,這也是個知識點,詳細的,學習一下原理。
hashcode源碼:可以看成求hashcode值時,即返回的int數據,是key.hashCode() ^ value.hashCode(),即key、value的hashcode值異或
2. SimpleImmutableEntry
2.1 定義
源碼:
它相比於SimpleEntry其key和value成員變數都被定義為了final類型。即定義為不可變的Entry,不提供setValue方法,不能通過setValue方法進行修改。
2.2 setValue
調用setValue方法將會拋出UnsupportedOperationException異常。即定義為不可變的Entry,不提供setValue方法,不能通過setValue方法進行修改。
它的equals和hashCode方法和SimpleEntry一致。
3. 實現的Map介面方法
接下來查看AbstractMap抽象類實現了哪些Map介面中的方法。
3.1 public int size()
Map中定義了一個entrySet方法,返回的是Map.Entry的Set集合,直接調用Set集合的size方法即是Map的大小。
3.2 public boolean isEmpty()
調用size方法,等於0即為空。
3.3 public boolean containsValue(Object value)
這個方法的實現較為簡單,通過調用entrySet方法獲取Set集合的迭代器遍歷Map.Entry,獲取對應的value與參數value比較。Map可以存儲為null的value值,由於value=null在Map中存儲比較特殊(不能計算hashCode值),所以在這里也做了判斷參數value是否為空。
public boolean containsKey(Object key)
這個方法實現和containsValue一致。
3.4 public V get(Object key)
這個方法實現和containsValue類似,不同的是上面相等返回boolean,這個方法返回value值。
3.5 public V put(K key, V value)
向Map中存入key-value鍵值對的方法並沒有具體實現,會直接拋出一個UnsupportedOperationException異常。
6 public V remove(Object key)
通過參數key刪除Map中指定的key-value鍵值對。這個方法也很簡單,也是通過迭代器遍歷Map.Entry的Set集合,找到對應key值,通過調用 Iterator.remove() 方法刪除Map.Entry。
7. public void putAll(Map<? extends K, ? extends V> m)
這個方法也很簡單遍歷傳入的Map,調用put方法存入就可以了。
public void clear()
調用entrySet方法獲取Set集合再調用Set#clear()方法清空。
keyset
返回Map key值的Set集合。AbstractMap中定義了一個成員變數「transient Set<K> keySet」,在JDK7中keySet變數是由volatile修飾的,但在JDK8中並沒有使用volatile修飾。在對keySet變數的注釋中解釋道,訪問這些欄位的方法本身就沒有同步,加上volatile也不能保證線程安全。關於keySet方法的實現就有點意思了。
首先思考該方法是返回key值的Set集合,很自然的能想到一個簡單的實現方式,遍歷Entry數組取出key值放到Set集合中,類似下面代碼:
這就意味著每次調用keySet方法都會遍歷Entry數組,數據量大時效率會大大降低。不得不說JDK源碼是寫得非常好,它並沒有採取遍歷的方式。如果不遍歷Entry,那又如何知道此時Map新增了一個key-value鍵值對呢?
答案就是在keySet方法內部重新實現了一個新的自定義Set集合,在這個自定義Set集合中又重寫了iterator方法,這里是關鍵,iterator方法返回Iterator介面,而在這里又重新實現了Iterator迭代器,通過調用entrySet方法再調用它的iterator方法。下面結合代碼來分析:
五、 Dictionary
Dictionary 類是一個抽象類,用來存儲鍵/值對,作用和Map類相似。
給出鍵和值,你就可以將值存儲在Dictionary對象中。一旦該值被存儲,就可以通過它的鍵來獲取它。所以和Map一樣, Dictionary 也可以作為一個鍵/值對列表。Dictionary類已經過時了。在實際開發中,你可以實現Map介面來獲取鍵/值的存儲功能。
打開CSDN,閱讀體驗更佳
HashMap、TreeMap、Hashable和LinkedHashMap_kgu的博客
HashMap、TreeMap、Hashable和LinkedHashMap Map是最重要的數據結構之一。開始會告訴怎麼用HashMap、TreeMap、Hashtable和LinkedHashMap 1、Map概述 在Java SE中有4種Map的實現:HashMap、TreeMap、Hashtable和LinkedHashMap. HashMap:用哈...
繼續訪問
Python 介面:從協議到抽象基類_weixin_30492047的博客
首先,基本的事實是,Python語言沒有 interface 關鍵字,而且除了抽象基類,每個類都有介面:類實現或繼承的公開屬性(方法或數據屬性),包括特殊方法,如__getitem__ 或 __add__。 按照定義,受保護的屬性和私有屬性不在介面中:即便「受保護...
繼續訪問
最新發布 Java集合(九)HashMap介面
HashMap小結:(1)Map介面的常用實現類:HashMap、Hashtable和Properties(2)HashMap是Map介面使用頻率最高的實現類(3)HashMap是以key-val對的方式來存儲數據(HashMap$Node類型)(4)key不能重復,但是值可以重復,允許使用null鍵和null值(5)如果添加相同的key,則會覆蓋原來的key-val,等同於修改.(key不會替換,val會替換)我們來把斷點放在map.put("no1","張三豐「);
繼續訪問
Hashtable和HashMap的異同
Hashtable和HashMap兩者的原理相同,功能相同,很多情況下可以互用。 Hashtable和HashMap的主要區別如下: 1、Hashtable繼承自Dictionary類,而HashMap實現了Map介面 2、Hashtable線程安全,HashMap重速度、輕安全,是線程非安全的,所以當運行到線程環境中時,需要程序員自己管理線程的同步問題。 3、Hashtable不允許null值(key和value都不允許),HashMap允許null值(key和value都允許) 其他異同點可參照博客:
繼續訪問
Hashable / Hasher_weixin_33909059的博客
哈希函數的選擇應該作為實現細節,而不是設計中的固定部分;因此,使用者不應該依賴於編譯器自動生成的 Hashable 函數的具體特徵。最可能的實現是在每個成員的哈希值上調用標准庫中的_mixInt函數,然後將他們邏輯異或(^),如同目前Collection類...
繼續訪問
php的數據結構_PHP 的數據結構擴展_myh991235的博客
Sequence 是類數組數據結構的基礎介面,定義了很多重要且方便的方法,比如 contains, map, filter, rece, find, first, last 等。從圖中可知,Vector, Deque, Stack, Queue 都直接或者間接的實現了這個介面。 Hashable 在圖中看起來比...
繼續訪問
33.Java之Map介面實現類(HashMap、HashTable、Properties、TreeSet 和 TreeMap基本介紹,HashMap 底層機制)
Map 介面的常用實現類:HashMap、Hashtable 和 Properties 33.1 HashMap 基本介紹 是 Map 介面使用頻率最高的實現類 是以 Key-value 的方式來存儲數據(HashMap$Node類型) Key 不能重復,但是值可以重復,允許使用 Null 鍵和 Null 值 如果添加相同的 Key,則會覆蓋原來的 Key-value,等同於修改(Key不會替換,value會替換) 與 HashSet 一樣,不保證映射的順序(即添加順序與輸出順序不一樣),因為底層是以
繼續訪問
Map介面:HashMap與HashTable的區別
1)HashMap和Hashtable都實現了Map介面,但是繼承的父類不同: public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map2)HashMap是非synchronized,執行速度快,而HashTab...
繼續訪問
php7 唯一數字_PHP7中高效的數據結構_王雷Neo的博客
實現Hashable介面的數據結構是Map和Set。 Map 一個Map 是一個鍵值對的連續集合,和數組幾乎一致。鍵可以是任何類型,但是必須唯一。 強項: 性能和內存效率和數組幾乎一致 當長度降低的時候自動釋放內存 ...
繼續訪問
java常見筆試_Java 常見筆試題(2)_weixin_39998462的博客
java.util.Hashtable實現了哪個介面? A. java.util.Map B. java.util.List C. java.util.Hashable D. java.util.Collection 9. 1. class A implements Runnable{ 2. int i; 3.
繼續訪問
實現原理_HashTable實現原理
概要前一章,我們學習了HashMap。這一章,我們對Hashtable進行學習。我們先對Hashtable有個整體認識,然後再學習它的源碼,最後再通過實例來學會使用Hashtable。第1部分 Hashtable介紹第2部分 Hashtable數據結構第3部分 Hashtable源碼解析(基於JDK1.6.0_45)第4部分 Hashtable遍歷方式第5部分 Hashtable示例轉載請註明出處...
繼續訪問
Hashtable源碼分析
前言:Hashtable線程安全的集合類,雖然它線程安全,然而在日常開發中使用的頻率很低,畢竟鎖的顆粒度太大了。但是這並不妨礙我們對其內部原理進行了解。 註:本文jdk源碼版本為jdk1.8.0_172。 1.Hashtable基本概念 Hashtable與HashMap一樣,都是以鍵值對的形式存儲數據。但是Hashtable的鍵值不能為null,而HashMap的鍵值是可以為...
繼續訪問
Swift自定義Class實現Hashable_weixin_30273763的博客
增加代碼後,發現編譯器依然報錯"Type 'Bit' does not conform to protocol 'Equatable'"-沒有實現Equatable協議。 2.實現Equatable Commend+click點擊Hashable定義,進入後再點擊Equatable協議定義,可以看到如下定義: ...
繼續訪問
Array,Vertor,Arraylist,Hashable,Hashmap等幾個易混淆的概念_tjjhz...
1.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java1.2引進的Map介面的一個實現 2.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
繼續訪問
Hashtable簡述
散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。......
繼續訪問
Map介面與實現類HashTable
Map介面與實現類HashTable 源碼位置 rt.jar/java.util包下 源碼類 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable 特點 1、集合中key不能重復,若put時集合已含有此key,那新值會替換舊值;key,value不能為null 2、HashTable/Map中存放數
繼續訪問
Java面試知識整理_加溫的啤酒的博客_java面試知識整理
都實現了list介面,都是有序的 vector線程是安全的,arraylist線程是不安全的 vector數據增長是原來的一倍,arraylist是數據增長是原來的0.5倍 hashmap和hashable的區別 hashmap是hashable的輕量級實現,hashmap允許空鍵值,hashable不允許 ...
繼續訪問
javase基礎知識總結_id_1314520的博客
interface介面: 默認所有方法都是抽象的,並且public修飾的. 屬性: 默認為public修飾的常量(public final修飾的) abstract抽象類: 類名被abstract修飾的類; 裡面可以有抽象方法, 也可以沒有抽象方法; 實現介面類,可以重寫也可以不重寫介面...
繼續訪問
集合—Map介面實現類-Hashtable
本次博客帶領大家學習集合中的Map介面實現類-Hashtable。
繼續訪問
Hashtable 和 HashMap
HashMap和Hashtable都實現了Map介面,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。 1.HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。 2...
繼續訪問
hashMap和hashTable的區別以及HashMap的底層原理?
hashMap和hashTable的區別? 1、繼承的父類不同 HashTable繼承Dictionary類,而hashMap繼承了AbstractMap類,但是二者都實現了map介面。 2、線程安全性不同 Hashtable 線程安全,因為它每個方法中都加入了Synchronize。HashMap是線程不安全的。 HashMap底層是一個Entry數組,當發生hash沖突的時候,ha......
繼續訪問
java---Map介面的實現類HashMap和Hashtable
package LyfPractice;import java.util.*;/** * Created by fangjiejie on 2016/12/19. */ /*Hashmap和Hashtable的區別 1.相同:都實現了Map介面,實現了key和value的保存與映射,有很多相同的方法 2.不同: Hashmap:是map介面的實現類 ,非同步,線程不安全 ,速度快,可以有
繼續訪問
Map 介面實現類-Hashtable
Map 介面實現類-Hashtable
繼續訪問
29. Map介面繼承關系 / Map介面概述 / HashMap底層實現原理及相關知識 / Map常用方法 / TreeMap、Properties
Map介面繼承關系 Map介面概述 Map與Collection並列存在。用於保存具有映射關系的數據:key-value Map 中的 key 和 value 都可以是任何引用類型的數據 Map 中的 key 用Set來存放, 不允許重復,即同一個 Map 對象所對應 的類,須重寫hashCode()和equals()方法 常用String類作為Map的「鍵」 key 和 value 之間存在單向一對一關系,即通過指定的 key 總能找到 唯一的、確定的 value Map介面的常用實現類: HashM
繼續訪問
Map介面的實現類----HashMap
Map介面的實現類----HashMap。
繼續訪問
JAVA基礎 介面與繼承 HashMap使用
https://blog.csdn.net/u010575093/article/details/50731281 抽象類中可以定義成員變數,而介面中定義的成員變數實際上都是常量 介面不可繼承抽象類,抽象類可實現多個介面。介面與介面之間是繼承,用extends,可繼承多個介面 mport java.util.HashMap; import java.util.Map; interface T...
繼續訪問
【Java_基礎深入】LinkedHashMap 繼承 HashMap又實現 Map 介面背後的設計思想
JDK源碼的類定義 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable public class LinkedHashMap<K,V> extends HashMap<K,V> implements...
繼續訪問
Map介面及其實現類HashMap、LinkedHashMap和Hashtable的簡單介紹
一、Map集合的特點 Map集合是一個雙列集合,一個元素包含兩個值(一個是key,一個是value)Map集合的特點 Map集合中的元素,key和value的數據類型可以相同也可以不同 Map集合中的元素,key是不允許重復的,value是可以重復的 Map集合中的元素,key和value是一一對應的 Map的常用方法 1、public V put (K key, V value)方法 作用:把指定的鍵與指定的值添加到Map集合中 返回值V的含義:存儲鍵值對的時候,key如果不重復,返回值v是null;
繼續訪問
Java 集合系列11之 Hashtable詳細介紹(源碼解析)和使用示例
轉 http://www.cnblogs.com/skywang12345/p/3310887.html#top Java 集合系列11之 Hashtable詳細介紹(源碼解析)和使用示例 概要 前一章,我們學習了HashMap。這一章,我們對Hashtable進行學習。 我們先對Hashtable有個整體認識,然後再學習它的源碼,最後再通過實例來學會使用Has
繼續訪問
HashTable實現原理
有兩個類都提供了一個多種用途的hashTable機制,他們都可以將可以key和value結合起來構成鍵值對通過put(key,value)方法保存起來,然後通過get(key)方法獲取相對應的value值。一個是前面提到的HashMap,還有一個就是馬上要講解的HashTable。對於HashTable而言,它在很大程度上和HashMap的實現差不多,如果我們對HashMap比較了解的話,對Has