Skip to content

Instantly share code, notes, and snippets.

@Daomephsta
Created January 24, 2018 05:28
Show Gist options
  • Save Daomephsta/02b06437ea410f9bf77060fbda7a2747 to your computer and use it in GitHub Desktop.
Save Daomephsta/02b06437ea410f9bf77060fbda7a2747 to your computer and use it in GitHub Desktop.
public class WeakArrayList<E> extends AbstractList<E>
{
private List<WeakReference<E>> backingList = new ArrayList<>();
@Override
public E get(int index)
{
clean();
WeakReference<E> obj = backingList.get(index);
return obj != null ? obj.get() : null;
}
@Override
public E set(int index, E element)
{
clean();
WeakReference<E> ret = backingList.set(index, new WeakReference<>(element));
return ret != null ? ret.get() : null;
}
@Override
public void add(int index, E element)
{
backingList.add(index, new WeakReference<>(element));
}
@Override
public boolean remove(Object o)
{
if (backingList.isEmpty()) return false;
for (Iterator<WeakReference<E>> iter = backingList.iterator(); iter.hasNext();)
{
WeakReference<E> ref = iter.next();
if (ref.get() == null || ref.get().equals(o))
{
iter.remove();
return true;
}
}
return false;
}
@Override
public boolean contains(Object o)
{
if (backingList.isEmpty()) return false;
for (Iterator<WeakReference<E>> iter = backingList.iterator(); iter.hasNext();)
{
WeakReference<E> ref = iter.next();
if (ref.get() == null)
{
iter.remove();
return false;
}
else if(ref.get().equals(o)) return true;
}
return false;
}
@Override
public int indexOf(Object o)
{
if (backingList.isEmpty()) return -1;
for (ListIterator<WeakReference<E>> listIter = backingList.listIterator(); listIter.hasNext();)
{
WeakReference<E> ref = listIter.next();
if (ref.get() == null) listIter.remove();
else if(ref.get().equals(o)) return listIter.nextIndex() - 1;
}
return -1;
}
@Override
public int lastIndexOf(Object o)
{
if (backingList.isEmpty()) return -1;
int index = -1;
for (ListIterator<WeakReference<E>> listIter = backingList.listIterator(); listIter.hasNext();)
{
WeakReference<E> ref = listIter.next();
if (ref.get() == null) listIter.remove();
else if(ref.get().equals(o)) index = listIter.nextIndex() - 1;
}
return index;
}
@Override
public int size()
{
return backingList.size();
}
private void clean()
{
for (Iterator<WeakReference<E>> iter = backingList.iterator(); iter.hasNext();)
{
WeakReference<E> ref = iter.next();
if(ref.get() == null) iter.remove();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment