在项目开发中,需要一个数据容器,需要快速存储数据,和随机读取。所以设计了一种linklist和hashmap的数据结构,linklist是副表,存储索引,hashmap是主表,存储数据。这是典型的以空间换时间做法。
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ymcn.util;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
public class LruCache<K, V> {
private final HashMap<K, V> mLruMap;
private final LinkedList<K> products = new LinkedList<K>();
@SuppressWarnings("serial")
public LruCache(final int capacity) {
mLruMap = new LinkedHashMap<K, V>(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
};
}
public static class Entry<K, V>{
public K mKey;
public V mValue;
public Entry(K key, V value) {
mKey = key;
mValue=value;
}
}
public synchronized V put(K key, V value) {
if(mLruMap.containsKey(key)){//存在这个key
mLruMap.remove(key);
mLruMap.put(key, value);
}else{
mLruMap.put(key, value);
products.add(key);
}
return value;
}
public synchronized void clear() {
mLruMap.clear();
products.clear();
}
// public synchronized void remove(K key) {
// mLruMap.remove(key);
// products.remove(key);
// }
public synchronized int getlength(){
return mLruMap.size();
}
public synchronized Entry<K,V> getAndRemoveFirstKey(){
if(products.isEmpty()){
return null;
}
K key = products.removeFirst();
V value = mLruMap.get(key);
mLruMap.remove(key);
return new Entry<K, V>(key, value);
}
}