Which started out life as a cheap Java clone (which started out as a cheap C++ clone, written by people who didn't grok C++ or OOP), but has evolved into the language that Java always should have been
This pretty much summarizes it as concise as one can say it in one sentence.
Most of the intrinsic hatred towards Java comes from a sucks-ass implementation 15 years ago, which made unrealistic claims that it couldn't hold. Java started out as a "better C++" which was considerably worse, considerably slower, unstable, and took a huge download (half an hour at the university, which at that time had an internet connection about 7,000 times faster than what you could get at home...). The only truly cool thing about Java at that time was the built-in high quality 2D vector graphics. That, and the cross-platform GUI which was so slow you could walk away and get a coffee after pressing a mouse button. Which, besides, was only cross-platform in theory, because you could only get Java for exactly 1 non-Sun-workstation platform.
I've been one of the biggest Java haters on the planet. However, all the historic negative arguments no longer hold true. Java is entirely competitive nowadays. A computer nowadays typically has somewhat more than 64 MiB of memory, and a few thousand cycles more or less don't matter a lot either (plus, JIT really works well in the mean time, and JIT compilers surprisingly aren't all that bad).
The "code monkey" problem addressed earlier surely exists, but that is probably just because the standard library coming with Java is so complete that (if you can live with somewhat less-than-optimal performance in the worst case) you really don't need an awful lot of skill to code. Plus, care-free automatic memory management and some other language features lend to the same effect. It's also more profitable to hire unqualified programmers, because a lower quality product that makes it to market sooner than the competition and costs less brings more revenue, as long as it only works
somehow.
That does not mean Java is bad as such, however. That would be like saying "beer is stupid" because some people drink it until they pass out in their own vomit.
The totally-complete standard library is one of the major reasons why C# is so successful, too. It's not so much that one or the other language is "superior" in any way, but developing in Java or C# sometimes just makes the development process up to a dozen times faster. Time is money, which means development is cheaper. And that's what counts.