Map接口的常用的实现类有HashMap、TreeMap和Hashtable。
(1)HashMap类与LinkedHashMap类。
HashMap类的构造方法包括:
HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 |
HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。 |
HashMap(int initialCapacity, float loadFactor) 构造一个带指定初始容量和加载因子的空 HashMap。 |
HashMap(Map<? extends K,? extends V> m) 构造一个映射关系与指定 Map 相同的新 HashMap。 |
方法摘要 | |
---|---|
void | clear() 从此映射中移除所有映射关系。 |
Object | clone() 返回此 HashMap 实例的浅表副本:并不复制键和值本身。 |
boolean | containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。 |
boolean | containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> | entrySet() 返回此映射所包含的映射关系的 Set 视图。 |
V | get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null 。 |
boolean | isEmpty() 如果此映射不包含键-值映射关系,则返回 true。 |
Set<K> | keySet() 返回此映射中所包含的键的 Set 视图。 |
V | put(K key, V value) 在此映射中关联指定值与指定键。 |
void | putAll(Map<? extends K,? extends V> m) 将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。 |
V | remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。 |
int | size() 返回此映射中的键-值映射关系数。 |
Collection<V> | values() 返回此映射所包含的值的 Collection 视图。 |
HashMap所输出的键-值对顺序和放入的顺序并不保持一致,且HashMap里面的key允许为null。
LinkedHashMap是HashMap的子类,保持键的顺序与插入的顺序一致,构造方法与HashMap一致,
(2)TreeMap类
基于红黑树(Red-Black tree)的 NavigableMap
实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator
进行排序,具体取决于使用的构造方法。与 HashMap 不同属于按key 有序存放 。 由于此类按照key排序,而key本身也是对象,因此对象所在的类必须实现Comparator接口。
构造方法摘要 | |
---|---|
TreeMap() 使用键的自然顺序构造一个新的、空的树映射。 | |
TreeMap(Comparator<? super K> comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。 | |
TreeMap(Map<? extends K,? extends V> m) 构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。 | |
TreeMap(SortedMap<K,? extends V> m) 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。 |
Map<String,Sring> map=new HashMap<String,String>()
;
map.put("bj",“Beijing”);
map.put("ay",“anyang”);
如果希望键-值按照字母顺序输出,则将HashMap改为TreeMap即可。
Map<String,Sring> map=new TreeMap<String,String>()
;
map.put("bj",“Beijing”);
map.put("ay",“anyang”);
(3)Hashtable类
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null
对象都可以用作键或值。
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode
方法和 equals
方法。
构造方法摘要 | |
---|---|
Hashtable() 用默认的初始容量 (11) 和加载因子 (0.75) 构造一个新的空哈希表。 | |
Hashtable(int initialCapacity) 用指定初始容量和默认的加载因子 (0.75) 构造一个新的空哈希表。 | |
Hashtable(int initialCapacity, float loadFactor) 用指定初始容量和指定加载因子构造一个新的空哈希表。 | |
Hashtable(Map<? extends K,? extends V> t) 构造一个与给定的 Map 具有相同映射关系的新哈希表。 |
Map对象与Hashtable对象的区别如下:
1、Map提供了集合查看的方法,而不直接支持通过枚举对象(Enumeration)的迭代。集合查看大大增强了接口的表达能力。
2、允许通过键、值、键-值进行迭代,而Hashtable不支持第三种迭代。
3、Map提供了安全的方法,在迭代中删除元件。而Hashtable不支持此功能。
4、Map修复了Hashtable的一个小缺陷,在Hashtable中有一个contains()方法,当Hashtable包含指定值,该方法返回true,该方法可能会引发混淆,故map提供了containsValue()和containsKey()。
HashMap集合和Hashtable的区别?
共同点:都是map接口的实现类,都是基于哈希表的实现类
HashMap集合线程不安全的类,不同步,执行效率高(允许键和值是null的)
Hashtable集合线程安全的类,同步,执行效率低(不允许有null键和null值)
线程安全的类:
StringBuffer :字符串缓冲区
Vector :List集合
Hashtable :Map集合的