-  * If your cached values hold resources that need to be explicitly released, 
-  * override {@link #entryRemoved}. 
-  * 如果你cache的某个值需要明确释放,重写entryRemoved() 
-  * If a cache miss should be computed on demand for the corresponding keys, 
-  * override {@link #create}. This simplifies the calling code, allowing it to 
-  * assume a value will always be returned, even when there’s a cache miss. 
-  * 如果key相对应的item丢掉啦,重写create().这简化了调用代码,即使丢失了也总会返回。 
-  * By default, the cache size is measured in the number of entries. Override 
-  * {@link #sizeOf} to size the cache in different units. For example, this cache 
-  * is limited to 4MiB of bitmaps: 默认cache大小是测量的item的数量,重写sizeof计算不同item的 
-  * 大小。 
-  * {@code
-  * int cacheSize = 4 * 1024 * 1024; // 4MiB 
-  * LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) { 
-  * protected int sizeOf(String key, Bitmap value) { 
-  * return value.getByteCount(); 
-  * } 
-  * }} 
-  * 
-  * This class is thread-safe. Perform multiple cache operations atomically by 
-  * synchronizing on the cache: {@code
-  * synchronized (cache) { 
-  * if (cache.get(key) == null) { 
-  * cache.put(key, value); 
-  * } 
-  * }} 
-  * 
-  * This class does not allow null to be used as a key or value. A return 
-  * value of null from {@link #get}, {@link #put} or {@link #remove} is 
-  * unambiguous: the key was not in the cache. 
-  * 不允许key或者value为null 
-  * 当get(),put(),remove()返回值为null时,key相应的项不在cache中 
-  */ 
-  public class LruCache<K, V> { 
-  private final LinkedHashMap<K, V> map; 
-  /** Size of this cache in units. Not necessarily the number of elements. */ 
-  private int size; //已经存储的大小 
-  private int maxSize; //规定的最大存储空间 
-  private int putCount; //put的次数 
-  private int createCount; //create的次数 
-  private int evictionCount; //回收的次数 
-  private int hitCount; //命中的次数 
-  private int missCount; //丢失的次数 
-  /** 
-  * @param maxSize for caches that do not override {@link #sizeOf}, this is 
-  * the maximum number of entries in the cache. For all other caches, 
-  * this is the maximum sum of the sizes of the entries in this cache. 
-  */ 
-  public LruCache(int maxSize) { 
-  if (maxSize <= 0) { 
-  throw new IllegalArgumentException(“maxSize <= 0”); 
-  } 
-  this.maxSize = maxSize; 
-  this.map = new LinkedHashMap<K, V>(0, 0.75f, true); 
-  } 
-  /** 
-  * Returns the value for {@code key} if it exists in the cache or can be 
-  * created by {@code #create}. If a value was returned, it is moved to the 
-  * head of the queue. This returns null if a value is not cached and cannot 
-  * be created. 通过key返回相应的item,或者创建返回相应的item。相应的item会移动到队列的头部, 
-  * 如果item的value没有被cache或者不能被创建,则返回null。 
-  */ 
-  public final V get(K key) { 
-  if (key == null) { 
-  throw new NullPointerException(“key == null”); 
-  } 
-  V mapValue; 
-  synchronized (this) { 
-  mapValue = map.get(key); 
-  if (mapValue != null) { 
-  hitCount++; //命中 
-  return mapValue; 
-  } 
-  missCount++; //丢失 
-  } 
-  /* 
-  * Attempt to create a value. This may take a long time, and the map 
-  * may be different when create() returns. If a conflicting value was 
-  * added to the map while create() was working, we leave that value in 
-  * the map and release the created value. 
-  * 如果丢失了就试图创建一个item 
-  */ 
-  V createdValue = create(key); 
-  if (createdValue == null) { 
-  return null; 
-  } 
-  synchronized (this) { 
-  createCount++;//创建++ 
-  mapValue = map.put(key, createdValue); 
-  if (mapValue != null) { 
-  // There was a conflict so undo that last put 
-  //如果前面存在oldValue,那么撤销put() 
-  map.put(key, mapValue); 
-  } else { 
-  size += safeSizeOf(key, createdValue); 
-  } 
-  } 
-  if (mapValue != null) { 
-  entryRemoved(false, key, createdValue, mapValue); 
-  return mapValue; 
-  } else { 
-  trimToSize(maxSize); 
-  return createdValue; 
-  } 
-  } 
-  /** 
-  * Caches {@code value} for {@code key}. The value is moved to the head of 
-  * the queue. 
-  * 
-  * @return the previous value mapped by {@code key}. 
-  */ 
-  public final V put(K key, V value) { 
-  if (key == null || value == null) { 
-  throw new NullPointerException(“key == null || value == null”); 
-  } 
-  V previous; 
-  synchronized (this) { 
-  putCount++; 
-  size += safeSizeOf(key, value); 
-  previous = map.put(key, value); 
-  if (previous != null) { //返回的先前的value值 
-  size -= safeSizeOf(key, previous); 
-  } 
-  } 
-  if (previous != null) { 
-  entryRemoved(false, key, previous, value); 
-  } 
-  trimToSize(maxSize); 
-  return previous; 
-  } 
-  /** 
-  * @param maxSize the maximum size of the cache before returning. May be -1 
-  * to evict even 0-sized elements. 
-  * 清空cache空间 
-  */ 
-  private void trimToSize(int maxSize) { 
-  while (true) { 
-  K key; 
-  V value; 
-  synchronized (this) { 
-  if (size < 0 || (map.isEmpty() && size != 0)) { 
-  throw new IllegalStateException(getClass().getName() 
-  + “.sizeOf() is reporting inconsistent results!”); 
-  } 
-  if (size <= maxSize) { 
-  break; 
-  } 
-  Map.Entry<K, V> toEvict = map.eldest(); 
-  if (toEvict == null) { 
-  break; 
-  } 
-  key = toEvict.getKey(); 
-  value = toEvict.getValue(); 
-  map.remove(key); 
-  size -= safeSizeOf(key, value); 
-  evictionCount++; 
-  } 
-  entryRemoved(true, key, value, null); 
-  } 
-  } 
-  /** 
-  * Removes the entry for {@code key} if it exists. 
-  * 删除key相应的cache项,返回相应的value 
-  * @return the previous value mapped by {@code key}. 
-  */ 
-  public final V remove(K key) { 
-  if (key == null) { 
-  throw new NullPointerException(“key == null”); 
-  } 
-  V previous; 
-  synchronized (this) { 
-  previous = map.remove(key); 
-  if (previous != null) { 
-  size -= safeSizeOf(key, previous); 
-  } 
-  } 
-  if (previous != null) { 
-  entryRemoved(false, key, previous, null); 
-  } 
-  return previous; 
-  } 
-  /** 
-  * Called for entries that have been evicted or removed. This method is 
-  * invoked when a value is evicted to make space, removed by a call to 
-  * {@link #remove}, or replaced by a call to {@link #put}. The default 
-  * implementation does nothing. 
-  * 当item被回收或者删掉时调用。改方法当value被回收释放存储空间时被remove调用, 
-  * 或者替换item值时put调用,默认 
 实现什么都没做。
-  * The method is called without synchronization: other threads may 
-  * access the cache while this method is executing. 
-  * 
-  * @param evicted true if the entry is being removed to make space, false 
-  * if the removal was caused by a {@link #put} or {@link #remove}. 
-  * true—为释放空间被删除;false—put或remove导致 
-  * @param newValue the new value for {@code key}, if it exists. If non-null, 
-  * this removal was caused by a {@link #put}. Otherwise it was caused by 
-  * an eviction or a {@link #remove}. 
-  */ 
-  protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {} 
-  /** 
-  * Called after a cache miss to compute a value for the corresponding key. 
-  * Returns the computed value or null if no value can be computed. The 
-  * default implementation returns null. 
-  * 当某Item丢失时会调用到,返回计算的相应的value或者null 
-  * The method is called without synchronization: other threads may 
-  * access the cache while this method is executing. 
-  * 
-  * If a value for {@code key} exists in the cache when this method 
-  * returns, the created value will be released with {@link #entryRemoved} 
-  * and discarded. This can occur when multiple threads request the same key 
-  * at the same time (causing multiple values to be created), or when one 
-  * thread calls {@link #put} while another is creating a value for the same 
-  * key. 
-  */ 
-  protected V create(K key) { 
-  return null; 
-  } 
-  private int safeSizeOf(K key, V value) { 
-  int result = sizeOf(key, value); 
-  if (result < 0) { 
-  throw new IllegalStateException("Negative size: " + key + “=” + value); 
-  } 
-  return result; 
-  } 
-  /** 
-  * Returns the size of the entry for {@code key} and {@code value} in 
-  * user-defined units. The default implementation returns 1 so that size 
-  * is the number of entries and max size is the maximum number of entries. 
-  * 返回用户定义的item的大小,默认返回1代表item的数量,最大size就是最大item值 
-  * An entry’s size must not change while it is in the cache. 
-  */ 
-  protected int sizeOf(K key, V value) { 
-  return 1; 
-  } 
-  /** 
-  * Clear the cache, calling {@link #entryRemoved} on each removed entry. 
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
 0.      */
-  protected int sizeOf(K key, V value) { 
-  return 1; 
-  } 
-  /** 
-  * Clear the cache, calling {@link #entryRemoved} on each removed entry. 
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-7R2o989d-1718991877996)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取