我是Java的新手,经常发现我需要对Map<Key, Value>值进行排序.
由于值不是唯一的,我发现自己将其转换keySet为a array,并通过数组排序对该数组进行排序,并使用自定义比较器对与键关联的值进行排序.
有没有更简单的方法?
根据以下链接文档: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) 这可能不是现实世界的场景,但只是想知道会发生什么,下面是代码.
我正在创建一组类的对象UsingSet.根据Java中的哈希概念,当我第一次添加包含"a"的对象时,它将创建一个带有哈希码97的桶并将对象放入其中.当它遇到带有"a"的对象时,它将在类UsingSet中调用重写的哈希码方法,它将获得哈希码97,那么下一步是什么?
由于我没有覆盖equals方法,因此默认实现将返回false.那么具有值"a"的Object将保留在哪个存储区中,其中保留了哈希码97的前一个对象?还是会创造新的桶?有谁知道它将如何存储在内部?
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class UsingSet {
String value;
public UsingSet(String value){
this.value = value;
}
public String toString() {
return value;
}
public int hashCode() {
int hash = value.hashCode();
System.out.println("hashcode called" + hash);
return hash;
}
public static void main(String args[]) {
java.util.Set s = new java.util.HashSet();
s.add(new UsingSet("A"));
s.add(new UsingSet("b"));
s.add(new UsingSet("a"));
s.add(new UsingSet("b"));
s.add(new UsingSet("a"));
s.add(new Integer(1));
s.add(new Integer(1));
System.out.println("s …Run Code Online (Sandbox Code Playgroud)