C# and Java are similar to the way they work, especially when you follow their lineage back to C, which was the first mainstream programming language that was more programmer-centric than it was compiler-centric. C and its extension C++ are both compiled languages. While Java and C# are part of a similar move to an intermediate bytecode language, the languages themselves are very different on the lowest level. The grammar and syntax is very similar, but both are part of totally different frameworks. C# is the poster-child language for the .NET framework, while Java has its own, eponymous framework. The Java framework is definitely more cross-platform than .NET, and rightfully so as Java was designed back when the Internet was starting to become popular and the need for a cross-platform application environment was clear. The .NET framework aims to boost application security and make code more portable between different Windows operating systems, so the target spread is quite different between the two platforms.
C# is a brand new language and is becoming the de facto standard for Windows software development, while Java is slowly (but surely) falling out of use as the dominant web programming language as dynamic languages like PHP, Ruby, and Python come into their own. Some popular Java projects like Groovy and JRuby have extended the relevance of the Java framework on this playing field by allowing veteran Java programmers to use the framework with dynamic languages, but I’m seeing a clear trend of Java programmers jumping to Ruby or Python.