Map整理

整理了下Java中Map的结构画了个图, 虚线表示接口, 实线表示类



Map继承关系图

Map继承关系图


Map基本操作

  • int size(): 返回map大小
  • boolean isEmpty(): 是否为空Map
  • boolean containsKey(Object key): 是否包含key
  • boolean containsValue(Object value): 是否包含value
  • V get(Object key): 返回key对应的value, 没有则返回null
  • V put(K key, V value): key和value都可为null, key重复则替换旧的value
  • void putAll(Map<? extends K, ? extends V> m):
  • V remove(Object key): 移除并返回, 若不包含key返回null
  • void clear(): 清空map
  • Set<K> keySet(): 返回key的集合
  • Collection<V> values(): 返回value的集合
  • Set<Map.Entry<K, V>> entrySet(): 返回Entry集合

HashMap与HashTable

  • Hashtable是线程安全的,而HashMap不是线程安全的
  • Hashtable不允许null作为key和value,而HashMap则可以使用null作为key和value
  • Hashtable很古老, 从JDK1.0就有了, 不建议使用

HashMap与IdentityHashMap

  • IdentityHashMap认为两个key相等: 两个key严格相等(key1 == key2)
  • HashMap则认为两个key相等: key1.equals(key2)hashCode相同

LinkedHashMap

LinkedHashMap可以记住key-value对的添加时的顺序


SortedMap接口和TreeMap

内置比较器(Comparator),可比较前后顺序, TreeMap默认按照自然顺序排序, 不允许null作为key


EnumMap

EnumMap只接受枚举类作为key, 不允许null作为key


Properties

Properties继承HashTable, 还有几个其他常用方法:

  • String getProperty(String key): 获取指定key对应的value值
  • String getProperty(String key, String defaultValue): 有默认值
  • Object setProperty(String key, String value): 调用Hashtable的put方法.
  • void load(InputStream inStream): 从属性文件加载key-value对
  • void store(OutputStream out, String comments): 将当前的所有key-value对输出到指定属性文件,小心乱码
  • loadFromXML(InputStream in): 从XML中加载配置
  • storeToXML(OutputStream os, String comment): 写到XML文件中
  • storeToXML(OutputStream os, String comment, String encoding): 写到XML中, 可以指定编码

Map的选择

  • 若要保留插入时的顺序, 可用LinkedHashMap
  • 若要求key完全匹配(同一对象),可用IdentityHashMap
  • 若要排序,可用TreeMap, 它在底层采用红黑树来管理key-value对

关于null

  • Hashtable的key、value均不能为null
  • TreeMapEnumMap不允许key为null
  • HashMapIdentityHashMapkey可以为null, 但不建议这样做