我用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;
}
}
还是有另一种更有效的方法吗?
答案 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
,但这取决于几件事情:
Coordinate
课程必须有效equals()
和hashCode()
实施Coordinate
是否是不可变的,哈希码是否可以缓存答案 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)