Skip to content

Commit bf00483

Browse files
committed
LRU实现
1 parent bb24570 commit bf00483

File tree

4 files changed

+201
-0
lines changed

4 files changed

+201
-0
lines changed

lru/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>algorithm-study</artifactId>
7+
<groupId>com.mistray</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>lru</artifactId>
13+
14+
15+
</project>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.mistray;
2+
3+
import java.util.LinkedHashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* 实现了LRU的LinkedHashMap
8+
*
9+
* @author ZJY(MistRay)
10+
* @Project algorithm-study
11+
* @Package com.mistray
12+
* @create 2019年10月14日 20:24
13+
* @Desc LRU
14+
*/
15+
public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
16+
17+
/**
18+
* 建议数值 2^n-1(3 7 15 31...)
19+
*/
20+
private final int maxCapacity;
21+
22+
private static final float DEFAULT_LOAD_FACTOR = 1f;
23+
24+
public LRULinkedHashMap(int maxCapacity) {
25+
super(maxCapacity + 1, DEFAULT_LOAD_FACTOR, true);
26+
this.maxCapacity = maxCapacity;
27+
}
28+
29+
@Override
30+
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
31+
return size() > maxCapacity;
32+
}
33+
}
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
/**
2+
* Copyright © FEITIAN Technologies Co., Ltd. All Rights Reserved.
3+
*
4+
* @Date 2019年2月22日, 上午10:35:35
5+
*/
6+
package com.mistray;
7+
8+
import java.util.Collection;
9+
import java.util.Map;
10+
import java.util.Set;
11+
import java.util.concurrent.locks.Lock;
12+
import java.util.concurrent.locks.ReadWriteLock;
13+
import java.util.concurrent.locks.ReentrantReadWriteLock;
14+
15+
/**
16+
* 包装持有读写锁的map
17+
*
18+
* @author ZJY(MistRay)
19+
* @Project algorithm-study
20+
* @Package com.mistray
21+
* @create 2019年10月14日 20:24
22+
* @Desc 读写锁
23+
*/
24+
public class ReadWriteMapWrapFactory {
25+
26+
public static <K, V> Map<K, V> readWriteMap(Map<K, V> m) {
27+
return new ReadWriteMap<K, V>(m);
28+
}
29+
30+
private static class ReadWriteMap<K, V> implements Map<K, V> {
31+
private final Map<K, V> map;
32+
33+
private final ReadWriteLock lock = new ReentrantReadWriteLock();
34+
35+
private final Lock r = lock.readLock();
36+
37+
private final Lock w = lock.writeLock();
38+
39+
public ReadWriteMap(Map<K, V> map) {
40+
this.map = map;
41+
}
42+
43+
public V put(K key, V value) {
44+
w.lock();
45+
try {
46+
return map.put(key, value);
47+
} finally {
48+
w.unlock();
49+
}
50+
}
51+
52+
public V get(Object key) {
53+
r.lock();
54+
try {
55+
return map.get(key);
56+
} finally {
57+
r.unlock();
58+
}
59+
}
60+
61+
public int size() {
62+
r.lock();
63+
try {
64+
return map.size();
65+
} finally {
66+
r.unlock();
67+
}
68+
}
69+
70+
public boolean isEmpty() {
71+
r.lock();
72+
try {
73+
return map.isEmpty();
74+
} finally {
75+
r.unlock();
76+
}
77+
}
78+
79+
public boolean containsKey(Object key) {
80+
r.lock();
81+
try {
82+
return map.containsKey(key);
83+
} finally {
84+
r.unlock();
85+
}
86+
}
87+
88+
public boolean containsValue(Object value) {
89+
r.lock();
90+
try {
91+
return map.containsValue(value);
92+
} finally {
93+
r.unlock();
94+
}
95+
}
96+
97+
public V remove(Object key) {
98+
w.lock();
99+
try {
100+
return map.remove(key);
101+
} finally {
102+
w.unlock();
103+
}
104+
}
105+
106+
public void putAll(Map<? extends K, ? extends V> m) {
107+
w.lock();
108+
try {
109+
map.putAll(m);
110+
} finally {
111+
w.unlock();
112+
}
113+
}
114+
115+
public void clear() {
116+
w.lock();
117+
try {
118+
map.clear();
119+
} finally {
120+
w.unlock();
121+
}
122+
}
123+
124+
public Set<K> keySet() {
125+
r.lock();
126+
try {
127+
return map.keySet();
128+
} finally {
129+
r.unlock();
130+
}
131+
}
132+
133+
public Collection<V> values() {
134+
r.lock();
135+
try {
136+
return map.values();
137+
} finally {
138+
r.unlock();
139+
}
140+
}
141+
142+
public Set<Entry<K, V>> entrySet() {
143+
r.lock();
144+
try {
145+
return map.entrySet();
146+
} finally {
147+
r.unlock();
148+
}
149+
}
150+
}
151+
152+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<modules>
1111
<module>sort</module>
1212
<module>sort</module>
13+
<module>lru</module>
1314
</modules>
1415
<name>algorithm-study</name>
1516
<packaging>pom</packaging>

0 commit comments

Comments
 (0)