我发现了(iterator?)ConcurrentLinkedHashMap的奇怪行为.如果key很长,则通过迭代entrySet/keySet获得的元素是奇怪/意外的顺序.如果钥匙短,一切都好.
以下代码:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
提供这样的输出:
= 0=0
= 1=1
= 2=2
= 3=3
= 4=4
= 1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1
= 4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=4
= 2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=2
= 3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=3
= 0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=0
Run Code Online (Sandbox Code Playgroud)
这很奇怪.如果我让钥匙更长 - 结果是不同的.
这是一个错误吗?我怎样才能得到正确的结果?(第二个'打印'结果应该与第一个相同)
与
java.util.LinkedHashMap此类不同,此类不提供可预测的迭代顺序.(Javadoc)
文档相当清楚 - 所以没有错误
关于在迭代条目时的条目顺序,ConcurrentLinkedHashMap提供关于密钥保留的升序和降序.这可能并不总是您的目标,但至少对于给定的测试场景,返回给定以下代码的有序输出:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
= 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |