Reduce the number of temporary objects being used, especially in
loops.
Avoid creating temporary objects within frequently called methods.
Presize collection objects.
Reuse objects where possible.
Empty collection objects before reusing them. (Do not shrink them
unless they are very large.)
Use custom conversion methods for converting between data types
(especially strings and streams) to reduce the number of temporary
objects.
Define methods that accept reusable objects to be filled in with
data, rather than methods that return objects holding that data. (Or
you can return immutable objects.)
Canonicalize objects wherever possible. Compare canonicalized objects
by identity.
Create only the number of objects a class logically needs (if that is
a small number of objects).
Replace strings and other objects with integer constants. Compare
these integers by identity.
Use primitive data types instead of objects as instance variables.
Avoid creating an object that is only for accessing a method.
Flatten objects to reduce the number of nested objects.
Preallocate storage for large collections of objects by mapping the
instance variables into multiple arrays.
Use StringBuffer rather than the string
concatenation operator (+).
Use methods that alter objects directly without making copies.
Create or use specific classes that handle primitive data types
rather than wrapping the primitive data types.