diff --git a/hutool-core/src/main/java/cn/hutool/core/map/BiMap.java b/hutool-core/src/main/java/cn/hutool/core/map/BiMap.java
index 1659b0d6e..ff37ca706 100644
--- a/hutool-core/src/main/java/cn/hutool/core/map/BiMap.java
+++ b/hutool-core/src/main/java/cn/hutool/core/map/BiMap.java
@@ -1,6 +1,8 @@
package cn.hutool.core.map;
import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Function;
/**
* 双向Map
@@ -83,4 +85,49 @@ public class BiMap extends MapWrapper {
public K getKey(final V value) {
return getInverse().get(value);
}
+
+ @Override
+ public V putIfAbsent(final K key, final V value) {
+ if (null != this.inverse) {
+ this.inverse.putIfAbsent(value, key);
+ }
+ return super.putIfAbsent(key, value);
+ }
+
+ @Override
+ public V computeIfAbsent(final K key, final Function super K, ? extends V> mappingFunction) {
+ final V result = super.computeIfAbsent(key, mappingFunction);
+ resetInverseMap();
+ return result;
+ }
+
+ @Override
+ public V computeIfPresent(final K key, final BiFunction super K, ? super V, ? extends V> remappingFunction) {
+ final V result = super.computeIfPresent(key, remappingFunction);
+ resetInverseMap();
+ return result;
+ }
+
+ @Override
+ public V compute(final K key, final BiFunction super K, ? super V, ? extends V> remappingFunction) {
+ final V result = super.compute(key, remappingFunction);
+ resetInverseMap();
+ return result;
+ }
+
+ @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);
+ resetInverseMap();
+ return result;
+ }
+
+ /**
+ * 重置反转的Map,如果反转map为空,则不操作。
+ */
+ private void resetInverseMap() {
+ if (null != this.inverse) {
+ inverse = null;
+ }
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
index ebdee040a..b8cbec6dd 100644
--- a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
@@ -174,8 +174,8 @@ public class SyncFinisher implements Closeable {
} else {
this.executorService.shutdown();
}
+ this.executorService = null;
}
- this.executorService = null;
clearWorker();
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/map/BiMapTest.java b/hutool-core/src/test/java/cn/hutool/core/map/BiMapTest.java
index 7dc91e5f0..a26816b64 100644
--- a/hutool-core/src/test/java/cn/hutool/core/map/BiMapTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/map/BiMapTest.java
@@ -19,4 +19,26 @@ public class BiMapTest {
Assert.assertEquals("aaa", biMap.getKey(111));
Assert.assertEquals("bbb", biMap.getKey(222));
}
+
+ @Test
+ public void computeIfAbsentTest(){
+ final BiMap biMap = new BiMap<>(new HashMap<>());
+ biMap.put("aaa", 111);
+ biMap.put("bbb", 222);
+
+ biMap.computeIfAbsent("ccc", s -> 333);
+ Assert.assertEquals(new Integer(333), biMap.get("ccc"));
+ Assert.assertEquals("ccc", biMap.getKey(333));
+ }
+
+ @Test
+ public void putIfAbsentTest(){
+ final BiMap biMap = new BiMap<>(new HashMap<>());
+ biMap.put("aaa", 111);
+ biMap.put("bbb", 222);
+
+ biMap.putIfAbsent("ccc", 333);
+ Assert.assertEquals(new Integer(333), biMap.get("ccc"));
+ Assert.assertEquals("ccc", biMap.getKey(333));
+ }
}