JAVA:Set/List/Map 集合之Map(三)
一、类型介绍
Java 自带了各种 Map 类。这些 Map 类可归为三种类型:
1. 通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现
HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、ConcurrentHashMap
2. 专用Map,通常我们不必亲自创建此类Map,而是通过某些其他类对其进行访问
java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults
3. 一个用于帮助我们实现自己的Map类的抽象类
AbstractMap
二、常见的几个类型的区别
1 区别
1.1 基本
HashMap:初始化容量为16,扩容每次为2*oldCap,key-value可以为NULL值
Hashtable:初始化容量为11,扩容每次为2*oldCap+1,key-value不可以为NULL值
TreeMap:初始化容量为0,内部是红黑树结构,不存在hash冲突的情况,不存在扩容的操作,key-value不可以为NULL值
1.2 实现
HashMap:实现了Map接口,继承了AbstractMap类
Hashtable:实现了Map接口,继承了AbstractMap类
TreeMap:由于TreeMap是有序的,所以其除了实现了Map接口,还实现了SortedMap、NavigableMap接口
1.3 内部原理
HashMap:HashMap是散列表实现,内部是数组+链表或者红黑树的结构
Hashtable:Hashtable也是散列表实现,内部是数组+链表的结构
TreeMap:TreeMap内部是红黑树的结构
1.4 线程安全
HashMap:不是线程安全的,其实通过Map m = Collections.synchronizeMap(hashMap)的方式也可以使得HashMap变成线程安全的,但是这样做对程序的性能可能是噩梦,在后面会介绍ConcurrentHashMap,建议在多线程的情况下可以使用ConcurrentHashMap替换HashMap.
Hashtable:是线程安全的,内部方法使用关键字synchronized修饰
TreeMap:不是线程安全的
三、常见用法
void clear() 从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o) 比较指定的对象与此映射是否相等。
V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode() 返回此映射的哈希码值。
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 视图。
四、遍历
// 1.声明一个Map
Map m=new HashMap();
for(Object obj : map.keySet()){
Object value = map.get(obj);
}