/**
*
*/
package ecologylab.collections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author andruid
*
*/
public class ConcurrentHashMapArrayList<K, V> extends ConcurrentHashMap<K, V> implements Iterable<V>
{
protected final ArrayList<V> arrayList;
/**
*
*/
public ConcurrentHashMapArrayList()
{
arrayList = new ArrayList<V>();
}
/**
* @param initialCapacity
*/
public ConcurrentHashMapArrayList(int initialCapacity)
{
super(initialCapacity);
arrayList = new ArrayList<V>(initialCapacity);
}
/**
* @param m
*/
public ConcurrentHashMapArrayList(Map<? extends K, ? extends V> m)
{
super(m);
arrayList = new ArrayList<V>(m.size());
}
/**
* @param initialCapacity
* @param loadFactor
*/
public ConcurrentHashMapArrayList(int initialCapacity, float loadFactor)
{
super(initialCapacity, loadFactor);
arrayList = new ArrayList<V>(initialCapacity);
}
/**
* @param initialCapacity
* @param loadFactor
* @param concurrencyLevel
*/
public ConcurrentHashMapArrayList(int initialCapacity, float loadFactor, int concurrencyLevel)
{
super(initialCapacity, loadFactor, concurrencyLevel);
arrayList = new ArrayList<V>(initialCapacity);
}
@Override public V put(K key, V value)
{
V result = super.put(key, value);
if (result != null) // the object that was overridden
arrayList.remove(result);
arrayList.add(value);
return result;
}
@Override public void putAll(Map<? extends K, ? extends V> map)
{
for (K key : map.keySet())
this.put(key, map.get(key));
}
public V get(int index)
{
return arrayList.get(index);
}
@Override
public Iterator<V> iterator()
{
return arrayList.iterator();
}
@Override public V remove(Object key)
{
V result = super.remove(key);
if (result != null)
arrayList.remove(result);
return result;
}
@Override public void clear()
{
synchronized (this)
{
super.clear();
arrayList.clear();
}
}
public void recycle()
{
clear();
}
@Override public Collection<V> values()
{
return arrayList;
}
@Override
public V putIfAbsent(K key, V value)
{
V newValue = super.putIfAbsent(key, value);
if (newValue == null)
arrayList.add(value);
return newValue;
}
}