Collections Data Structure Java

//Revised from objectweb jac
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
public class WeakList extends AbstractList {
    /**
     * Reference queue for cleared weak references
     */
    private final ReferenceQueue queue = new ReferenceQueue();
   
    private final List list=new ArrayList();
    public boolean add(Object o) {
        expungeStaleEntries();
        return list.add(new ListEntry(o,queue));
    }
    public Object get(int i) {
        expungeStaleEntries();
        return ((Reference)list.get(i)).get();
    }
    public int size() {
        //new Exception().printStackTrace();
        expungeStaleEntries();
        return list.size();
    }
    public Object remove(int index) {
        return ((ListEntry)list.remove(index)).get();
    }
    /**
     * Expunge stale entries from the list.
     */
    private void expungeStaleEntries() {
        Object r;
        while ( (r = queue.poll()) != null) {
            ListEntry e = (ListEntry)r;
            int i=list.indexOf(r);
            if(i!=-1) {
                list.remove(i);
            }
        }
    }
    private static class ListEntry extends WeakReference {
        String objectString;
        public ListEntry(Object o,ReferenceQueue queue) {
            super(o,queue);
            objectString=o.toString();
        }
        public boolean equals(Object o) {
            if(o==null) {
                return false;
            } else {
                if((o instanceof ListEntry)) {
                    return o.hashCode()==this.hashCode();
                } else {
                    if(this.get()==null) return false;
                    return this.get().equals(o);
                }
            }
        }
        public String toString() {
            if(this.get()==null) {
                return "'entry "+objectString+" '";
            } else {
                return "'entry "+this.get()+"'";
            }
        }
      
    }
}