@Override public E put(K key, E value) { return getReferent(referenceMap.put(key, createWeakReference(value))); }
@Override public Collection<E> values() { compact(); return new AbstractCollection<E>() { @Override public Iterator<E> iterator() { return getIterator(referenceMap.values()); } @Override public int size() { return referenceMap.size(); } }; }
@Override public E remove(Object key) { return getReferent(referenceMap.remove(key)); }
@Override public Iterator<E> iterator() { return getIterator(referenceMap.values()); }
@Override public void putAll(Map<? extends K, ? extends E> map) { for (Entry<? extends K, ? extends E> entry : map.entrySet()) { put(entry.getKey(), entry.getValue()); } }
@Test public void testWeakCollections() { List<Object> list = new WeakList<>(); Map<String, Object> map = new WeakMap<>(); Object o1 = new Object(); Object o2 = new Object(); list.add(o1); list.add(o2); map.put("o1", o1); map.put("o2", o2); assertEquals(2, list.size()); assertEquals(2, map.size()); o1 = null; System.gc(); wait(3000); assertEquals(1, list.size()); assertEquals(1, map.size()); }
@Override public boolean isEmpty() { compact(); return referenceMap.isEmpty(); }
@Override public E get(Object key) { return getReferent(referenceMap.get(key)); }
@Override public Set<K> keySet() { compact(); return referenceMap.keySet(); }
/** * Returns the size of the underlying list. */ @Override public int size() { compact(); return referenceMap.size(); }
@Override public boolean containsKey(Object key) { compact(); return referenceMap.containsKey(key); }
@Override public void clear() { compact(); referenceMap.clear(); }
@Override public Set<Entry<K, E>> entrySet() { compact();