作者:谢绝沟通 | 来源:互联网 | 2022-11-29 17:27
我已经完成了Java 8 Hashmap的实现并且遇到了疑问.请帮我澄清一下:
我在一篇文章中读到,该文章说,具有相同哈希码的节点将作为链表添加到同一个桶中.它表示此链接列表的新节点将以head而不是尾部添加,以避免尾部遍历.但是当我看到源代码时,新节点就会被添加到尾部.那是对的吗?
我没有完全理解这个变量MIN_TREEIFY_CAPACITY.是不是在这么多计数之后,整个地图将被转换为树(从数组到树)?
Peter Lawrey..
6
但是当我看到源代码时,新节点就会被添加到尾部.那是对的吗?
它以旧版本添加到头部.但是,在Java 8中进行了许多更改.
class A {
static class SameHash {
final int n;
SameHash(int n) {
this.n = n;
}
@Override
public int hashCode() {
return 1;
}
@Override
public String toString() {
return "SameHash{" +
"n=" + n +
'}';
}
}
public static void main(String[] args) {
HashSet set = new HashSet<>();
for (int i = 1; i <= 4; i++)
set.add(new SameHash(i));
System.out.println(set);
}
}
版画
[SameHash{n=1}, SameHash{n=2}, SameHash{n=3}, SameHash{n=4}]
注意:密钥可以具有不同的hashCodes,但最终可以在同一个存储桶中.
我没有完全理解这个变量MIN_TREEIFY_CAPACITY.是不是在这么多计数之后,整个地图将被转换为树(从数组到树)?
在此计数之后,如果密钥是,则将桶转换为树 Comparable
1> Peter Lawrey..:
但是当我看到源代码时,新节点就会被添加到尾部.那是对的吗?
它以旧版本添加到头部.但是,在Java 8中进行了许多更改.
class A {
static class SameHash {
final int n;
SameHash(int n) {
this.n = n;
}
@Override
public int hashCode() {
return 1;
}
@Override
public String toString() {
return "SameHash{" +
"n=" + n +
'}';
}
}
public static void main(String[] args) {
HashSet set = new HashSet<>();
for (int i = 1; i <= 4; i++)
set.add(new SameHash(i));
System.out.println(set);
}
}
版画
[SameHash{n=1}, SameHash{n=2}, SameHash{n=3}, SameHash{n=4}]
注意:密钥可以具有不同的hashCodes,但最终可以在同一个存储桶中.
我没有完全理解这个变量MIN_TREEIFY_CAPACITY.是不是在这么多计数之后,整个地图将被转换为树(从数组到树)?
在此计数之后,如果密钥是,则将桶转换为树 Comparable