根据以下链接文档:Java HashMap Implementation
我对HashMap(或者更确切地说是增强HashMap)的实现感到困惑.我的疑问是:
首先
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
static final int MIN_TREEIFY_CAPACITY = 64;
Run Code Online (Sandbox Code Playgroud)
为什么以及如何使用这些常量?我想要一些明确的例子. 他们如何通过这个获得性能提升?
其次
如果您HashMap在JDK中看到源代码,您将找到以下静态内部类:
static final class TreeNode<K, V> extends java.util.LinkedHashMap.Entry<K, V> {
HashMap.TreeNode<K, V> parent;
HashMap.TreeNode<K, V> left;
HashMap.TreeNode<K, V> right;
HashMap.TreeNode<K, V> prev;
boolean red;
TreeNode(int arg0, K arg1, V arg2, HashMap.Node<K, V> arg3) {
super(arg0, arg1, arg2, arg3);
}
final HashMap.TreeNode<K, V> root() {
HashMap.TreeNode arg0 …Run Code Online (Sandbox Code Playgroud) 我的简单 java 代码如下所示:
String s1 = "FB";
String s2 = "Ea";
System.out.println(s1.hashCode() == s2.hashCode()); // true
Map<String, Integer> map = new HashMap<>();
map.put(s1, 1);
map.put(s2, 2);
Run Code Online (Sandbox Code Playgroud)
虽然调试这段代码在IntelliJIdea,我不能看到HashMap的数据结构中创建的链接列表,另外,还创建了两个桶,而不是一个虽然哈希码是相同的s1和s2。能否请您澄清一下?
从HashMap文档中我们可以读到:
请注意,使用具有相同 hashCode() 的多个键肯定会降低任何哈希表的性能。为了减轻影响,当键是 Comparable 时,此类可以使用键之间的比较顺序来帮助打破平局。
我知道如果密钥实现Comparable接口,在许多哈希冲突时,桶可以从 转变List为TreeSet。
是否可以设置容量,或检查何时转换?