java - 自定义 HashMap-Key (Java) 极大地降低性能

标签 java performance hashmap key

这是我的第一个问题,但我希望我能提供所有需要的信息。
如果没有,请告诉我!

我的问题:
我尝试通过添加 HashMap 来存储已处理的结果来改进我的回溯算法。为此,我为该 HashMap 的键创建了一个自己的类。在那里我覆盖了 .equals()- 和 .hashCode()- 方法。
但是,如果我尝试将这个 key 及其值放入 map 中,则会花费很多时间,因此算法变得比没有 map 的回溯算法效率更低。
为了解决这个问题,我将 HashMap-Key 更改为 String 并向我的键类添加了 .toString() 方法。这工作得很好而且速度相当快。 (奇怪的事情:.toString().hashCode() 产生很多负值,但似乎有效)

现在我的问题:
如果您创建自己的 key ,它总是会减慢那么多吗?
我试图自己找到这个问题的答案,我发现的唯一办法就是更改 .hashCode() 或使用 HashMap-Constructor 的参数。
我尝试了这两种方法,并为我的测试环境导出了生成的哈希码,但没有找到任何重复项,尽管我知道,这不是哈希码的“好”方法!

这是我的 HashKey-Class 的副本(变量和方法的名称已更改):

public class HashKey {
    private final int int0, int1, int2;

    public HashKey(int int0, int int1, int int2) {
        this.int0 = int0;
        this.int1 = int1;
        this.int2 = int2;
    }

    public int getInt0() {
        return this.int0;
    }

    public int getInt1() {
        return this.int1;
    }

    public int getInt2() {
        return this.int2;
    }

    @Override
    public int hashCode() {
        final int prime1 = 107;
        final int prime2 = 227;
        final int prime3 = 499;
        int result = 1;
        result = prime1 * result + this.int2;
        result = prime2 * result + this.int1;
        result = prime3 * result + this.int0;
        return result;
     }

    @Override
    public String toString() {
        return "Int0: " + this.int0 + " Int1: " + int1 + " Int2: " + int2;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof HashKey) {
            boolean eq0, eq1, eq2;
            eq0 = this.int0 == ((HashKey) obj).getInt0();
            eq1 = this.int1 == ((HashKey) obj).getInt1();
            eq2 = this.int2 == ((HashKey) obj).getInt2();
            if (eq0 && eq1 && eq2) {
                return true;
            }
        }
        return false;
    }
}  

在我的主类中我使用这个:

HashMap<HashKey, List<Object>> storedResults = new HashMap<HashKey, List<Object>>();  

int x1,x2,x3;  
Object obj;  

// later in a method:

storedResults.put(new HashKey(x1,x2,x3), obj);

如果我将键的类型更改为字符串并将该字符串放入映射中,它就可以正常工作!因此 HashKey.hashCode() 方法和算法的其余部分工作正常并且速度相当快。

有人知道我可以用这个 HashKey 做什么吗?对于这个算法来说,这并不重要,但我想知道它对于 future 的算法!

如果有任何问题或批评:非常欢迎!

提前致谢!

克鲁姆

最佳答案

试试这个: 只需使用您的 equals(..) 方法,并且不要多次计算 hashCode

public final class HashKey {
    private final int int0, int1, int2;
    private final int hashCode;

    public HashKey(int int0, int int1, int int2) {
        this.int0 = int0;
        this.int1 = int1;
        this.int2 = int2;
        hashCode=107*int0+227*int1+499*int2;
    }

    @Override
    public final int hashCode() {
        return hashCode;
    }

    @Override
    public final boolean equals( finalObject obj) {
        if (!obj instanceof HashKey)
            retun false;
        HashKey other = (HashKey)obj;
        return int0 == other.int0 && int1 == other.int1 &&  int2 == other.int2;
    }
}  

引用fge的评论我更改了代码。

关于java - 自定义 HashMap-Key (Java) 极大地降低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416504/

相关文章:

javascript - 为什么访问对象属性总是比访问数组项更快?

C 字符串使用索引或指针复制字符

algorithm - 为自定义结构生成唯一哈希?

java - 从嵌套的 HashMap 访问 HashMap 数据

java - 选择 Hazelcast 功能

java - 是否可以在 Android-Studio 或 IntelliJ 上使用 SWT?

java - 类和对象。计算价格时得到 0.0 作为答案。 - java

java - 如何从 simplejdbctemplate 查询中获取字符串列表或类型 T?

java - 使用 TLSv1.2 或 1.1 生成自签名证书

c++ - 为什么 boost::function 慢?