Java SE day13

一、什么是 Map

Java 中的 Map 接口 是和 Collection 接口 同一等级的集合根接口,它 表示一个键值对 (key-value) 的映射。类似数学中 函数 的概念。

数学中的函数:

一个 Map 中,任意一个 key 都有唯一确定的 value 与其对应,这个 key-value 的映射就是 map。

Map 中元素的顺序取决于迭代器迭代时的顺序,有的实现类保证了元素输入输出时的顺序,比如说 TreeMap;有的实现类则是无序的,比如 HashMap。

二、Map集合遍历的五种方式

1.通过Map.KeySet遍历key和value

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

2.通过Map.entrySet使用iterator遍历key和value

Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            System.out.println("key: " + entry.getKey() + " value: " + entry.getValue());
        }

3.通过Map.entrySet遍历key和value

for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("key: " + entry.getKey() + " value: " + entry.getValue());
        }

4.通过Map.values()遍历value,无法遍历key

for (String value : map.values()) {
            System.out.println(" value: " + value);
        }

5.通过Map.keySet()key,无法遍历value

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

三、 Map 的4种主要实现类

Hashtable
古老,线程安全
HashMap
速度很快,但没有顺序
TreeMap
有序的,效率比 HashMap 低
LinkedHashMap
结合 HashMap 和 TreeMap 的有点,有序的同时效率也不错,仅比 HashMap 慢一点
其中后三个的区别很类似 Set 的实现类:

HashSet
TreeSet
LinkedHashSet
Map 的每个实现类都应该实现 2 个构造方法:

无参构造方法,用于创建一个空的 map
参数是 Map 的构造方法,用于创建一个包含参数内容的新 map
第二种构造方法允许我们复制一个 map。

虽然没有强制要求,但自定义 Map 实现类时最好都这样来。

总结

Map 有以下特点:

没有重复的 key
每个 key 只能对应一个 value, 多个 key 可以对应一个 value
key,value 都可以是任何引用类型的数据,包括 null
Map 取代了古老的 Dictionary 抽象类
注意:
可以使用 Map 作为 Map 的值,但禁止使用 Map 作为 Map 的键。因为在这么复杂的 Map 中,equals() 方法和 hashCode() 比较难定义。

另一方面,你应该尽量避免使用“可变”的类作为 Map 的键。如果你将一个对象作为键值并保存在 Map 中,之后又改变了其状态,那么 Map 就会产生混乱,你所保存的值可能丢失。


猜你喜欢

转载自blog.csdn.net/zihu357/article/details/82830793