2

我已经迭代了几个散列图,每个散列图大小为 20-40 个项目,所以仅通过if在迭代或使用单个get(key)操作时添加条件来查找项目是否更有意义?哪种方法会提供更多性能。

我知道要获得准确的结果,我应该依赖分析结果,但由于我对分析不太熟悉,所以想要专家意见。

编辑:

这是我的代码:

    for (HColumn col : lobColumns) {// lobcolumns is a list but I also have hashmap already built containing same elements as this list
        switch (ByteBufferToInt(col.getName())) {

            case .......:
                break;

            case .......:
                break;
            case .......:
                break;
            case .......:
                break;
            case .......:
                break;                  
        }            
        if (ByteBufferToInt(col.getName()).intValue()==currentUserId()){// here is what I'm using as replacement for hashmap `get()`
            .....
        } 
    }

lobcolumns是一个列表,但我也已经构建了包含与该列表相同的元素的 hashmap。此列表/映射包含一些常量和一些变量对象,对于常量,我使用 switch case 进行有效查找和查找单个特殊变量项,我需要决定是使用 hashmapget()还是if在已经迭代时使用。

4

2 回答 2

5

好吧,我的意思是让我们看看它。在最坏的情况下,该get操作是O(1)具有完美哈希函数的或恒定时间。而迭代是O(n)最坏的情况。如果您key提前调用get,则无需遍历所有内容。

更新

以下行:

for (HColumn col : lobColumns)

您的评论是您已经将所有这些值存储在 aHashMap中。如果地图是这样定义的:

Map<Integer, HColumn> columns = new HashMap<Integer,HColumn>();  

if语句移出 for 循环并变为以下内容:

HColumn column = columns.get(currentUserId());     
if(null != column)  
{  
     doSomethingWithColumn(column);  // this was the old if block
}   
for(Integer col : columns.keySet())  
{  
    switch(col)  
    {  
       ...  
    }
}

这将 if 减少为只执行一次,因为它现在在for循环之外。

于 2012-11-05T20:19:35.467 回答
1

如果您使用if语句,那么它将在运行循环时进行多次比较。

HashMap用于使用散列键维护和检索值,因此非常有效。

我宁愿使用get(key)overif语句来避免一些不必要的比较。

于 2012-11-05T20:26:55.203 回答