主要成员变量:
private transient Entry<K,V> header;
主要方法
public V put(K key, V value) { //这是HashMap中的方法。由于LinkedHashMap继承了HashMap
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i); //添加数据的真正会调用这个方法
return null;
}
void addEntry(int hash, K key, V value, int bucketIndex) {//这个方法被LinkedHashMap复写了所以上面会调用它
createEntry(hash, key, value, bucketIndex);
// Remove eldest entry if instructed, else grow capacity if appropriate
Entry<K,V> eldest = header.after;
if (removeEldestEntry(eldest)) { //这里用来判断是否需要调用移除方法
removeEntryForKey(eldest.key);
} else {
if (size >= threshold)
resize(2 * table.length);
}
}
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { //分析可知默认为没有大小限制
return false;
}
从这里我们可以容易的给LinkedHashMap加上大小限制
private static LinkedHashMap<String,Object> data = new LinkedHashMap<String,Object>(){
protected boolean removeEldestEntry(Map.Entry<String,Object> eldest) {
if(size()>5){
return true;
}
return false;
}
};
这里表示大小大于5时会调用删除方法
补充:Entry的源码分析
static class Entry<K,V> implements Map.Entry<K,V>
主要成员变量:
final K key;
V value;
Entry<K,V> next;
final int hash;
分析可知它的结构使他的键无法改变,值可以改变。并且他的next保存了下一对象的引用使得可以遍历所有的数据