Android提供的LruCache类简介,android算法面试题

  1. trimToSize(maxSize);

  2. return createdValue;

  3. }

  4. }

  5. /**

  6. * Caches {@code value} for {@code key}. The value is moved to the head of

  7. * the queue.

  8. *

  9. * @return the previous value mapped by {@code key}.

  10. */

  11. public final V put(K key, V value) {

  12. if (key == null || value == null) {

  13. throw new NullPointerException(“key == null || value == null”);

  14. }

  15. V previous;

  16. synchronized (this) {

  17. putCount++;

  18. size += safeSizeOf(key, value);

  19. previous = map.put(key, value);

  20. if (previous != null) {  //返回的先前的value值

  21. size -= safeSizeOf(key, previous);

  22. }

  23. }

  24. if (previous != null) {

  25. entryRemoved(false, key, previous, value);

  26. }

  27. trimToSize(maxSize);

  28. return previous;

  29. }

  30. /**

  31. * @param maxSize the maximum size of the cache before returning. May be -1

  32. *     to evict even 0-sized elements.

  33. *  清空cache空间

  34. */

  35. private void trimToSize(int maxSize) {

  36. while (true) {

  37. K key;

  38. V value;

  39. synchronized (this) {

  40. if (size < 0 || (map.isEmpty() && size != 0)) {

  41. throw new IllegalStateException(getClass().getName()

  42. + “.sizeOf() is reporting inconsistent results!”);

  43. }

  44. if (size <= maxSize) {

  45. break;

  46. }

  47. Map.Entry<K, V> toEvict = map.eldest();

  48. if (toEvict == null) {

  49. break;

  50. }

  51. key = toEvict.getKey();

  52. value = toEvict.getValue();

  53. map.remove(key);

  54. size -= safeSizeOf(key, value);

  55. evictionCount++;

  56. }

  57. entryRemoved(true, key, value, null);

  58. }

  59. }

  60. /**

  61. * Removes the entry for {@code key} if it exists.

  62. * 删除key相应的cache项,返回相应的value

  63. * @return the previous value mapped by {@code key}.

  64. */

  65. public final V remove(K key) {

  66. if (key == null) {

  67. throw new NullPointerException(“key == null”);

  68. }

  69. V previous;

  70. synchronized (this) {

  71. previous = map.remove(key);

  72. if (previous != null) {

  73. size -= safeSizeOf(key, previous);

  74. }

  75. }

  76. if (previous != null) {

  77. entryRemoved(false, key, previous, null);

  78. }

  79. return previous;

  80. }

  81. /**

  82. * Called for entries that have been evicted or removed. This method is

  83. * invoked when a value is evicted to make space, removed by a call to

  84. * {@link #remove}, or replaced by a call to {@link #put}. The default

  85. * implementation does nothing.

  86. * 当item被回收或者删掉时调用。改方法当value被回收释放存储空间时被remove调用,

  87. * 或者替换item值时put调用,默认实现什么都没做。

  88. The method is called without synchronization: other threads may

  89. * access the cache while this method is executing.

  90. *

  91. * @param evicted true if the entry is being removed to make space, false

  92. *     if the removal was caused by a {@link #put} or {@link #remove}.

  93. * true—为释放空间被删除;false—put或remove导致

  94. * @param newValue the new value for {@code key}, if it exists. If non-null,

  95. *     this removal was caused by a {@link #put}. Otherwise it was caused by

  96. *     an eviction or a {@link #remove}.

  97. */

  98. protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {}

  99. /**

  100. * Called after a cache miss to compute a value for the corresponding key.

  101. * Returns the computed value or null if no value can be computed. The

  102. * default implementation returns null.

  103. * 当某Item丢失时会调用到,返回计算的相应的value或者null

  104. The method is called without synchronization: other threads may

  105. * access the cache while this method is executing.

  106. *

  107. If a value for {@code key} exists in the cache when this method

  108. * returns, the created value will be released with {@link #entryRemoved}

  109. * and discarded. This can occur when multiple threads request the same key

  110. * at the same time (causing multiple values to be created), or when one

  111. * thread calls {@link #put} while another is creating a value for the same

  112. * key.

  113. */

  114. protected V create(K key) {

  115. return null;

  116. }

  117. private int safeSizeOf(K key, V value) {

  118. int result = sizeOf(key, value);

  119. if (result < 0) {

  120. throw new IllegalStateException("Negative size: " + key + “=” + value);

  121. }

  122. return result;

  123. }

  124. /**

  125. * Returns the size of the entry for {@code key} and {@code value} in

  126. * user-defined units.  The default implementation returns 1 so that size

  127. * is the number of entries and max size is the maximum number of entries.

  128. * 返回用户定义的item的大小,默认返回1代表item的数量,最大size就是最大item值

  129. An entry’s size must not change while it is in the cache.

  130. */

  131. protected int sizeOf(K key, V value) {

  132. return 1;

  133. }

  134. /**

  135. * Clear the cache, calling {@link #entryRemoved} on each removed entry.

  136. * 清空cacke

  137. */

  138. public final void evictAll() {

  139. trimToSize(-1); // -1 will evict 0-sized elements

  140. }

  141. /**

  142. * For caches that do not override {@link #sizeOf}, this returns the number

  143. * of entries in the cache. For all other caches, this returns the sum of

  144. * the sizes of the entries in this cache.

  145. */

  146. public synchronized final int size() {

  147. return size;

  148. }

  149. /**

  150. * For caches that do not override {@link #sizeOf}, this returns the maximum

  151. * number of entries in the cache. For all other caches, this returns the

  152. * maximum sum of the sizes of the entries in this cache.

  153. */

  154. public synchronized final int maxSize() {

  155. return maxSize;

  156. }

  157. /**

  158. * Returns the number of times {@link #get} returned a value that was

  159. * already present in the cache.

  160. */

  161. public synchronized final int hitCount() {

  162. return hitCount;

  163. }

  164. /**

  165. * Returns the number of times {@link #get} returned null or required a new

  166. * value to be created.

  167. */

  168. public synchronized final int missCount() {

  169. return missCount;

  170. }

  171. /**

  172. * Returns the number of times {@link #create(Object)} returned a value.

  173. */

  174. public synchronized final int createCount() {

  175. return createCount;

  176. }

  177. /**

  178. * Returns the number of times {@link #put} was called.

  179. */

  180. public synchronized final int putCount() {

  181. return putCount;

  182. }

  183. /**

  184. * Returns the number of values that have been evicted.

  185. * 返回被回收的数量

  186. */

  187. public synchronized final int evictionCount() {

  188. return evictionCount;

  189. }

  190. /**

  191. * Returns a copy of the current contents of the cache, ordered from least

  192. * recently accessed to most recently accessed. 返回当前cache的副本,从最近最少访问到最多访问

  193. */

  194. public synchronized final Map<K, V> snapshot() {

  195. return new LinkedHashMap<K, V>(map);

  196. }

  197. @Override public synchronized final String toString() {

  198. int accesses = hitCount + missCount;

  199. int hitPercent = accesses != 0 ? (100 * hitCount / accesses) : 0;

  200. return String.format(“LruCache[maxSize=%d,hits=%d,misses=%d,hitRate=%d%%]”,

  201. maxSize, hitCount, missCount, hitPercent);

  202. }

  203. }

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

推荐学习资料

  • Android进阶学习全套手册

  • Android对标阿里P7学习视频

  • BAT TMD大厂Android高频面试题

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

推荐学习资料

  • Android进阶学习全套手册

    [外链图片转存中…(img-AOGVfTxA-1712431372233)]

  • Android对标阿里P7学习视频

    [外链图片转存中…(img-LwG5brQL-1712431372233)]

  • BAT TMD大厂Android高频面试题

[外链图片转存中…(img-JXfynh2N-1712431372233)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值