亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8如何使用Map中computeIfAbsent方法構建本地緩存

發布時間:2021-09-15 18:27:26 來源:億速云 閱讀:173 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Java8如何使用Map中computeIfAbsent方法構建本地緩存,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、概念及使用介紹

在JAVA8的Map接口中,增加了一個方法computeIfAbsent,此方法簽名如下:

public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

Map接口的實現類如HashMap,ConcurrentHashMap,HashTable等繼承了此方法,通過此方法可以構建JAVA本地緩存,降低程序的計算量,程序的復雜度,使代碼簡潔,易懂。

此方法首先判斷緩存MAP中是否存在指定key的值,如果不存在,會自動調用mappingFunction(key)計算key的value,然后將key = value放入到緩存Map,java8會使用thread-safe的方式從cache中存取記錄。

如果mappingFunction(key)返回的值為null或拋出異常,則不會有記錄存入map

二、代碼樣例

import java.util.HashMap;  import java.util.HashSet;  import java.util.Map;  import java.util.concurrent.ConcurrentHashMap;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.TimeUnit;   public class Main {      static Map<Integer, Integer> cache = new ConcurrentHashMap<>();       public static void main(String[] args) throws InterruptedException {          cache.put(0, 0);          cache.put(1, 1);          // 普通方式          System.out.println("Fibonacci(7) = " + fibonacci(7));          // 采用java7的同步線程方式及java8的本地緩存的方式          System.out.println("FibonacciJava8(7) = " + fibonacciJava8(7));          System.out.println("FibonacciJava7(7) = " + fibonacciJava7(7));           // 構建多值Map樣例代碼          Map<String, HashSet<String>> map1 = new HashMap<>();          map1.computeIfAbsent("fruits", k -> genValue(k)).add("apple");          map1.computeIfAbsent("fruits", k -> genValue(k)).add("orange");          map1.computeIfAbsent("fruits", k -> genValue(k)).add("pear");          map1.computeIfAbsent("fruits", k -> genValue(k)).add("banana");          map1.computeIfAbsent("fruits", k -> genValue(k)).add("water");          System.out.println(map1);           //測試多線程并發處理,是否同步操作          Map<String, String> map2 = new ConcurrentHashMap<>();          ExecutorService exec = Executors.newCachedThreadPool();          for (int i = 0; i < 5; i++) {              exec.execute(() -> {                  map2.computeIfAbsent("name", k -> genValue2(k));                  map2.computeIfAbsent("addr", k -> genValue2(k));                  map2.computeIfAbsent("email", k -> genValue2(k));                  map2.computeIfAbsent("mobile", k -> genValue2(k));              });          }          exec.shutdown();          exec.awaitTermination(1, TimeUnit.SECONDS);          System.out.println(map2);      }       static HashSet<String> genValue(String str) {          return new HashSet<String>();      }       static String genValue2(String str) {          System.out.println("===");          return str + "2";      }       /**       * 普通的實現方式 普通方式使用大量的計算,存在性能問題. 并且計算量隨著n的增加呈指數級增加,需要用到一些緩存策略,并且是線程安全的.       *        * @param n       * @return       */     static int fibonacci(int n) {          if (n == 0 || n == 1)              return n;           System.out.println("calculating Fibonacci(" + n + ")");          return fibonacci(n - 2) + fibonacci(n - 1);      }       /**       * 采用java8的本地緩存方式 如果緩存MAP中不存在指定key的值,會自動調用mappingFunction(key)計算key的value       * 然后將key = value放入到緩存Map,java8會使用thread-safe的方式從cache中存取記錄       *        * @param n       * @return       */     static int fibonacciJava8(int n) {          return cache.computeIfAbsent(n, (key) -> {              System.out.println("calculating FibonacciJava8 " + n);              return fibonacciJava8(n - 2) + fibonacciJava8(n - 1);          });      }       /**       * 在java7中的實現方式       * 在java7中,通過synchronized進行線程同步,檢查緩存是否存在key對應的值,如果不存在才進行計算并放入緩存中       * 為了更好的性能,需要使用 double-checked locking,那樣代碼會更復雜       *        * @param n       * @return       */     static int fibonacciJava7(int n) {          if (n == 0 || n == 1)              return n;           Integer result = cache.get(n);           if (result == null) {              synchronized (cache) {                  result = cache.get(n);                   if (result == null) {                      System.out.println("calculating FibonacciJava7(" + n + ")");                      result = fibonacciJava7(n - 2) + fibonacciJava7(n - 1);                      cache.put(n, result);                  }              }          }          return result;      }  }

三、程序運行結果

calculating Fibonacci(7)  calculating Fibonacci(5)  calculating Fibonacci(3)  calculating Fibonacci(2)  calculating Fibonacci(4)  calculating Fibonacci(2)  calculating Fibonacci(3)  calculating Fibonacci(2)  calculating Fibonacci(6)  calculating Fibonacci(4)  calculating Fibonacci(2)  calculating Fibonacci(3)  calculating Fibonacci(2)  calculating Fibonacci(5)  calculating Fibonacci(3)  calculating Fibonacci(2)  calculating Fibonacci(4)  calculating Fibonacci(2)  calculating Fibonacci(3)  calculating Fibonacci(2)  Fibonacci(7) = 13 calculating FibonacciJava8 7 calculating FibonacciJava8 5 calculating FibonacciJava8 3 calculating FibonacciJava8 2 calculating FibonacciJava8 4 calculating FibonacciJava8 6 FibonacciJava8(7) = 13 FibonacciJava7(7) = 13 {fruits=[orange, banana, apple, pear, water]}  ===  ===  ===  ===  {name=name2, mobile=mobile2, addr=addr2, email=email2}

關于“Java8如何使用Map中computeIfAbsent方法構建本地緩存”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石台县| 响水县| 金山区| 建平县| 图片| 衢州市| 保亭| 林甸县| 红原县| 西吉县| 土默特左旗| 莱州市| 兴业县| 彝良县| 博乐市| 任丘市| 松江区| 句容市| 桐乡市| 开鲁县| 灯塔市| 东丽区| 阜新| 建始县| 南乐县| 博爱县| 陈巴尔虎旗| 新建县| 娱乐| 西和县| 泗水县| 同江市| 兴文县| 栾川县| 桃园县| 浦北县| 灵丘县| 寻乌县| 彭州市| 河北省| 鞍山市|