Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么更有效率?If-Else还是HashMap?_Java_If Statement_Hashmap - Fatal编程技术网

Java 什么更有效率?If-Else还是HashMap?

Java 什么更有效率?If-Else还是HashMap?,java,if-statement,hashmap,Java,If Statement,Hashmap,我正在用Java编写一些代码来检查坐标在哪个象限,我想知道哪种方法更有效来检查它:if-else块还是HashMap的使用 哈希映射如下所示: private static final Map<Coordinate,Quadrant> quadMap = new HashMap<Coordinate, Quadrant>(){{ put(new Coordinate(0,0), Quadrant.Q1); put(new Coordinate(0, 1),

我正在用Java编写一些代码来检查坐标在哪个象限,我想知道哪种方法更有效来检查它:if-else块还是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);
}};
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;
        }
    }
if(x<1){
if(y<1){
返回象限1.Q1;
}否则{
返回象限0.Q2;
}
}否则{
if(y<1){
返回象限0.Q3;
}否则{
返回象限4.Q4;
}
}

或者还有其他更有效的方法吗?

最有可能的方法是
HashMap
,但这取决于以下几点:

  • Coordinate
    类必须具有高效的
    equals()
    hashCode()
    实现
  • 坐标
    是否不可变,哈希代码是否可以缓存
  • 您将通过哪种坐标

  • 这取决于你有多少坐标。如果您有一个非常小的数字,那么If-else将比计算散列并查找它稍微快一些。如果只有4个坐标,那么使用If/else可能比使用HashMap更快

    您在第一个示例中使用的称为。它创建一个匿名类仅仅是为了达到懒惰的目的,这是多层次的。此外,除非缓存它,否则哈希映射会消耗大量内存,并且初始化时间相对较慢。简单的
    if
    在这里肯定更有效


    一般来说,if-else总是更有效。但是对于一定数量的情况,为了可读性,您应该使用(正确初始化的)映射。

    仅针对四个条目?如果不是,速度会更快。hashmap必须执行更多的命令才能到达目的地。获取hashcode,计算距离/位置,获取数组条目,并运行equals操作

    所有这些答案都是基于if-else和hashmap的不同,但是从算法的角度来看,if-else总是工作得更好,并且不需要hashmap中的所有空间。每当你得到一个坐标,如果你通过if-else,你就会得到答案,这样你就不需要使用地图,你可以节省内存。为便于在程序中的任何地方使用,请使用if块的实用功能。

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

    这是我的“通用数据转换函数”,它将类和对象数据作为输入,并将“数据”转换为所需的类

    为了处理所有的“基元”类,我在函数中有许多“if-else”语句(大约20条)

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

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

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


    (my env是windows 10+java 1.8)

    HashMap永远不会更快,但代码在某一点上可能会更可读。只有这四个坐标,hashfunction是
    2*x+y
    不是真的,HashMap可以更快。您能展示一个hashcode和equals的示例,它比4 if else条件更快。请记住,您还需要进行函数调用,以将元素放入映射中,并调用hashcode和equals方法。在这个已知只有4个元素的示例中,hashmap会慢一些。hashmap不应该快速或高效,hashmap只应该是O(1)。该死,这个答案的竞争非常激烈。您是否尝试过2d数组“``Quadraray[0][0]=Quadrant.Q1;四元数组[0][1]=象限Q2;四元数组[1][0]=象限.Q3;四元数组[1][1]=象限.Q4```我不知道像这样的
    HashMap
    的初始化效率较低。谢谢。谢谢你的回答。我将测试switch case语句以查看性能。你能提交基准源代码和结果表格式吗?
    if (x < 1){
            if (y < 1){
                return Quadrant.Q1;
            } else {
                return Quadrant.Q2;
            }
        } else {
            if (y < 1){
                return Quadrant.Q3;
            } else {
                return Quadrant.Q4;
            }
        }