That's the spirit, take all the advice you can get, research to filter out the bad advice.
Good luck on the paint, feel free to pm me for advice
Just another quick tip, for functional interfaces like Filter (interfaces with 1 method), you should use a lambda expression:
npcs.closest(npc -> ...);
Since anonymous classes are still classes, class files are generated for each one you declare. Since lambdas use method handles, they are not a victim of this. Shrinks the amount of space your project consumes and is less verbose. I also suggest checking out this thread about using MethodProvider's fields rather than getter methods
It may confuse people into thinking VMs can handle many short-lived objects without worry.
For anyone whos wondering, the article is stating that GC algorithms have been adjusted to sweep dead objects when memory is needed (more specifically, for the young generation of heap).
If objects aren't continuously being created within a short time frame, then its most likely not a problem.
A better way to handle this situation is to profile your code, don't optimize based on assumptions