Entry 是 “容器中的每个元素”
在 Java 集合框架中,interface Entry<K, V>
(完整类名 java.util.Map.Entry<K, V>
)是 Map
接口的内部接口,用于表示 Map
中的一个键值对(key-value pair)。它是 Map
存储数据的基本单元,所有实现 Map
接口的类(如 HashMap
、TreeMap
等)都通过实现 Entry
接口来管理键值对。
核心作用
Map
本身存储的是一组键值对,但 Map
接口本身不直接存储单个键值对,而是通过内部的 Entry
接口实例来封装每个键值对。简单来说:
Map
是 “容器”,负责管理所有键值对;Entry
是 “容器中的每个元素”,负责封装单个key
和对应的value
。
主要方法
Entry<K, V>
接口定义了操作单个键值对的核心方法,所有实现类(如 HashMap.Node
、TreeMap.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() )。 |
关键特性
键值绑定:
Entry
将key
和value
绑定为一个整体,确保两者的关联性(例如修改value
时不会脱离对应的key
)。与
Map
的依赖关系:Entry
是Map
的内部接口,必须通过Map
的实现类才能创建其实例(无法直接new Entry()
)。Map
通过entrySet()
方法返回所有Entry
的集合(Set<Entry<K, V>>
),用于遍历所有键值对。
实现类的多样性:不同
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 协议》,转载必须注明作者和本文链接