Entry 是 “容器中的每个元素”

AI摘要
本文介绍了Java集合框架中的Map.Entry接口。它作为Map的内部接口,用于封装单个键值对,是Map存储数据的基本单元。核心作用是将键与值绑定为一个整体,并通过entrySet()方法支持高效遍历。主要方法包括getKey()、getValue()和setValue()等。不同Map实现类(如HashMap、TreeMap)有各自的Entry实现,以适配不同存储结构。使用时需注意键的不可变性和线程安全性。

在 Java 集合框架中,interface Entry<K, V>(完整类名 java.util.Map.Entry<K, V>)是 Map 接口的内部接口,用于表示 Map 中的一个键值对(key-value pair)。它是 Map 存储数据的基本单元,所有实现 Map 接口的类(如 HashMapTreeMap 等)都通过实现 Entry 接口来管理键值对。

核心作用

Map 本身存储的是一组键值对,但 Map 接口本身不直接存储单个键值对,而是通过内部的 Entry 接口实例来封装每个键值对。简单来说:

  • Map 是 “容器”,负责管理所有键值对;
  • Entry 是 “容器中的每个元素”,负责封装单个 key 和对应的 value

主要方法

Entry<K, V> 接口定义了操作单个键值对的核心方法,所有实现类(如 HashMap.NodeTreeMap.Entry)都必须实现这些方法:

方法 作用
K getKey() 返回当前键值对中的 key(键)。
V getValue() 返回当前键值对中的 value(值)。
V setValue(V value) 修改当前键值对中的 value,返回修改前的旧值。
boolean equals(Object o) 判断两个 Entry 对象是否相等(键和值都相等时返回 true)。
int hashCode() 返回当前 Entry 的哈希值(通常为 key.hashCode() ^ value.hashCode())。

关键特性

  1. 键值绑定Entrykeyvalue 绑定为一个整体,确保两者的关联性(例如修改 value 时不会脱离对应的 key)。

  2. Map 的依赖关系

    • EntryMap 的内部接口,必须通过 Map 的实现类才能创建其实例(无法直接 new Entry())。
    • Map 通过 entrySet() 方法返回所有 Entry 的集合(Set<Entry<K, V>>),用于遍历所有键值对。
  3. 实现类的多样性:不同 Map 实现类对 Entry 的实现不同,以适配自身的存储结构:

    • HashMap 中用 Node<K, V> 实现 Entry(基于哈希表存储);
    • TreeMap 中用 Entry<K, V> 内部类实现(基于红黑树存储,支持排序);
    • LinkedHashMap 中用 LinkedHashMap.Entry 实现(额外维护链表,保留插入顺序)。

使用场景

最常见的场景是遍历 Map 中的所有键值对。通过 Map.entrySet() 获取 Entry 集合后,迭代集合即可高效访问每个键值对(比单独遍历 key 再通过 get(key) 获取 value 更高效,避免重复查询)。

示例代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class EntryExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 20);
        map.put("李四", 22);

        // 获取所有 Entry 组成的 Set 集合
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

        // 遍历 Entry 集合,访问每个键值对
        for (Map.Entry<String, Integer> entry : entrySet) {
            String key = entry.getKey();       // 获取键
            Integer value = entry.getValue();   // 获取值
            System.out.println(key + ":" + value);

            // 可选:修改值
            if (key.equals("张三")) {
                entry.setValue(21); // 将"张三"的年龄改为21,返回旧值20
            }
        }
    }
}
输出:
plaintext
张三:20
李四:22

key 的不可变性:Entry 接口没有提供 setKey() 方法,因为 Map 要求 key 一旦存入,通常不允许修改(否则会破坏 Map 的存储结构,如哈希表的哈希值依赖 key)。
equals() 和 hashCode() 的实现:
两个 Entry 相等的标准是:key 相等且 value 相等(即 e1.getKey().equals(e2.getKey()) && e1.getValue().equals(e2.getValue()))。
hashCode() 通常通过 key 和 value 的哈希值组合计算(如 key.hashCode() ^ value.hashCode()),以保证 Entry 在 Set 中存储时的一致性(entrySet() 返回的是 Set 集合,要求元素不可重复)。
线程安全性:若 Map 本身不是线程安全的(如 HashMap),其 Entry 对象也不具备线程安全性,多线程操作时需额外同步。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!