Ugh, this sounds exactly like an Object Pool to me. But, then you wouldn't need to delete the Objects, instead, you would just set them to a value that you wouldn't use so they can be used again. Below is an implementation for objects (not written by me but borrowed...)
public final T acquireObject()
if( collectedTrash.size() > 0 )
You realise when you call collectedTrash.remove(0) you're causing the entire backing array of ArrayList to be copied 1 place to the left? If it's large you're probably costing yourself a lot more than you gain from eliminating GC. Better off using a LinkedList or collectedTrash.remove(collectedTrash.size() - 1).
edit: Don't use a LinkedList because that will create another wrapper object which will get GC'd in place of the pooled object.