Quais as diferenças mais relevantes entre C# e Java?
Ambas são muito parecidas, mas a cultura em volta delas é muito diferente. Por exemplo, Java tenta ser mais explícita (ou era assim), C# tenta ser mais concisa. Mas é muito comum algumas pessoas pregarem a cultura do Java em C# (é incrível como elas chegam falar em cultura C# quando na verdade estão falando de práticas comuns em Java que foram importadas por algumas pessoas que não entendem a diferença).
Java tem uma comunidade mais ativa publicamente. Para o bem ou para o mal. Em alguns mercados possui mais vagas abertas, o que não significa que existam mais posições. Afinal em certas culturas é mais comum trocar de emprego que em outras. Nada muito diferente, mas Java é um pouco mais abrangente em algumas coisas, porém mais dispersa também, é muito comum a duplicação de esforços, competição de ferramentas (que pode ser bom ou ruim) e maneiras diferentes de fazer a mesma coisa. Isso tem mudado um pouco.
Licença e propriedade
A Microsoft não é dona do C#, ela só criou a linguagem, a propriedade é da .NET Foundation, então ela não é de domínio público, mas também não é de uma empresa, é quase de domínio de público, é até melhor porque há uma responsável (o domínio público tem implicações jurídicas ruins).
A Oracle é dona do Java, tem um histórico de processar quem adota suas tecnologias, seja pela Sun com o Java, seja pela Oracle mesmo. Atualmente (ou em passado em recente, sei lá) a Google está com problemas porque perdeu um processo que ela não pode usar mais o Java sem pagar fortunas e ainda terá que pagar pelo tempo que já usou. Espero que isso se reverta em segunda instância porque muda tudo no setor e prejudicará a todos, mas já deu para perceber que o produto não está em boas mãos. Não adianta o código fonte ser aberto se a tecnologia como um todo ser proprietária e quem a adota pode ser processado.
Alguns passos foram dados para Java ser um projeto mais aberto.
Paradigma
Java preza mais pela orientação a objeto embora seja essencialmente imperativo e agora está indo um pouquinho para o funcional.
C# marca de forma mais clara seu multi-paradigmatismo, embora se declare (ou declarava) orientada a objeto, ela tem muito forte o imperativo-procedural e viola a orientação a objeto quando isso for pragmático. Embora não seja uma linguagem essencialmente funcional tem partes desse paradigma muito forte e a evolução da linguagem remete a ser cada vez mais funcional. Ela também adere bem a orientação a contratos, eventos, padrões, é um pouco mais fácil ser orientada a aspectos (agora mais ainda com geração de código e com interceptors), é um pouco mais declarativa, enfim, ela abraça mais estilos. E ela dá muito valor à performance.
Ecossistema
Além da linguagem que possuem especificidades que agradam mais uma pessoa do que outra, o ecossistema faz diferença, sem dúvida. Não vou entrar muito nisso para não ficar longo.
Não é só o C# que possui bom IDE, Java também. Muitos gostam do Eclipse e tem nele, ou em plugins para ele, coisas que eu gostaria de ver no VS. Acho o VS pelado e um pouco inferior, mas quando junta com Resharper e outros plugins, ele fica ótimo mesmo. O VS "completo" é gratuito. Nem todos bons plugins são. Tem outras opções muito boas. A edição Enterprise é algo extraordinário, mesmo que nem todos precisem de tudo aquilo. Ambas tem bom suporte ao VS Code, a Microsoft lançou um plugin para ele bem completo.
É comum ter mais ferramentas e bibliotecas em Java do que em C#, especialmente gratuitos e de código aberto. Mas isso está mudando pouco a pouco.
Nem sempre ter vários significa boa coisa. Pode significar que nenhum atende bem as necessidades. Ter muitas escolhas pode ser angustiante, ou ser a solução ideal. Por exemplo, Java tem "trocentos" frameworks para backend web. Claro que poucos são bem usados e recomendados. C# atualmente só recomenda o ASP.NET MVC (na versão Core), Razor Pages e Minimal APIs e outras variações dele, ainda sendo o mesmo produto, há flexibilidade de estilos para atender várias demandas e qualquer outra é considerado legado. Talvez seja o melhor dos dois mundos.
Quase tudo o que é reconhecidamente bom em Java alguém faz um port para C# ou algo inspirado no que existe para Java. É raro o programador ficar na mão. O contrário também é verdadeiro, mas em menor grau, para o bem ou para o mal.
Existem bibliotecas, padrão ou não, para Java que são melhores, e o mesmo pode ser dito para o C#. Não saberia pesar qual sai ganhando aqui, e acho mais secundário. Tem soluções para tudo em ambas.
Plataformas
Outro ponto é que o C# roda em todas as 32 plataformas mobile mainstream. Java só roda em uma (agora roda em outra, mas não tão bem), e melhor, claro - mas não é bem Java puro e o mais moderno (até última vez que vi). Há tentativas para mudar isso, logo esta deficiência será sanada, se já não foi, mas não ouço falar de Java no iOS, mesmo que exista solução as pessoas não parecem usar. Fora Swift e Kotlin, parece que Java é usado ainda um pouco em uma das plataformas e C# se tornou a linguagem padrão quando quer as duas plataformas de forma nativa.
Nas plataformas desktop o C# agora roda com a mesma qualidade em todas. O Java ainda é arredio ao Windows (pode ter melhorado em alguns pontos). É verdade que o C# não vai bem em GUI multi-plataforma - tem opções mas não é o ideal (melhorou com o MAUI). Mas é bem questionável o quanto o Java faz isso com sucesso. Ambas possuem opções de GUI confusas e legadas.
Evolução
C# começou copiando muito o Java, isso era motivo de piada. Hoje tem ocorrido muito o contrário.
C# abriu o código de forma mais livre e mais completa antes do Java. Os tendenciosos não reconhecem isso porque um ponto que eles consideravam forte era a liberdade que o Java tinha, o que nunca foi essa verdade toda.
C# começou antes melhorar a modularização e diminuição da dependência do CLR padrão. JVM tem propostas para isso (acho que agora tem opção assim).
Aliás, várias melhorias do Java se deram quando o C# surgiu mostrando que vinha com diversas coisas mais modernas, desde construções da linguagem até melhorias de desempenho. A melhor coisa que aconteceu para o Java foi o surgimento do C#.
C# foi ficando melhor a cada versão, Java está correndo atrás. Em alguns casos ela até está fazendo melhor que o C#. Em geral quem faz depois, faz melhor porque aprendeu com o erro de quem foi pioneiro. Há casos que não dá mais para arrumar sem tornar o código incompatível, tem erros que cometidos no começo não podem ser consertados. O C# já sofre com isso também. Eu acho que o C# era para ser melhor do que é. É reconhecido que eles tiveram a oportunidade de consertar mais erros do Java do que fizeram, certamente muitas características funcionais seriam melhores se a linguagem tivesse esperado uns 2 ou 3 anos para ser lançada.
Hoje ambas são bem maduras.
Item por item
Já adianto que na maior parte dos casos a escolha será feita por gosto ou por algum aspecto político e não técnico. Ambas tem defeitos e qualidades, ambas resolvem bem qualquer tipo de problema que este tipo de linguagem pode resolver, afinal elas são do mesmo paradigma. Ambas rodam essencialmente nos mesmos lugares, com poucas diferenças. Para web ambas são muito boas, uma com vários frameworks e outras com menos, porém mais bem estabilizado.
Fiz uma revisão considerando Java 23 e C# 13 (algumas são especulações, especialmente nas versões mais novas).
Por falta de espaço colocarei em comentário abaixo.
Conclusão
Não vou perder tempo com pequenas diferenças sintáticas. Também não vou entrar em detalhes quando uma implementa algo um pouco melhor que a outra, mas sem muita relevância. Entrando no campo da opinião, acho o guia de estilo do Java pior do que do C#.
Desconsiderei tudo que é experimental ou preview.
Tudo que dá para fazer em uma linguagem dá para fazer na outra, e nem é tão diferente assim entre elas, mas as muitas pequenas diferenças acabam sendo importantes no final.
Você pode achar que fui tendencioso por mostrar um monte de coisa que o C# tem e o Java não, mas é assim mesmo. Java é uma linguagem mais simples, isso tem seu mérito, mas ela é simples de aprender, nem tanto de usar. Java está melhorando muito em recursos nas últimas versões, e isso é bom, apesar de estar perdendo a simplicidade que ela tinha, não tem como ter tudo.
Eu vejo muitas vezes as pessoas dizerem "que bom que minha linguagem preferida não tem o recurso tal", só que elas adoram quando a linguagem coloca aquilo depois, e acham até que ficou melhor que a outra. Outros ficam na teimosia, esse tipo de atitude não é boa para profissionais, ninguém deveria se apaixonar por tecnologias.
O Jon Skeet é reconhecidamente muito bom nas duas linguagens e trabalha com ambas. Se ele pudesse escolher qual usar integralmente, claramente seria o C#. Minha resposta foi muito baseada na resposta dele e de outros no SO.
O Neal Gafter esteve muito envolvido na criação e evolução do Java por mais de 10 anos e agora está quase igualando esse tempo envolvido com a evolução do C#, e me parece que ele prefere o C#.
Mais referências aqui e aqui. Na Wikipedia.
Aceito sugestões/edições. Posso ter esquecido alguma coisa.
Coloquei no GitHub para referência futura.
S2
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).