修复CaseInsensitiveLinkedMap顺序错误问题

This commit is contained in:
Looly
2024-06-12 15:30:15 +08:00
parent 80b1b5009b
commit 6b3f5c4397
4 changed files with 47 additions and 19 deletions

View File

@@ -73,7 +73,7 @@ public class CaseInsensitiveLinkedMap<K, V> extends CaseInsensitiveMap<K, V> {
* @param loadFactor 加载因子 * @param loadFactor 加载因子
*/ */
public CaseInsensitiveLinkedMap(final int initialCapacity, final float loadFactor) { public CaseInsensitiveLinkedMap(final int initialCapacity, final float loadFactor) {
super(new LinkedHashMap<>(initialCapacity, loadFactor)); super(MapBuilder.of(new LinkedHashMap<>(initialCapacity, loadFactor)));
} }
// ------------------------------------------------------------------------- Constructor end // ------------------------------------------------------------------------- Constructor end
} }

View File

@@ -49,7 +49,7 @@ public class CaseInsensitiveMap<K, V> extends FuncKeyMap<K, V> {
/** /**
* 构造<br> * 构造<br>
* 注意此构造将传入的Map作为被包装的Map针对任何修改传入的Map都会被同样修改 * 注意此构造将传入的Map所有值复制到当前map中修改传入map
* *
* @param m 被包装的自定义Map创建器 * @param m 被包装的自定义Map创建器
*/ */

View File

@@ -14,7 +14,6 @@ package org.dromara.hutool.core.map;
import java.util.Comparator; import java.util.Comparator;
import java.util.Map; import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
/** /**
@@ -49,23 +48,13 @@ public class CaseInsensitiveTreeMap<K, V> extends CaseInsensitiveMap<K, V> {
this.putAll(m); this.putAll(m);
} }
/**
* 构造
*
* @param m Map初始Map键值对会被复制到新的TreeMap中
* @since 3.1.2
*/
public CaseInsensitiveTreeMap(final SortedMap<? extends K, ? extends V> m) {
super(new TreeMap<K, V>(m));
}
/** /**
* 构造 * 构造
* *
* @param comparator 比较器,{@code null}表示使用默认比较器 * @param comparator 比较器,{@code null}表示使用默认比较器
*/ */
public CaseInsensitiveTreeMap(final Comparator<? super K> comparator) { public CaseInsensitiveTreeMap(final Comparator<? super K> comparator) {
super(new TreeMap<>(comparator)); super(MapBuilder.of(new TreeMap<>(comparator)));
} }
// ------------------------------------------------------------------------- Constructor end // ------------------------------------------------------------------------- Constructor end
} }

View File

@@ -16,6 +16,9 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CaseInsensitiveMapTest { public class CaseInsensitiveMapTest {
@@ -23,16 +26,16 @@ public class CaseInsensitiveMapTest {
public void caseInsensitiveMapTest() { public void caseInsensitiveMapTest() {
final CaseInsensitiveMap<String, String> map = new CaseInsensitiveMap<>(); final CaseInsensitiveMap<String, String> map = new CaseInsensitiveMap<>();
map.put("aAA", "OK"); map.put("aAA", "OK");
Assertions.assertEquals("OK", map.get("aaa")); assertEquals("OK", map.get("aaa"));
Assertions.assertEquals("OK", map.get("AAA")); assertEquals("OK", map.get("AAA"));
} }
@Test @Test
public void caseInsensitiveLinkedMapTest() { public void caseInsensitiveLinkedMapTest() {
final CaseInsensitiveLinkedMap<String, String> map = new CaseInsensitiveLinkedMap<>(); final CaseInsensitiveLinkedMap<String, String> map = new CaseInsensitiveLinkedMap<>();
map.put("aAA", "OK"); map.put("aAA", "OK");
Assertions.assertEquals("OK", map.get("aaa")); assertEquals("OK", map.get("aaa"));
Assertions.assertEquals("OK", map.get("AAA")); assertEquals("OK", map.get("AAA"));
} }
@Test @Test
@@ -44,6 +47,42 @@ public class CaseInsensitiveMapTest {
map.merge(b.getKey(), b.getValue(), (A, B) -> A); map.merge(b.getKey(), b.getValue(), (A, B) -> A);
map.merge(a.getKey(), a.getValue(), (A, B) -> A); map.merge(a.getKey(), a.getValue(), (A, B) -> A);
Assertions.assertEquals(1, map.size()); assertEquals(1, map.size());
}
@Test
public void issueIA4K4FTest() {
final Map<String, Object> map = new CaseInsensitiveLinkedMap<>();
map.put("b", 2);
map.put("a", 1);
final AtomicInteger index = new AtomicInteger();
map.forEach((k, v) -> {
if(0 == index.get()){
assertEquals("b", k);
} else if(1 == index.get()){
assertEquals("a", k);
}
index.getAndIncrement();
});
}
@Test
public void issueIA4K4FTest2() {
final Map<String, Object> map = new CaseInsensitiveTreeMap<>();
map.put("b", 2);
map.put("a", 1);
final AtomicInteger index = new AtomicInteger();
map.forEach((k, v) -> {
if(0 == index.get()){
assertEquals("a", k);
} else if(1 == index.get()){
assertEquals("b", k);
}
index.getAndIncrement();
});
} }
} }