Added TimedHashSet that entries have limited TTL
This commit is contained in:
parent
66bebc6f52
commit
33e749dfc7
2 changed files with 91 additions and 0 deletions
52
src/zutil/struct/TimedHashSet.java
Executable file
52
src/zutil/struct/TimedHashSet.java
Executable file
|
|
@ -0,0 +1,52 @@
|
|||
package zutil.struct;
|
||||
|
||||
import java.util.AbstractSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* This is a timed HashSet. Each entry has a limited time to live.
|
||||
*/
|
||||
public class TimedHashSet<T> {
|
||||
|
||||
private HashMap<T, Long> map;
|
||||
private long ttl;
|
||||
|
||||
/**
|
||||
* @param ttl milliseconds the entries will live
|
||||
*/
|
||||
public TimedHashSet(long ttl){
|
||||
this.ttl = ttl;
|
||||
this.map = new HashMap<>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if the object already existed in the set which will reset the TTL.
|
||||
*/
|
||||
public boolean add(T o){
|
||||
return map.put(o, System.currentTimeMillis()) != null;
|
||||
}
|
||||
|
||||
public boolean contains(Object o){
|
||||
if(map.containsKey(o)){
|
||||
if(map.get(o) + ttl < System.currentTimeMillis()) // entry to old
|
||||
map.remove(o);
|
||||
else
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Iterates through the Set and removes all entries that has passed the TTL
|
||||
*/
|
||||
public void garbageCollect(){
|
||||
for(T o : map.keySet()){
|
||||
if(map.get(o) + ttl < System.currentTimeMillis()) // entry to old
|
||||
map.remove(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
39
test/zutil/test/TimedHashSetTest.java
Executable file
39
test/zutil/test/TimedHashSetTest.java
Executable file
|
|
@ -0,0 +1,39 @@
|
|||
package zutil.test;
|
||||
|
||||
import org.junit.Test;
|
||||
import zutil.struct.TimedHashSet;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Created by Ziver on 2015-11-20.
|
||||
*/
|
||||
public class TimedHashSetTest {
|
||||
public static final String ENTRY = "key";
|
||||
|
||||
@Test
|
||||
public void zeroTTL() throws InterruptedException {
|
||||
TimedHashSet set = new TimedHashSet(0);
|
||||
set.add(ENTRY);
|
||||
Thread.sleep(1);
|
||||
assertFalse(set.contains(ENTRY));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tenMsTTL() throws InterruptedException {
|
||||
TimedHashSet set = new TimedHashSet(10);
|
||||
set.add(ENTRY);
|
||||
Thread.sleep(1);
|
||||
assert(set.contains(ENTRY));
|
||||
Thread.sleep(10);
|
||||
assertFalse(set.contains(ENTRY));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void oneSecTTL() throws InterruptedException {
|
||||
TimedHashSet set = new TimedHashSet(1000);
|
||||
set.add(ENTRY);
|
||||
Thread.sleep(1);
|
||||
assert(set.contains(ENTRY));
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue