HashMap的性能<string,comparative =“”>对HashMap <string,object =“”> - Java </string,> </string,>

时间:2011-10-31 22:52:39

标签: java performance hashmap

所有

我正在开发一个现有系统,开发人员定义了很多HashMaps,其定义如下:

HashMap<String, Comparable> x = new HashMap<String, Comparable>();

现在,完全不需要对hashmap的value部分进行比较,因为它只表示一条信息。开发人员使用Comparable,因为唯一的期望值是String和int类型(转换为Integer对象),开发人员认为存储这两种数据类型的最佳方法是使用Comparable接口。

所以,我继续改变了代码,因为通过将HashMap定义为:

,这里没有任何比较点。

HashMap<String, Object> y = new HashMap<String, Object>();

我在更改之前和之后定时执行代码。关于为什么代码在部署更改后花费更多时间执行(虽然目前不是性能瓶颈),我感到有些惊讶。

有人可以帮我理解由于我的代码更新导致的行为变化吗?

3 个答案:

答案 0 :(得分:4)

两者在性能方面完全相同,因为该值不用于散列(只有密钥)。

您如何计算代码?确保分别为每个测试用例计时。 不要执行以下操作,因为第二个测试将有第一个测试的好处,即“预热”JVM。我的猜测是你的测试有缺陷,或者你看到正常的执行时间变化。

public static void main(String[] args) {
    for loop {
        test HashMap<String, Comparable>
    }

    for loop {
        test HashMap<String, Object>
    }
}

答案 1 :(得分:2)

没有任何区别。类型信息在运行时被删除,因此可能问题出在其他地方。

答案 2 :(得分:0)

我的猜测是,除非你在其他地方做某些事情,这意味着性能下降(我认为没有理由为什么你应该看到你所提到的内容下降)是你正在使用的基准是有缺陷的。使用currentTimeMillis()甚至nanoTime()将不会考虑JIT预热,比其他操作更快地优化各种操作,或类似的任何操作 - 代码中的任何更改都可能以这种方式影响它。

我的建议是使用分析器来更真实地了解需要多长时间 - 如果使用该方法时显着更长,那么您可能会开始研究代码的问题。我只是担心,如果你依赖于琐碎的currentTimeMillis()电话,你最终可能会试图找出实际上并不存在的性能问题(至少不是你认为的那些。)