Map 接口

概述

  • Interface Map<K,V>: K表示值的数据类型,V表示值的数据类型
  • 键不能重复,值可以重复
  • 键和值一一对应的,每一个值只能找到自己对应的值
  • (键 + 值)这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”
public class MapDemo1 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();

        map.put("001","张三");
        map.put("002","李四");
        map.put("003","王五");

        System.out.println(map);
    }
}

基本功能

V put(K key,V value):添加元素
V remove(Objectkey):根据键删除键值对元素
void clear():移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
Set<K>  keySet() 获取所有键的集合
V get(Object Key) 根据键获取值

public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
//        V put(K key,V value):添加元素
        map.put("001","小王");
        map.put("002","小张");
        map.put("003","小黄");
        map.put("004","小刘");

        System.out.println(map);
//        V remove(Objectkey):根据键删除键值对元素
        map.remove("003");
        System.out.println(map);
//        boolean containsKey(Object key)判断集合是否包含指定的键
        System.out.println(map.containsKey("001"));
        System.out.println(map.containsKey("006"));
//        boolean containsValue(Object value)判断集合是否包含指定的值

        System.out.println(map.containsValue("小王"));
        System.out.println(map.containsValue("小黄"));
//        boolean isEmpty()判断集合是否为空
        System.out.println(map.isEmpty());
//        int size()集合的长度,也就是集合中键值对的个数
        System.out.println(map.size());
//        void clear():移除所有的键值对元素
        map.clear();
        System.out.println(map);
    }
}

遍历Map集合

  • Set<Map.Entry<K,V> > entrySet()  获取所有键值对对象的集合
  • K getKey() 获得键
  • V getValue() 获得值

    public class MapDemo3 {
        public static void main(String[] args) {
            Map<String,String> map = new HashMap<>();
    
            map.put("一号客人","一号桌");
            map.put("二号客人","二号桌");
            map.put("三号客人","三号桌");
            map.put("四号客人","四号桌");
            map.put("五号客人","五号桌");
    
            Set<String> keys = map.keySet();
    
            for (String key : keys) {
                System.out.println(map.get(key)); 
            }
    
        }
    }

实现类

  • HashMap
  • TreeMap

HashMap

特点

  • HashMap跟HashSet一样底层是哈希表结构的
  • 依赖hashCode方法和equals方法保证键的唯一
  • 如果键要存储的是自定义对象,需要重写hashCode的equals方法
package com.BJ.Map;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class MapDemo5 {
public static void main(String[] args) {
HashMap<Student,String> hm = new HashMap<>();
Student s1 = new Student("小河",20);
    Student s2 = new Student("林格",22);
    Student s3 = new Student("小刘",20);

    hm.put(s1,"湖南");
    hm.put(s2,"湖北");
    hm.put(s3,"江苏");

    Set<Student> students = hm.keySet();
    for (Student student : students) {
        System.out.println(hm.get(student));
    }

    Set<Map.Entry<Student, String>> entries = hm.entrySet();

    for (Map.Entry<Student, String> entry : entries) {
        System.out.println(entry.getKey() + "-----"+ entry.getValue());
    }

    hm.forEach((Student s,String str)->{
        System.out.println(s+ "-----"+ str);
    });
}

}

public class Student {
private String name;
private int age;
public Student() {
}

public Student(String name, int age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public String toString() {
    return "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Student student = (Student) o;

    if (age != student.age) return false;
    return name != null ? name.equals(student.name) : student.name == null;
}

@Override
public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + age;
    return result;
}
}
}

#### TreeMap
- 底层是红黑树结构
- 依赖自然排序或者比较器排序,对**键**进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在吃鸡TreeMap的时候给出比较器排序规则

```Java
public class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public int compareTo(Student o) {
        int result = this.getAge() - o.getAge();
        result = result == 0 ? this.getName().compareTo(o.getName()) : result;
        return result; 
    }
}
public class MapDemo6 {
    public static void main(String[] args) {
        TreeMap<Student,String> tm = new TreeMap<>();

        Student s1 = new Student("xiaohei",23);
        Student s2 = new Student("xiaowang",25);
        Student s3 = new Student("xiaoliu",25);

        tm.put(s1,"江苏");
        tm.put(s2,"湖南");
        tm.put(s3,"四川");

        tm.forEach((Student s,String str)->{
            System.out.println(s+"----"+str);
        });
    }
}

拓展

增强for循环

只能遍历,不能增删,底层使用的也是迭代器。使用for循环的格式,简化了迭代器的书写
public interface Iterable<T>实现这个接口允许对象成为“foreach”语句的目标

格式:

for(元素的数据类型 变量;Collection集合or数组){
        //写操作代码
}

<think>首先,用户的问题是:“我想理解Map接口的详细解释和使用方法 请问Java Map 接口详解及常用方法”。这是一个关于Java Map接口的请求。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层的指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]: Map 接口和常用方法。Map.Entry是Map声明的一个内部接口... [^1] - 引用[2]: Map接口的常见方法。输出结果为: ... [^2] - 引用[3]: 详解Map接口常用的11种方法。... [^3] 这些引用是关于Java Map接口的,包括Map.Entry、get方法、entrySet方法等。用户的问题是关于Map接口的详解和常用方法,所以这些引用是相关的。 我需要构建一个结构清晰的回答: 1. **介绍Map接口**:解释它是什么,在Java中的作用。 2. **核心概念**:如Map.Entry接口。 3. **常用方法**:列出并解释主要方法,如put, get, containsKey, entrySet等。 4. **示例代码**:提供一些简单的Java代码示例。 5. **引用标识**:在相关部分自然地添加引用标识。 6. **生成相关问题**:在回答结束时添加相关问题。 使用中文回答。 生成相关问题:根据用户的问题,生成一些相关问题,如: - Map接口的实现类有哪些? - 如何遍历Map? - Map接口的线程安全性? 现在,结构回答: - **开头**:简要介绍Map接口。 - **主体**: - 解释Map接口的基本概念。 - 讨论Map.Entry接口。 - 列出并解释常用方法。 - 提供代码示例。 - **结尾**:总结并添加相关问题。 在回答中,自然地添加引用标识。例如,当提到Map.Entry时,添加[^1];当提到get方法时,添加[^2];当提到entrySet方法时,添加[^3]。 确保LaTeX正确:由于问题是关于Java的,可能没有数学表达式,但如果有数字或公式,使用LaTeX格式。例如,如果提到时间复杂度,可以用$O(1)$表示。 最终回答格式: - 使用中文。 - 结构清晰:分段落。 - 在结尾添加“相关问题”部分。</think>### Java Map 接口详解及常用方法 Map 接口Java 集合框架中的核心接口之一,用于存储键值对(key-value pairs)。它允许通过键(key)快速查找值(value),键是唯一的,值可以重复。Map 接口位于 `java.util` 包中,广泛应用于数据缓存、配置管理、数据库查询等场景。下面我将逐步解释其核心概念、常用方法及使用示例,确保内容清晰可靠。 #### 1. **Map 接口的基本概念** - Map 接口表示一个映射关系,每个键映射到一个值。键必须是唯一的(如果重复添加,新值会覆盖旧值),而值可以重复。 - Map 接口定义了多个实现类,如 `HashMap`(基于哈希表,高效但无序)、`TreeMap`(基于红黑树,有序)和 `LinkedHashMap`(保持插入顺序)。 - 一个核心内部接口是 `Map.Entry<K,V>`,它表示 Map 中的一个实体(一个键值对)。接口提供了 `getKey()` 和 `getValue()` 方法,用于获取键和值[^1]。 #### 2. **Map 接口的常用方法详解** 以下是 Map 接口中最常用的方法,包括它们的语法、功能和使用场景。我将基于引用内容进行解释,并添加代码示例。 - **put(K key, V value)**:添加或更新键值对。如果键已存在,则覆盖旧值;如果键不存在,则添加新条目。时间复杂度通常为 $O(1)$(在 HashMap 中)。 ```java Map<String, Integer> map = new HashMap<>(); map.put("诸葛亮", 1); // 添加新条目 map.put("诸葛亮", 2); // 更新值,键相同 System.out.println(map); // 输出: {诸葛亮=2} ``` - **get(Object key)**:根据键获取值。如果键存在,返回对应值;如果键不存在,返回 `null`。注意:基本类型(如 `int`)不能直接接收 `null`,需使用包装类(如 `Integer`)[^2]。 ```java Integer value = map.get("诸葛亮"); // 返回 2 Integer missing = map.get("苏妲己"); // 返回 null System.out.println("v1:" + value); // 输出: v1:2 System.out.println("v2:" + missing); // 输出: v2:null ``` - **containsKey(Object key)** 和 **containsValue(Object value)**:检查 Map 中是否包含指定键或值。返回布尔值。 ```java boolean hasKey = map.containsKey("诸葛亮"); // true boolean hasValue = map.containsValue(2); // true ``` - **entrySet()**:返回一个 `Set<Map.Entry<K,V>>` 视图,用于遍历所有键值对。这是高效遍历 Map 的标准方式[^3]。 ```java Set<Map.Entry<String, Integer>> entries = map.entrySet(); for (Map.Entry<String, Integer> entry : entries) { System.out.println(entry.getKey() + ": " + entry.getValue()); } // 输出示例: 诸葛亮: 2 ``` - **keySet()** 和 **values()**:分别返回所有键的 Set 视图和所有值的 Collection 视图。 ```java Set<String> keys = map.keySet(); // 获取所有键 Collection<Integer> values = map.values(); // 获取所有值 ``` - **remove(Object key)**:删除指定键的条目,并返回被删除的值(如果键存在)。 ```java Integer removedValue = map.remove("诸葛亮"); // 返回 2 ``` - **size()** 和 **isEmpty()**:返回 Map 的大小(条目数)和是否为空。 ```java int size = map.size(); // 当前条目数 boolean empty = map.isEmpty(); // 检查是否为空 ``` - **clear()**:清空 Map 中的所有条目。 ```java map.clear(); // 清空 Map ``` #### 3. **完整示例代码** 以下是一个综合示例,展示 Map 的基本操作: ```java import java.util.*; public class MapDemo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("诸葛亮", 1); map.put("刘伯温", 2); map.put("张良", 3); // 获取值 System.out.println("张良的值: " + map.get("张良")); // 输出: 3 // 遍历 entrySet Set<Map.Entry<String, Integer>> entries = map.entrySet(); for (Map.Entry<String, Integer> entry : entries) { System.out.println(entry.getKey() + " -> " + entry.getValue()); } // 输出: // 诸葛亮 -> 1 // 刘伯温 -> 2 // 张良 -> 3 // 删除条目 map.remove("诸葛亮"); System.out.println("删除后: " + map); // 输出: {刘伯温=2, 张良=3} } } ``` #### 4. **最佳实践和注意事项** - **线程安全**:标准 Map 实现(如 `HashMap`)不是线程安全的。多线程环境下,使用 `ConcurrentHashMap` 或 `Collections.synchronizedMap()`。 - **性能考虑**:`HashMap` 的查找和插入平均为 $O(1)$,但冲突时可能退化到 $O(n)$。`TreeMap` 的操作为 $O(\log n)$,适合排序需求。 - **空值处理**:键不能为 `null`(在 `HashMap` 中允许一个 `null` 键),值可以为 `null`。使用 `get()` 时,检查返回值是否为 `null` 以避免 `NullPointerException`[^2]。 - **遍历优化**:优先使用 `entrySet()` 遍历,比 `keySet()` 更高效,因为它避免了多次调用 `get()`[^3]。 Map 接口Java 开发的基础,掌握它可提升数据处理效率。如果您有具体场景问题,我可以进一步扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值