4.1Map接口

概述

  • Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value,称为entry
  • Map 中的 key 和 value 都可以是任何引用类型的数据
  • Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法
  • 常用String类作为Map的”键”
  • key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value

常用方法

  1. ### 添加、删除操作方法
  2. Object put(Object key, Object value) 添加、或更新一个元素到HashMap
  3. Object remove(Object key) 删除指定key的元素
  4. void putAll(Map t) Map t中所有元素添加到当前Map
  5. void clear() 清除当前map中所有元素
  6. ### 元素查询操作方法
  7. Object get(Object key) 获取指定key的元素,若key不存在则返回null
  8. boolean containsKey(Object key) 当前map所有的key中是否包含指定key,是返回true,否则false
  9. boolean containsValue(Object value) 当前map所有的value中是否包含指定的value,是返回true,否则false
  10. int size() 返回map元素个数
  11. boolean isEmpty() 当前map是否为空,是返回true,否则false
  12. boolean equals(Object obj) 当前map与指定的obj map是否相等,即所有entry相等
  13. ### 元视图操作方法
  14. Set keySet() 获取当前map所有的key,值为Set
  15. Collection values() 获取当前map所有的value,值为Collection
  16. Set entrySet() 获取当前map所有的entry,值为Set

特点

  • Map的key、value都可以为null
  • key、entry使用Set存储,不可重复,value使用Collection存储,可以重复
  • put()添加元素到map时,如果前面已经存在一个相同的key,那么新的key对应的value将覆盖旧的value
  • Map接口的常用实现类:HashMap、LinkedHashMap、TreeMap、Properties

重要Map遍历

1)遍历entry(常用)

public static void main(String[] args) {
    Map<String, String> map = new HashMap<String, String>();
    map.put("Java入门教程", "http://c.biancheng.net/java/");
    map.put("C语言入门教程", "http://c.biancheng.net/c/");
    for (Map.Entry<String, String> entry : map.entrySet()) {
        String mapKey = entry.getKey();
        String mapValue = entry.getValue();
        System.out.println(mapKey + ":" + mapValue);
    }

2)遍历key或value

Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "http://c.biancheng.net/java/");
map.put("C语言入门教程", "http://c.biancheng.net/c/");
// 打印键集合
for (String key : map.keySet()) {
    System.out.println(key);
}
// 打印值集合
for (String value : map.values()) {
    System.out.println(value);
}

3)迭代器遍历

Map<String, String> map = new HashMap<String, String>();
map.put("Java入门教程", "http://c.biancheng.net/java/");
map.put("C语言入门教程", "http://c.biancheng.net/c/");
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Entry<String, String> entry = entries.next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + ":" + value);
}

4)键找值遍历

效率比较低,因为本身从键取值是耗时的操作

for(String key : map.keySet()){
    String value = map.get(key);
    System.out.println(key+":"+value);

4.2 HashMap

特点

  • entry顺序存储顺序与key的hash值有关,与put添加的顺序无关
  • HashMap是 Map 接口使用频率最高的实现类
  • 允许使用null键和null值,与HashSet一样,不保证映射的顺序
  • HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等
  • HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true

Map创建对象时指定初始值

// 其他类型的Map类也类似

HashMap hmap = new HashMap() {
    { // 匿名内部类
        put("type", "支出");
        put("price", price);
        put("item", item);
    }
};

注意: 慎用, 非静态内部类/ 匿名内部类包含了外围实例的引用, 如果拥有比外部类更长的生命周期,有内存泄露隐患

HashMap Test

4.3 LinkedHashMap

  • LinkedHashMap 是 HashMap 的子类
  • 与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序(使用链表):迭代顺序与 Key-Value 对的插入顺序一致

示例

4.4 TreeMap

  • TreeMap存储 Key-Value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态
  • TreeMap 的 Key 的排序:自然排序、定制排序
    • 自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口并重写int compareTo(Object obj)方法,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
    • 定制排序:创建 TreeMap 时,传入一个 Comparator 对象,要求重写Comparator接口中的int compare(Object o1, Object o2),该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
  • 使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0
  • 若使用自定义类作为TreeMap的key,所属类需要重写equals()和hashCode()方法,且equals()方法返回true时,compareTo()方法应返回0

示例
TreeMap Test

4.5 其它实现类

Hashtable

  • Hashtable是个古老的 Map 实现类,线程安全。
  • 与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value
  • 与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
  • Hashtable判断两个key相等、两个value相等的标准,与hashMap一致

Properties

  • Properties 类是 Hashtable 的子类,该对象用于处理属性文件
  • 由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型
  • 存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法

示例
Properties Test