Browse Source

change capacity

Looly 5 years ago
parent
commit
2e9e174594

+ 1 - 0
CHANGELOG.md

@@ -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)

+ 6 - 11
hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java

@@ -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()) {

+ 4 - 4
hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java

@@ -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