James Sutherland has published a series of microbenchmarks on performance of specific twinned classes - things like Hashtable vs. HashMap, etc. etc. He has some interesting conclusions.
True performance optimization involves measuring the current performance. Profiling the application and determining the bottlenecks. Investigating and implementing optimizations to avoid the bottlenecks.
But how should one code on a day to day basis for optimal performance? Are synchronized methods slow? Are final methods fast? What is faster Vector, ArrayList or LinkedList? What is the optimal way to iterate a List? Is refection slow? I will attempt to answer these questions in this post.
For Hashtable/HashMap: Hashtable wins.
Between Vector and ArrayList, ArrayList wins.
For iteration, using the index into an ArrayList/Vector is fastest, with an Enumeration being faster than an Iterator.
There are more results (mostly focused on reflection and methods being set to final, and stuff like that) but what stands out to me is a hole in methodology: he used an old JVM (1.6.0_07 or so, maybe he was unable to uninstall and update, like that java champion?) and he mostly reports from single-threaded use.
That last point is the thing that bugs me: everything was single-threaded. On one hand, that makes sense - most code is single-threaded. People don't code for multiple thread-access to a single collection. On the other hand, it's more common than you might think, and the effects can be pretty bad if you're not at least ready to go threadsafe; on the third hand, maybe you shouldn't use Java if you're doing major threading. The JVM, fine, but use Scala or something.