@Override public boolean addAll(Collection<? extends E> c) { boolean result = false; for (E element : c) { result |= add(element); } return result; }
@Override public int indexOf(Object o) { E element = cast(o); return element == null ? -1 : referenceList.indexOf(createWeakReference(element)); }
@SuppressWarnings("unchecked") @Override public <T> T[] toArray(T[] a) { compact(); Object[] ary = referenceList.toArray(a); for (int i = 0; i < ary.length; i++) { ary[i] = getReferent((WeakReference<E>) ary[i]); } return (T[]) ary; }
/** * Sets a weak reference to the specified element. */ @Override public E set(int index, E element) { E previous = get(index); referenceList.set(index, createWeakReference(element)); return previous; }
/** * Removes the weak reference at the specified index. */ @Override public E remove(int index) { return getReferent(referenceList.remove(index)); }
/** * Inserts a weak reference to the specified element at a specified index. */ @Override public void add(int index, E element) { referenceList.add(index, createWeakReference(element)); }
@Override public boolean isEmpty() { compact(); return referenceList.isEmpty(); }
@Override public boolean removeAll(Collection<?> c) { boolean result = false; for (Object element : c) { result |= remove(element); } return result; }
@Override public boolean contains(Object o) { return contains(referenceList, o); }
@Override public Iterator<E> iterator() { return getIterator(referenceList); }
@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()); }
/** * Returns the element referenced at the specified index. If the element has already been * garbage-collected, null is returned. */ @Override public E get(int index) { return getReferent(referenceList.get(index)); }
@Override public boolean add(E e) { return referenceList.add(createWeakReference(e)); }
/** * Returns the size of the underlying list. */ @Override public int size() { compact(); return referenceList.size(); }
@Override public int lastIndexOf(Object o) { E element = cast(o); return element == null ? -1 : referenceList.lastIndexOf(createWeakReference(element)); }
@Override public boolean addAll(int index, Collection<? extends E> c) { boolean result = false; for (E element : c) { add(index++, element); result = true; } return result; }
@Override public boolean remove(Object o) { E element = cast(o); return element != null && referenceList.remove(createWeakReference(element)); }
/** * Copy constructor * * @param source Instance to be copied. */ public WeakList(WeakList<E> source) { super(); for (E element : source) { if (element != null) { add(element); } } }