+ * 如果key已存在但value不同,会在反向Map中移除旧的value到key的映射,并建立新的value到key的映射
+ *
+ * @param key 键
+ * @param value 值
+ * @return 与key关联的旧值,如果key不存在则返回null
+ */
@Override
public V put(final K key, final V value) {
final V oldValue = super.put(key, value);
@@ -63,6 +72,11 @@ public class BiMap
+ * 只有当键成功添加到主Map时(即键之前不存在),才会同步更新反向Map,确保双向映射的一致性
+ *
+ * @param key 与指定值关联的键
+ * @param value 与指定键关联的值
+ * @return 与指定键关联的当前值,如果没有映射则返回null
+ */
@Override
public V putIfAbsent(final K key, final V value) {
- if (null != this.inverse) {
- this.inverse.putIfAbsent(value, key);
+ final V oldValue = super.putIfAbsent(key, value);
+ // 只有当oldValue为null时(即key之前不存在),才更新反向Map
+ if (null == oldValue && null != this.inverse) {
+ this.inverse.put(value, key);
}
- return super.putIfAbsent(key, value);
+ return oldValue;
}
+ /**
+ * 如果指定的键尚未与值关联(或映射到null),则使用给定的映射函数计算其值并放入此Map中
+ *
+ * 由于此操作可能会修改Map的映射关系,因此在操作完成后会重置反向Map,下次访问时会重新构建
+ *
+ * @param key 与计算值关联的键
+ * @param mappingFunction 用于计算值的映射函数
+ * @return 与指定键关联的当前(现有的或计算的)值,如果计算的值为null则返回null
+ */
@Override
public V computeIfAbsent(final K key, final Function super K, ? extends V> mappingFunction) {
final V result = super.computeIfAbsent(key, mappingFunction);
@@ -128,6 +178,16 @@ public class BiMap
+ * 如果重新映射函数返回null,则移除该映射关系。由于此操作会修改Map的映射关系,
+ * 因此在操作完成后会重置反向Map,下次访问时会重新构建
+ *
+ * @param key 与指定值关联的键
+ * @param remappingFunction 用于计算值的重新映射函数
+ * @return 与指定键关联的新值,如果不存在则返回null
+ */
@Override
public V computeIfPresent(final K key, final BiFunction super K, ? super V, ? extends V> remappingFunction) {
final V result = super.computeIfPresent(key, remappingFunction);
@@ -135,6 +195,16 @@ public class BiMap
+ * 此方法用于为指定的键计算新的值。如果重新映射函数返回null,则移除该映射关系(如果存在)。
+ * 由于此操作会修改Map的映射关系,因此在操作完成后会重置反向Map,下次访问时会重新构建
+ *
+ * @param key 与指定值关联的键
+ * @param remappingFunction 用于计算值的重新映射函数
+ * @return 与指定键关联的新值,如果不存在则返回null
+ */
@Override
public V compute(final K key, final BiFunction super K, ? super V, ? extends V> remappingFunction) {
final V result = super.compute(key, remappingFunction);
@@ -142,6 +212,17 @@ public class BiMap
+ * 否则,使用给定的重新映射函数的结果替换关联的值,如果结果为null则移除该映射关系。
+ * 由于此操作会修改Map的映射关系,因此在操作完成后会重置反向Map,下次访问时会重新构建
+ *
+ * @param key 与指定值关联的键
+ * @param value 要与键关联的非null值
+ * @param remappingFunction 用于重新计算值的重新映射函数
+ * @return 与指定键关联的新值,如果不存在则返回null
+ */
@Override
public V merge(final K key, final V value, final BiFunction super V, ? super V, ? extends V> remappingFunction) {
final V result = super.merge(key, value, remappingFunction);
diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/map/MapProxy.java b/hutool-core/src/main/java/cn/hutool/v7/core/map/MapProxy.java
index 9413f25cb..8a18646d4 100644
--- a/hutool-core/src/main/java/cn/hutool/v7/core/map/MapProxy.java
+++ b/hutool-core/src/main/java/cn/hutool/v7/core/map/MapProxy.java
@@ -139,6 +139,24 @@ public class MapProxy implements Map