什么更有效?一个If Else还是一个HashMap?

时间:2015-03-14 14:12:58

标签: java if-statement hashmap

我用Java编写一些代码来检查一个坐标是哪个象限,我想知道检查这个方法哪个方法更有效:if-else块或者使用HashMap。

HashMap看起来像这样:

private static final Map<Coordinate,Quadrant> quadMap = new HashMap<Coordinate, Quadrant>(){{
    put(new Coordinate(0,0), Quadrant.Q1);
    put(new Coordinate(0, 1), Quadrant.Q2);
    put(new Coordinate(1, 0), Quadrant.Q3);
    put(new Coordinate(1, 1), Quadrant.Q4);
}};

然后我想要获得我的象限:

return quadMap.get(coordinate)

if-else实现:

if (x < 1){
        if (y < 1){
            return Quadrant.Q1;
        } else {
            return Quadrant.Q2;
        }
    } else {
        if (y < 1){
            return Quadrant.Q3;
        } else {
            return Quadrant.Q4;
        }
    }

还是有另一种更有效的方法吗?

6 个答案:

答案 0 :(得分:8)

只有四个条目? if-else会更快。 hashmap必须执行更多命令才能实现目标。获取哈希码,计算距离/位置,获取数组条目,并运行等于操作。

答案 1 :(得分:3)

您在第一个示例中使用的内容称为Double-Brace Initialization。它仅为了懒惰而创建一个匿名类,在多个级别上为extremely inefficient。此外,除非您缓存它,否则hashmap会消耗大量内存并且初始化时间相对较慢。一个简单的if在这里肯定更有效率。

通常,if-else总是更有效率。但是在一定数量的情况下,为了可读性,你应该使用一个(正确初始化的)Map。

答案 2 :(得分:1)

这取决于您将拥有多少个坐标。如果你的数字非常小,那么if else会比计算哈希值稍快一点。如果你只有4个坐标,那么使用if / else比使用HashMap更快。

答案 3 :(得分:0)

最有可能HashMap,但这取决于几件事情:

  1. Coordinate课程必须有效equals()hashCode()实施
  2. Coordinate是否是不可变的,哈希码是否可以缓存
  3. 您将通过哪种坐标

答案 4 :(得分:0)

所有这些答案都是基于if-else和hashmap的差异,但从算法的角度来看,if-else总是能更优化地运行,并且你不需要hashmap中的所有空间。每当你得到一个坐标,如果你通过if-else传递它,那么你将得到答案,这样你就不需要使用地图,你可以节省内存。制作if块的实用功能,以便在程序的任何地方使用。

答案 5 :(得分:0)

我在这里也有同样的问题。我做了一些测试。

这是我的“通用数据转换功能”,它将一个类和一个Object数据作为输入,然后将“数据”转换为所需的类。

要处理所有“原始”类,我在函数中有很多“ if else”语句(例如20个左右)。

有一天,我尝试使用哈希图将“类”存储为键,将“转换函数”存储为值。

比较了两个版本,即使我使用的输入将到达“ if else”语句的最后一个,“ if else”版本仍比hashmap快4-5倍(hashmap在开始时初始化并缓存)。

(实际上,当我使用仅到达第一个“ if else”语句并返回的输入时,测试结果几乎相同)

(我的环境是Windows 10 + Java 1.8)