Map集合概述

本文介绍了Java中Map接口的基本概念及特点,包括键值对的唯一性、查询方式等,并详细探讨了HashMap、LinkedHashMap和TreeMap等常用实现类的特点与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
    java.util.Map<K,V>是双列集合的根接口,java.util.Collection<E>是单列结合的根接口,它俩没有关系
    Map接口有两个泛型:
    第一个泛型:键的类型
    第二泛型:值的类型

    二者可以相同,也可以不同
    特点:
        1.键必须唯一
        2.可以根据键获取值
        3.但不能根据值找键
        4.将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

    常用的实现类:
    1.HashMap集合:HashSet集合底层采用的是HashMap,所以HashMap里面也有一个哈希表结构,所以查询速度特别快
        哈希特性:针对的是键(键无序,不可重复)
    2.LinkedHashMap集合:是HashMap的子类,里面也有一个哈希表结构,额外提供了一个双向链表,用来维护顺序(存入和取出的顺序是一致)
        链表的特性和哈希特性:针对的是键(键有序,不可重复)
    3.TreeMap集合:可以实现排序

    Map集合要求键唯一,所以如果采用自定义类型作为键的话,必须覆盖重写equals和hashCode方法


    Map接口中定义了很多方法,常用的如下:

    - public V put(K key, V value):  把指定的键与指定的值添加到Map集合中。
            -如果key不存在,返回的值null
            -如果键存在,返回的是键对应的之前的value值
    - public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
    - public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
    - public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
    - Collection<V> values() :获取所有的值对应的Collection集合


 */
public class Demo01Map {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        String value = map.put("001", "张三");
        System.out.println(map);//{001=张三}
        System.out.println(value);//null
        value = map.put("001","张三三");
        System.out.println(value);//张三
        System.out.println(map);//{001=张三三}
        System.out.println("===========");
        map.put("002", "李四");
        map.put("003", "王五");
        map.put("004", "赵六");
        System.out.println(map);//{001=张三三, 002=李四, 003=王五, 004=赵六}
        String whoRemoved = map.remove("001");
        System.out.println("谁被删除了呢?"+whoRemoved);//张三三
        System.out.println(map);//{002=李四, 003=王五, 004=赵六}
        System.out.println( map.remove(100));//null,如果指定的键不存在,返回null
        System.out.println("============");
        String name = map.get("004");//获取004键对应的值
        System.out.println(name);//赵六
        name = map.get("040");//获取040键对应的值,不存在返回null
        System.out.println(name);//null
        System.out.println("============");
        System.out.println("map集合中有几对元素: "+map.size());
        System.out.println("map集合是否为空: "+map.isEmpty());

        //获取map集合所有的键对应的Set集合
        Set<String> set = map.keySet();
        //遍历
        //迭代器
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            String id = it.next();
            System.out.println(id);
        }
        System.out.println("============");
        //使用增强for
        for(String s : set) {
            System.out.println(s);
        }
        for(String s : map.keySet()) {
            System.out.println(s);
        }
        System.out.println("============");
        //获取所有的值对应的集合
        Collection<String> coll = map.values();
        //迭代器...
        //增强for
        for(String s : coll) {
            System.out.println(s);
        }
        System.out.println("============");
        //增强for
        for(String s : map.values()) {
            System.out.println(s);
        }
    }
}

/*
    添加:put
    根据键获取值:V get(Object key)
    根据键删除:V remove(Object key)
    获取所有的键对应的集合:keySet
    获取所有的值对应的集合:values
 */
 

### 关于Map集合的使用方法 #### JavaMap 集合概述 `Map` 是一种键值对的数据结构,在 Java 中由 `java.util.Map` 接口表示。它允许存储 `<K, V>` 形式的键值对,其中键 (`K`) 唯一,而值 (`V`) 可以重复[^4]。 以下是几个常用的 `Map` 实现类及其特点: - **HashMap**: 不保证迭代顺序,支持 null 键和 null 值。 - **LinkedHashMap**: 维护插入顺序或访问顺序。 - **TreeMap**: 按照键的自然顺序或指定比较器排序[^1]。 - **ConcurrentHashMap**: 提供线程安全的操作。 #### 创建和初始化 Map 的方式 可以通过以下几种方式创建并初始化一个 `Map` 对象: ```java import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { // 方法 1: 使用 put 添加元素 Map<String, Integer> map1 = new HashMap<>(); map1.put("Java", 1); map1.put("Python", 2); // 方法 2: 初始化时直接赋值 (仅适用于静态上下文) Map<String, Integer> map2 = Map.of("Java", 1, "Python", 2); // JDK 9+ // 方法 3: 动态初始化多个键值对 Map<String, Integer> map3 = new HashMap<>() {{ put("Java", 1); put("Python", 2); }}; } } ``` #### 访问和修改 Map 元素的方法 可以利用以下常用 API 来操作 `Map`: - 获取某个键对应的值:`get(Object key)` - 判断是否存在某键:`containsKey(Object key)` - 删除某个键值对:`remove(Object key)` - 修改某个键的值:`put(K key, V value)` 如果键已存在则覆盖旧值 - 遍历所有键值对:通过 `entrySet()` 返回一组 `Entry<K, V>` 类型的对象 示例代码如下所示: ```java import java.util.Map; import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { Map<String, Integer> map = new TreeMap<>(); // 自动按字母序排列 map.put("Java", 10); map.put("Python", 20); map.put("C++", 5); for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } // 输出 C++, Java 和 Python 的有序结果 } } ``` 当 Key 是自定义对象而非基本类型时,需确保该类实现了 `Comparable` 接口或者向构造函数传入定制化的 Comparator[^3]^。 #### 数据结构背景知识 数据结构是一门专注于研究如何有效地组织、管理和处理数据的技术领域[^2]。对于像 `Map` 这样的关联容器来说,它们属于非线性的高级抽象层次上的工具之一。理解底层原理有助于优化程序性能以及解决复杂场景下的实际问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值