Student perspective ramble ahead:
Mostly I use Java because it's what they require for a lot of my modules at university. Some things about Java really stick out as annoying to me - but for some reason the one that annoys me the most is the inconsistent naming for lengths of array-like data structures. For instance, to get the length of an array it's array.length; to get the length of a string it's string.length(); to get the length of a List of any kind (e.g. ArrayList), it's List.size(); - then there are all these convention breaking pieces of syntax in the standard library and basic language constructs (again array.length is accessed as some kind of readonly field which is doesn't exist as a construct anywhere else in the language, even though it would be handy). It just comes across as unnecessarily inelegant.
I think a large part of Java's problem is that it tries to design around the fact that some developers are lazy and/or stupid. For instance it does away with unsigned types because the designers of the language consider them 'difficult' ("Quiz any C developer about unsigned, and pretty soon you discover that almost no C developers actually understand what goes on with unsigned, what unsigned arithmetic is. Things like that made C complex."), despite the fact that the absense of such types can cause difficulties further down the line.
Of course, Java is the language of choice for many enterprise systems and for one of the most common platforms of the current generation of technology, Android, so what do I know?
In my opinion, Java is great for the 'big' stuff. Java is a fantastic 'glue' language. It makes structuring large code bases pretty simple because of its emphasis on simplicity in OOP principles - it makes implementing a lot of common design patterns very easy. It's absolutely awful as soon as you want to do anything intricate with it, however. At the point of implementation of methods, I think you're going to be a lot happier using something like Python, C or Haskell (depending on performance requirements, and personal preference). C# makes better compromises at that lower level than Java does, in my opinion, while maintaining the functionality that makes Java nice for implementing high level design patterns - the compromise with that then is that you're either tied to .NET or you have to use Mono or something.
Edit: Also, this might be interesting reading:
http://www.techempower.com/blog/2013/03/26/everything-about-java-8/ - Java 8 does seem to alleviate some of my previous criticisms.