C - язык, созданный университетскими хакерами для себя, с упором на мощь и гибкость.
Java - язык, созданный для посредственных программистов, работающих в корпорациях, с упором на то, чтобы они не отстрелили себе ноги.
Поэтому C популярен сам по себе, а Java гальванизируется теми же корпорациями, причём некоторые из них уже отказались от самого языка, но не отказались от исполняющей среды JVM (используют Kotlin, Scala, Clojure и др. языки на JVM).
На C написаны операционные системы, в силу этого на нём пишут драйвера и прочие низкоуровневые вещи. Он представляет гарантии по расположению полей в памяти и по накладным расходам на скомпилированный код. Т.к. это компилируемый язык, на нём также пишут алгоритмы, которые должны выполняться быстро (речь именно о константном факторе, не об асимптотике, которую можно эффективно писать на любом языке). Системы реального времени (хард реалтайм) пишут на C и др. компилируемых языках.
На Java никогда не пишут низкоуровневые программы или хард реалтайм, но в настоящее время уже свободно пишут высокопроизводительные системы, расчёты, где важна скорость исполнения (современный JIT нередко обгоняет по производительности машинного кода и статические компиляторы, и самих программистов), софт реалтайм. Также пишут ПО, которое не страшно доверить выпускникам видеокурсов и колледжей: тонкие интеграционные прокладки между системами, логику обработки бизнес-процессов на готовом движке (где каждый шаг сводится к паре-тройке интеграционных вызовов и перекладке полей из структуры в другую структуру). Одно время писали "толстых" клиентов на свинге, но сейчас везде браузеры и веб, так что это неактуально.
Не лишним будет отметить, что люди, принимающие решения по выбору стека, часто путают алгоритмические оптимизации с низкоуровневыми, поэтому распространённой многолетней традицией, является, например, выбор C для потоковой обработки видео, в которой основная проблема - дефицит алгоритмов, а не скорости исполнения отдельных операторов языка. Но в этой реальности приходится жить.
И C, и Java позволяют писать высокоуровневый код с применением CSP Хоара, лямбда-исчисления, комбинаторной логики и др. математики, которую не во всяком ВУЗе преподают. Разница в том, что для C такого инструментария нет, и разработчику придётся писать всё с нуля (погугли "десятое правило Гринспена"
, а для Java он процентов на 20 реализован в языке и стандартных компонентах (Java-комитет активно сопротивляется введению таких вещей, а если вынужденно вносит их в язык, то максимально кривым образом из всех возможных). Но как я выше указал, для JVM существуют другие языки, код на которых свободно интегрируется с Java-кодом.
Рынок вакансий для Java шире, чем для C, но эта широта обманчива: более 90% позиций Java-разработчиков - это написание рутинного кода в системах, где неважен технологический результат. А это - и общество коллег-быдлокодеров, и дурные правила игры ("как обойти сонар", "почему ты закрыл всего 19 задачек в Жире, а твой сосед Вася - 22", "как заставить OpenAPI сгенерить то, что мне нужно, если гугл ничего по этой проблеме не выдаёт" и прочие квесты, не имеющие отношения к инженерной деятельности), и с каждым годом ухудшающиеся перспективы когда-либо вылезти из этой колеи и найти нормальную работу. На C искать хорошие вакансии проще, т.к. меньше шлака. Соответственно, и требования к среднему C-разработчику - выше: нужно разбираться в алгоритмах и в том, как устроена машина, и в том как на языке низкого уровня реализовать конструкции высокого уровня, чтобы не утопить разрабатываемый продукт в Тьюринговской трясине.