For the speed sensitive part in High Frequency Trading, Java is just not good enough.
Java doesn't allow one enough control over object layout. In particular, it lacks a compact memory layout that the array and vector provide. An ArrayList of object references is not the same.
Java also has a non-zero object overhead, resulting in objects being larger.
Both results in cache misses, which worsens reaction time.
And in HFT, Winner takes all - There is no second place.
Lots of comments on the other answers incorrectly concentrate on the Garbage Collector. GC doesn't matter at all. During the speed sensitive part, GC won't be triggered. And there will be enough time between two speed sensitive events to do as much house keeping as required- no HFT system should be anywhere near 100% load.
Part of any as-fast-as-possible design, is postponing anything not crucial for sending out the order until after sending it. In fact, GC could actually help in that aspect! In practice, it is usually easier to just allocate the memory required on startup, and reuse it.
Of course, there are also parts that are not speed sensitive: GUI, post-processing, risk calculations, monitoring, and so on. Those parts can be done in almost any language, including Java.