change capacity

This commit is contained in:
Looly 2020-03-24 17:43:58 +08:00
parent 1497c430da
commit 2e9e174594
3 changed files with 11 additions and 15 deletions

View File

@ -10,6 +10,7 @@
* 【core 】 增加CityHash算法 * 【core 】 增加CityHash算法
* 【core 】 PageUtil支持setFirstPageNo自定义第一页的页码issue#I1CGNZ@Gitee * 【core 】 PageUtil支持setFirstPageNo自定义第一页的页码issue#I1CGNZ@Gitee
* 【http 】 UserAgentUtil增加Chromium内核的Edge浏览器支持issue#800@Github * 【http 】 UserAgentUtil增加Chromium内核的Edge浏览器支持issue#800@Github
* 【cache 】 修改FIFOCache中linkedHashMap的初始容量策略pr#801@Github
### Bug修复 ### Bug修复
* 【core 】 修复NumberWordFormatter拼写错误issue#799@Github * 【core 】 修复NumberWordFormatter拼写错误issue#799@Github

View File

@ -11,18 +11,17 @@ import java.util.LinkedHashMap;
* 优点简单快速 <br> * 优点简单快速 <br>
* 缺点不灵活不能保证最常用的对象总是被保留 * 缺点不灵活不能保证最常用的对象总是被保留
* </p> * </p>
*
* @author Looly
* *
* @param <K> 键类型 * @param <K> 键类型
* @param <V> 值类型 * @param <V> 值类型
* @author Looly
*/ */
public class FIFOCache<K, V> extends AbstractCache<K, V> { public class FIFOCache<K, V> extends AbstractCache<K, V> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 构造默认对象不过期 * 构造默认对象不过期
* *
* @param capacity 容量 * @param capacity 容量
*/ */
public FIFOCache(int capacity) { public FIFOCache(int capacity) {
@ -31,18 +30,14 @@ public class FIFOCache<K, V> extends AbstractCache<K, V> {
/** /**
* 构造 * 构造
* *
* @param capacity 容量 * @param capacity 容量
* @param timeout 过期时长 * @param timeout 过期时长
*/ */
public FIFOCache(int capacity, long timeout) { public FIFOCache(int capacity, long timeout) {
if(Integer.MAX_VALUE == capacity) {
capacity -= 1;
}
this.capacity = capacity; this.capacity = capacity;
this.timeout = timeout; this.timeout = timeout;
cacheMap = new LinkedHashMap<>(capacity + 1, 1.0f, false); cacheMap = new LinkedHashMap<>(Math.max(1 << 4, capacity >>> 7), 1.0f, false);
} }
/** /**
@ -53,7 +48,7 @@ public class FIFOCache<K, V> extends AbstractCache<K, V> {
protected int pruneCache() { protected int pruneCache() {
int count = 0; int count = 0;
CacheObj<K, V> first = null; CacheObj<K, V> first = null;
// 清理过期对象并找出链表头部元素先入元素 // 清理过期对象并找出链表头部元素先入元素
Iterator<CacheObj<K, V>> values = cacheMap.values().iterator(); Iterator<CacheObj<K, V>> values = cacheMap.values().iterator();
while (values.hasNext()) { while (values.hasNext()) {

View File

@ -1,9 +1,9 @@
package cn.hutool.cache.impl; package cn.hutool.cache.impl;
import java.util.Iterator;
import cn.hutool.core.map.FixedLinkedHashMap; import cn.hutool.core.map.FixedLinkedHashMap;
import java.util.Iterator;
/** /**
* LRU (least recently used)最近最久未使用缓存<br> * LRU (least recently used)最近最久未使用缓存<br>
* 根据使用时间来判定对象是否被持续缓存<br> * 根据使用时间来判定对象是否被持续缓存<br>
@ -37,12 +37,12 @@ public class LRUCache<K, V> extends AbstractCache<K, V> {
if(Integer.MAX_VALUE == capacity) { if(Integer.MAX_VALUE == capacity) {
capacity -= 1; capacity -= 1;
} }
this.capacity = capacity; this.capacity = capacity;
this.timeout = timeout; this.timeout = timeout;
//链表key按照访问顺序排序调用get方法后会将这次访问的元素移至头部 //链表key按照访问顺序排序调用get方法后会将这次访问的元素移至头部
cacheMap = new FixedLinkedHashMap<K, CacheObj<K, V>>(capacity); cacheMap = new FixedLinkedHashMap<>(capacity);
} }
// ---------------------------------------------------------------- prune // ---------------------------------------------------------------- prune