簡體   English   中英

什么更有效? If Else 還是 HashMap?

[英]What is more efficient? An If Else or a 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;
        }
    }

或者是否有另一種更有效的方法來做到這一點?

只有四個條目? if-else會更快。 hashmap必須執行更多命令才能實現目標。 獲取哈希碼,計算距離/位置,獲取數組條目,並運行等於操作。

您在第一個示例中使用的內容稱為Double-Brace Initialization 它僅為了懶惰而創建一個匿名類,這在多個級別上效率極低 此外,除非您緩存它,否則hashmap會消耗大量內存並且初始化時間相對較慢。 一個簡單的if在這里肯定更有效率。

通常,if-else總是更有效率。 但是在一定數量的情況下,為了可讀性,您應該使用(正確初始化的)Map。

這取決於您將擁有多少個坐標。 如果你的數字非常小,那么if else會比計算哈希值稍快一點。 如果你只有4個坐標,那么使用if / else比使用HashMap更快。

最有可能是HashMap ,但它取決於幾件事:

  1. Coordinate類必須具有有效的equals()hashCode()實現
  2. Coordinate是否是不可變的,並且可以緩存哈希碼
  3. 你要通過哪種坐標

所有這些答案都是基於if-else和hashmap的差異,但從算法的角度來看,if-else總是能更好地工作,並且你不需要hashmap中的所有空間。 每當你得到一個坐標,如果你通過if-else傳遞它,那么你將得到答案,這樣你就不需要使用地圖,你可以節省內存。 制作if塊的實用功能,以便在程序的任何位置使用。

我在這里有同樣的問題。 我做了一些測試。

它是我的“通用數據轉換函數”,它將類和對象數據作為輸入,並將“數據”轉換為所需的類。

為了處理所有“原始”類,我在函數中有許多“if else”語句(如20左右)。

有一天,我嘗試使用hashmap將“class”存儲為鍵,將“convert function”存儲為值。

比較兩個版本,即使我使用的輸入將到達最后一個“if else”語句,“if else”版本仍然比hashmap快4-5倍(hashmap在開始時被初始化並緩存)。

(實際上,當我使用的輸入只會到達第一個“if else”語句並返回時,測試結果幾乎相同)

(我的env是windows 10 + java 1.8)

只考慮兩個和的一個非常基本的例子。 我們可以使用 hashmap 或簡單的 If-else 循環來解決它。 當然,編譯器必須在 if-else 中執行更少的線程並消耗更少的內存。 但是如果我們考慮大輸入或現實生活中的例子,比如從大數據集中找到一個總和,if-else 的迭代將需要時間並且編寫起來會很復雜(因為許多 if-else 循環會增加),因此,我們將在這種情況下使用哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM