【Java】12 Map 集合

时间:2022-07-26
本文章向大家介绍【Java】12 Map 集合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Map 集合没有继承 Collection 接口,其提供的是 key 到 value 的映射,Map 中不能包含相同的 key 值,每个 key 只能影射一个 value。key 值还决定了存储对象在映射中的存储位置,但不是 key 对象本身决定的,而是通过散列技术进行处理,可产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。

1.1 Map 接口

   Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 key,另外一组值用于保存 Map 里的 value,key 和 value 都可以是任何引用类型的数据。Map 的 key 不允许重复,即同一个 Map 对象的任何两个 key 通过 equals 方法比较总是返回false。    key 和 value 之间存在单向一对一关系,即通过指定的 key,总能找到唯一的、确定的 value。从 Map 中取出数据时,只要给出指定的 key,就可以取出对应的 value 数据。

1.1.1 常用方法

方法名

说明

void clear( )

删除该 Map 对象中的所有 key-value 对

boolean containsKey(Object key)

查询 Map 中是否包含指定的 key,如果包含则返回 true

boolean containsValue(Object value)

查询 Map 中是否包含一个或多个 value,如果包含则返回 true。

Set entrySet( )

返回 Map 中包含的 key-value 对所组成的 Set 集合,每个集合元素都是 Map.Entry(Entry 是 Map 的内部类)对象

Object get(Object key)

返回指定 key 所对应的 value;如果此 Map 中不包含该 key,则返回 null

boolean isEmpty( )

查询该 Map 是否为空(即不包含任何 key-value 对),如果为空则返回 true

Set keySet( )

返回该 Map 中所有 key 组成的 Set 集合

void put(Object key,Object value)

添加一个 key-value 对,如果当前 Map 中已有一个与该 key 相等的 key-value 对,则新的 key-value 对会覆盖原来的 key-value 对

void putAll(Map map)

将指定 Map 中的 key-value 对复制到本 Map 中

Object remove(Object key)

删除指定 key 所对应的 key-value 对,返回被删除 key 所关联的 value,如果该 key 不存在,则返回 null

boolean remove(Object key,Object value)

从该 Map 中成功地删除该 key-value 对,该方法返回 true,否则返回 false

int size( )

返回该 Map 里的 key-value 对的个数

Collection values( )

返回该 Map 里所有 value 组成的 Collection

1.1.2 Map 的遍历

Map 中包括一个内部类 Entry,该类封装了一个 key-value 对。Entry 包含如下三个方法: Object getKey( ):返回该Entry里包含的key值。 Object getValue( ):返回该Entry里包含的value值。 Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。 可以通过遍历 Entry 进而遍历 Map。

public class Test {
    public static void main(String[] args) {
        // 创建 Map 集合对象
        Map<String, String> map = new HashMap<>();
        // 添加元素到集合
        map.put("壹", "刘备");
        map.put("贰", "曹操");
        map.put("叁", "孙权");

        // 获取 所有的 entry 对象
        Set<Map.Entry<String, String>> entries = map.entrySet();

        // 遍历得到每一个 entry 对象
        for (Map.Entry<String, String> entry : entries) {
            // 进而遍历 Map
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println( key + " : " + value);
        }
    }
}

通过 Map 提供的 keySet( ) 方法获取所有 key 组成的集合,进而遍历 Map 中所有的 key-value 对

public class Test {
    public static void main(String[] args) {
        // 创建 Map 集合对象
        Map<String, String> map = new HashMap<>();
        // 添加元素到集合
        map.put("壹", "刘备");
        map.put("贰", "曹操");
        map.put("叁", "孙权");

        // 获取 所有的 entry 对象
        Set<String> strings = map.keySet();

        // 遍历得到每一个 map 对象
        for (String string : strings) {
            String value = map.get(string);
            System.out.println( string + " : " + value);
        }
    }
}

1.2 Map 的实现类

1.2.1 HashMap 集合

   当给 HashMap 中存放自定义对象时,如果自定义对象作为 key 存在,这时要保证对象唯一,必须复写对象的 hashCode 和 equals 方法。HashMap 提供了一个保证 Map 中存取的顺序一致的 LinkedHashMap 集合(通过链表结构可以保证元素的存取顺序一致)。

public class Test {
    public static void main(String[] args) {
        // 创建 Map 集合对象
        Map<String, String> map = new LinkedHashMap<>();
        // 添加元素到集合
        map.put("壹", "刘备");
        map.put("贰", "曹操");
        map.put("叁", "孙权");

        // 获取 所有的 entry 对象
        Set<String> strings = map.keySet();

        // 遍历得到每一个 map 对象
        for (String string : strings) {
            String value = map.get(string);
            System.out.println( string + " : " + value);
        }
    }
}

1.2.2 Hashtable 集合

   从 Hashtable 的类名上就可以看出它是一个古老的类,它的命名甚至没有遵守 Java 的命名规范,现在 Hashtable 本身已经淡出了我们的视野。但是 Hashtable 提供了一个 Properties 子类,该对象在处理属性文件时特别方便,Properties 类可以把 Map 对象和属性文件关联起来,从而可以把 Map 对象中的 key-value 对写入属性文件中,也可以把属性文件中的 “属性名=属性值” 加载到 Map 对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以 Properties 里的 key、value 都是字符串类型。

常用方法

方法名

说明

String getProperty(String key)

获取 Properties 中指定属性名对应的属性值

String getProperty(String key,String defaultValue)

获取 Properties 中指定属性名对应的属性值 ,如果 Properties 中不存在指定的 key 时,则该方法指定默认值

Object setProperty(String key,String value)

设置属性值

void load(InputStream inStream)

从属性文件中加载 key-value 对,把加载到的 key-value 对追加到 Properties 里

void store(OutputStream out,String comments)

将 Properties 中的 key-value 对输出到指定的属性文件中

1.2.3 SortedMap 接口

SortedMap 接口提供了一个 key 有序的子类 TreeMap。

TreeMap 构造方法


public TreeMap( )    使用其键的自然排序构造一个 TreeMap。 插入 TreeMap 的所有键都必须实现 Comparable 接口。 此外,所有这些 key 必须是相互可比的 : k1.compareTo(k2) 不能为 ClassCastException 中的任何键 k1 和 k2 。 如果试图将一个违反此约束的键放入 TreeMap 中(例如,用户尝试将一个字符串键放入一个键为整数的 TreeMap 中),则 put(Object key, Object value) 方法将抛出 ClassCastException 。


public TreeMap(Comparator<? super K> comparator)    构造一个 TreeMap,按照给定的比较器排序。 插入到 TreeMap 中的所有键必须由给定的比较器相互比较 : comparator.compare(k1, k2) 不得为 ClassCastException 中的任何键 k1 和 k2 。 如果试图将一个违反此约束的键放入 TreeMap 中,则 put(Object key, Object value) 方法将抛出 ClassCastException 。 参数   comparator - 将用于创建 TreeMap 的比较器。