public final V get(K key) {
if (key == null) {
throw new NullPointerException("key == null");
}
V mapValue;
synchronized (this) {
// 查找,并根据访问排序的规则,该key的数据将被放置到map队列末尾
mapValue = map.get(key);
if (mapValue != null) {
hitCount++;
return mapValue;
}
missCount++;
}
// 尝试新建一个(不明觉厉)
V createdValue = create(key);
if (createdValue == null) {
return null;
}
synchronized (this) {
createCount++;
// 并加到map中
mapValue = map.put(key, createdValue);
if (mapValue != null) {
//如果冲突了,把映射的mapValue,put进去
map.put(key, mapValue);
} else {
// size++
size += safeSizeOf(key, createdValue);
}
}
if (mapValue != null) {
// 又释放掉了
entryRemoved(false, key, createdValue, mapValue);
return mapValue;
} else {
// 刷新map,移除超size的数据
trimToSize(maxSize);
return createdValue;
}
}