【发布时间】:2019-07-09 12:38:11
【问题描述】:
根据下面的代码,hashmap 初始默认容量为 16,LF 为 0.75,所以当我输入第 13 个元素时,应该进行重新散列,因为我提供了一个恒定的散列码,它在内部维护一个链表来维护插入顺序。所以,直到第 10 个元素它按预期工作,但是当我输入第 11 个元素时,它会打乱顺序。 任何人都可以帮助我理解为什么它只在第 11 个元素插入时发生。
class A{
int a;
A(int a){
this.a = a;
}
@Override
public int hashCode() {
return 7;
}
@Override
public String toString() {
return "" + a + "";
}
}
class Base {
public static void main(String[] args) {
Map<Object, Integer> m = new HashMap<Object, Integer>();
m.put(new A(1), 1);
m.put(new A(2), 1);
m.put(new A(3), 1);
m.put(new A(4), 1);
m.put(new A(5), 1);
m.put(new A(6), 1);
m.put(new A(7), 1);
m.put(new A(8), 1);
m.put(new A(9), 1);
m.put(new A(10), 1);
//m.put(new A(11), 1);
System.out.println(m);
}
}
直到第 10 个元素我得到的输出:
{1=1, 2=1, 3=1, 4=1, 5=1, 6=1, 7=1, 8=1, 9=1, 10=1}
输入第 11 个元素后得到的输出:
{4=1, 1=1, 2=1, 3=1, 5=1, 6=1, 7=1, 8=1, 9=1, 10=1, 11=1}
它应该保持插入顺序,或者如果它在内部使用 RB 树,那么在这种情况下它在这里使用哪种遍历?
【问题讨论】:
-
我认为是您输入的第 12 个元素决定了增加容量。
-
您是否单步执行了 HashMap 代码?你在那里发现了什么意想不到的东西?
-
如果你想要恒定的迭代顺序,试试
LinkedHashMap。它只是HashMap,带有一个额外的节点链表,允许您按插入顺序进行迭代。 -
@VinayPrajapati 是的,但是当您输入第 13 个元素时,应该会发生重新散列。
-
@RolandIllig 我不明白你到底想说什么。请提供更清晰的说明。