1. HashMap:
是AbstractMap的直接子类,实现Map接口,允许NULL键值(Key-Value),非同步的。在这两点与HashTable不同。
HashMap有两个参数会影响其性能,初始容量和加载因子,容量是HashMap在创建时“桶”的数量,而初始容量是哈希表在创建时分配的空间大小。加载因子是哈希表在其容量自动增加时能达到多满的衡量尺度(比如默认为0.75,即桶中数据达到3/4就不能再放数据了)。如果加载因子过大,迭代性能会下降,虽然空间开销减少。如果初始容量小于最大条目数除以加载因子,则会发生 rehash 操作。rehash操作即重建内部数据结构,一般是增加桶数为原来的两倍。
如果有很多K-V对要添加到HashMap中,则最好分配大点的初始容量,以减少rehash操作。
HashMap是非同步的,所以如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap(new HashMap(..)); 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:
Map m = Collections.synchronizedMap(new HashMap(...));
1.1 构造函数如下:
HashMap()
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空HashMap。
HashMap(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空HashMap。
HashMap(int initialCapacity, float loadFactor)
构造一个带指定初始容量和加载因子的空HashMap。
1.2 主要方法有:clear()、containsKey(Object key)、containsValue(Object value)、entrySet()(返回包含的映射关系的Set视图,即Set<Map.Entry<K,V>>)、keySet()(返回包含的所有key的Set视图)、values()(返回包含的所有value的Set视图)、size()、isEmpty()、put(K,V)、get(Object key)、remove(Object key)
2. HashTable:
是Dictionary(抽象类)的直接子类,也实现了Map接口。任何非NULL对象都可以作为键值对。HashTable是同步的,其他与HashMap一模一样。
3. Dictionary:
~是可作为任何包含K-V映射关系的类的抽象父类,K、V都不能为NULL
4. Enumeration:
接口,功能与Iterator接口基本相同,优先考虑使用Iterator。