夜讀源碼發現Android源碼Bug

0
回復
191
查看
打印 上一主題 下一主題
[復制鏈接]

6

主題

6

帖子

348

安幣

攻城獅

Rank: 3Rank: 3

樓主
發表于 2019-12-17 14:30:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如果對本篇文章感興趣,請前往,原文地址:http://www.1574304.live/blog-990935-82785.html

# 前言LruCache 是我們經常使用的緩存機制,也叫 “最近最少使用的” 緩存策略。其本質原理是通過歷史訪問記錄來 倒序淘汰數據,它認為剛剛訪問的數據,將來被訪問的可能性較大,因此將該類數據維護到相對安全的區域,防止被淘汰。此時如果超過設定的內存瓶頸,將優先淘汰最老的數據。![](https://upload-images.jianshu.io/upload_images/13841068-131576093bd59266?imageMogr2/auto-orient/strip|imageView2/2/w/1240)*   比如你在玩一款游戲,游戲里有一個倉庫,有 20 個位置可以存放裝備。*   1-20 件裝備都可以正常存放,并根據時間順序進行了排序,最晚存放的裝備排在最后。*   當你使用其中任意一件裝備的時候,這件裝備的排序就變成了最后。*   有一天你又獲得了一件裝備,但是你的倉庫已經滿了,只能扔一件才能存儲剛剛獲得的,扔的順序是從頭開始扔。新裝備存儲后,排序為最后。依次類推。# 1\. 分析源碼接下來我們通過正常的使用來分析源碼的邏輯,以下所有源碼均來自 API 28。通過 LruCache 提供的每一個方法進行一對一分析,首先我們看一段正常使用 LruCache 的代碼```private void lruTest() {        LruCache lruCache = new LruCache(5);        lruCache.put(1, 1);        lruCache.put(2, 2);        lruCache.put(3, 3);        lruCache.put(4, 4);        lruCache.put(5, 5);        for (Map.Entry entry : lruCache.snapshot().entrySet()) {            Log.e("LRU", entry.getKey()   ":"   entry.getValue());        }        Log.e("LRU", "超出設定存儲容量后");        lruCache.put(6, 6);        for (Map.Entry entry : lruCache.snapshot().entrySet()) {            Log.e("LRU", entry.getKey()   ":"   entry.getValue());        }    }---日志輸出---2019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 1:12019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 2:22019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 3:32019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 4:42019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 5:52019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 超出設定存儲容量后2019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 2:22019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 3:32019-11-18 18:21:03.624 24293-24293/com.we.we E/LRU: 4:42019-11-18 18:21:03.625 24293-24293/com.we.we E/LRU: 5:52019-11-18 18:21:03.625 24293-24293/com.we.we E/LRU: 6:6```以上的例子的流程比較簡單,初始化一個容量為 5 的 LruCache。調用 put 方法添加數據,最后通過 snapshot () 方法獲取 Map 然后遍歷打印。但是超出設定容量后再進行 put 數據,會將最先 put 的數據頂替掉,我們記住這個特性往下看。# 2\. LruCache 構造函數如果有特殊需求可以通過重寫 sizeOf()方法設定每條緩存數據的大小```  public LruCache(int maxSize) {        if (maxSize
分享到:  QQ好友和群 QQ空間 微信
收藏
收藏0
支持
支持0
反對
反對0
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

在柳州学什么小吃赚钱