gpt4 book ai didi

java - ConcurrenLinkedtHashmap 迭代器提供的元素顺序取决于 key 大小?

转载 作者:行者123 更新时间:2023-11-30 06:14:12 25 4
gpt4 key购买 nike

我发现(迭代器?)ConcurrentLinkedHashMap 的奇怪行为。如果键很长,通过迭代 entrySet/keySet 获得的元素会以奇怪/意外的顺序排列。如果 key 短,一切正常。

以下代码:

    public static void main(String[] args) {
ConcurrentLinkedHashMap<String, String> map =
new ConcurrentLinkedHashMap.Builder<String, String>().maximumWeightedCapacity(1000).build();
for (int i = 0; i < 5; i++) {
map.put(i + "", i + "");
}
print(map);
map.clear();
// NOW AGAIN THE SAME, BUT WITH LONG KEY
for (int i = 0; i < 5; i++) {
map.put(i + "aaaaaaaaaaaaaaaaaaaaaaaaaa" +
"aaaaaaaaaaaaaaaaaaaaaaaaaa" +
"aaaaaaaaaaaaaaaaaaaaaaaaaa", i + "");
}
print(map);
}

private static void print(ConcurrentLinkedHashMap<String, String> a) {
Iterator iterator = a.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(" = " + iterator.next());
}
}

提供这样的输出:

 = 0=0
= 1=1
= 2=2
= 3=3
= 4=4
= 1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1
= 4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=4
= 2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=2
= 3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=3
= 0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=0

这很奇怪。如果我使 key 更长-结果不同。

这是一个错误吗?我怎样才能得到正确的结果?(第二个“打印”结果应与第一个顺序相同)

最佳答案

Unlike java.util.LinkedHashMap, this class does not provide predictable iteration order. (Javadoc)

文档对此很清楚 - 所以没有错误

关于遍历条目时的顺序,ConcurrentLinkedHashMap 提供了 ascendingdescending保留 key 的顺序。这可能并不总是您的目标,但至少对于给定的测试场景,在给定以下代码的情况下返回有序输出:

private static void print(ConcurrentLinkedHashMap<String, String> a)
{
Iterator iterator = a.entrySet().iterator();
while (iterator.hasNext())
{
System.out.println(" = " + iterator.next());
}
Iterator<String> iter = a.ascendingKeySet().iterator();
while (iter.hasNext())
{
String key = iter.next();
System.out.println(key + " -> " + a.get(key));
}
}

输出:

 = 0=0
= 1=1
= 2=2
= 3=3
= 4=4
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
= 1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1
= 4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=4
= 2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=2
= 3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=3
= 0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=0
0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> 0
1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> 1
2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> 2
3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> 3
4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> 4

关于java - ConcurrenLinkedtHashmap 迭代器提供的元素顺序取决于 key 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com