Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /