Java-версии для учебы,какую выбрать? [закрыт]
Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Закрыт 1 год назад .
Изучаю Java на последней 17 версии. Тем не менее требования по джунам у работодателей следующие: знание 8 или 11 версии. Получается,мне надо брать за основу для учебы 8 или 11 версию? Или все-таки лучше использовать возможности новейшей? Как этот вопрос решается в повседневной работе?
Отслеживать
задан 17 мар 2022 в 19:15
15 5 5 бронзовых знаков
для обучения вам подойдет любая версия от 8 включительно. аргументация простая: в версии 8 произошли очень большие изменения, в т.ч. добавили функционалку, без понимания которой в настоящее время очень сложно, т.к. функционального кода написано огромное количество, да и большие фреймворки давно используют «плюшки» 8 версии. все, что выше, по большей части больше похоже на синтаксический сахар, посему разобравшись с версией 8 никаких проблем у вас не будет, остальное приложится само собой
17 мар 2022 в 19:18
То есть,лучше начать с 8 версии?
17 мар 2022 в 19:22
то есть это не имеет значения. подходит любая версия от 8 включительно и выше.
17 мар 2022 в 19:25
изучать надо последнюю версию
17 мар 2022 в 19:29
@Вячеслав имеет начать с 8 версии, потом изучить нововведения в новых версиях (глобально их не так уж много).
18 мар 2022 в 5:45
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
С точки зрения изучения, всегда лучше изучать последнюю версию языка, так как актуальные знания — значительный плюс разработчику.
Касаемо повседневной работы, компании требуют знания более старых версий из-за множества уже существующих крупных решений, переписывать которые дорого, а поддерживать и дорабатывать нужно.
Объективно, когда навыки программиста не совсем нулевые, «деградировать» на пару версий назад труда не составит, поэтому и начинать с них не обязательно.
* Как минимум IDE подскажет, что такая конструкция не доступна в текущей версии и её нужно бы изменить на предлагаемую.
Руководство по возможностям языка Java версий 8-19
Вы можете использовать это руководство для получения практической информации о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (Adoptium, AdoptOpenJdk, OpenJDK, OracleJDK и т. д.), а также получить обзор функций языка Java, включая версии 8–19.
Примечание переводчика: 11 апреля 2021 г. был опубликован перевод Руководство по возможностям Java версий 8-16.
Вашему вниманию предлагается обновленная версия руководства от 28 октября 2022 г.
Практическая информация
Для начала давайте рассмотрим некоторые распространенные практические вопросы, которые возникают у людей при попытке выбрать правильную версию Java для своего проекта.
TL; DR Мне нужна только ссылка для скачивания, и я знаю обо всем остальном. Куда мне следует идти?
Перейдите на сайт Adoptium, выберите последнюю версию Java, загрузите и установите ее. Затем вернитесь к этому руководству, чтобы, возможно, еще кое‑что узнать о версиях Java.
TL;DR (англ. too long; didn’t read — слишком длинно, не читал)
Какая последняя версия Java?
По состоянию на сентябрь 2022 года Java 19 является последней выпущенной версией Java.
В марте 2023 года за ней последует Java 20. Последней версией Java с долгосрочной поддержкой (LTS) является Java 17, выпущенная в сентябре 2021 года.
Какую версию Java следует использовать?
Новые версии Java теперь выходят каждые 6 месяцев. Таким образом, Java 20 запланирована на март 2023 года, Java 21 — на сентябрь 2023 года и так далее. В прошлом циклы выпуска Java были намного длиннее, до 3–5 лет. Данный график демонстрирует, это:
С таким количеством выходящих новых версий имеются следующие основные сценарии использования:
- Унаследованные проекты в компаниях часто застряли на использовании Java 8 (см. раздел «Почему компании все еще застряли на Java 8?» ниже). Следовательно, вы также будете вынуждены использовать Java 8.
- Некоторые устаревшие проекты даже застряли на Java 1.5 (выпущен в 2004 г.) или 1.6 (выпущен в 2006 г.) — извините, друзья, я вам сочувствую!
- Если вы следите за тем, чтобы использовать самые последние IDE, фреймворки и инструменты сборки и начинаете новый проект, вы можете без колебаний использовать Java 17 (LTS) или даже последнюю версию Java 19.
- Есть особая область разработки Android, где версия Java в основном застряла на Java 7 с определенным набором возможностей Java 8. Или вы переходите на использование языка программирования Kotlin.
Почему компании все еще застряли на Java 8?
Существует целый ряд причин, по которым компании все еще придерживаются Java 8. Вот некоторые из них:
- Инструменты сборки (Maven, Gradle и т. д.) и некоторые библиотеки изначально содержали ошибки с версиями Java > 8 и нуждались в обновлениях. Например, некоторые инструменты сборки, такие как Maven, выводили предупреждения о «рефлективном доступе» при сборке Java‑проектов, которые просто «кажутся не готовыми», даже если сборки в порядке.
- Вплоть до Java 8 вы в практически использовали сборки Oracle JDK, и вам не нужно было заботиться о лицензировании. Однако в 2019 году Oracle изменила схему лицензирования, что привело к тому, что Интернет сошел с ума от множества статей, в которых говорилось, что «Java больше не является бесплатной», — и последовала изрядная путаница. Однако на самом деле это не является проблемой, о которой вы узнаете в разделе «Дистрибутивы Java» этого руководства.
- Некоторые компании придерживаются политики использования только LTS‑версий и полагаются на поставщиков своих ОС, которые должны предоставить им эти сборки, что требует времени.
Подводя итог: у вас есть сочетание практических вопросов (обновление ваших инструментов, библиотек, фреймворков) и политических проблем.
Почему некоторые версии Java, например 8, также называются 1.8?
В версиях Java до 9 просто была другая схема именования. Так, Java 8 также может называться 1.8, Java 5 может называться 1.5 и т. д. Когда вы вводили команду java ‑version , с этими версиями вы получали следующий результат:
c:\Program Files\Java\jdk1.8.0_191\bin>java -version java version "1.8.0_191" (1) Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
Это просто означает Java 8. С переходом к основанным на времени выпускам с Java 9 схема именования также изменилась, и версии Java больше не имеют префикса 1.x. Теперь номер версии выглядит следующим образом:
c:\Program Files\Java\jdk11\bin>java -version openjdk version "11" 2018-09-25 (1) OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
В чем разница между версиями Java? Должен ли я изучать какую-то конкретную версию?
Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете задаться вопросом, применимо ли то же самое к Java.
В этом отношении Java является особенной, поскольку она имеет полную обратную совместимость. Это означает, что ваша программа на Java 5 или 8 гарантированно будет работать на виртуальной машине Java 8–19 — за некоторыми исключениями, о которых вам пока не нужно беспокоиться.
Очевидно, что это не работает, наоборот, скажем, ваша программа полагается на функции Java 19, которые просто недоступны в Java 8 JVM.
Это означает несколько вещей:
- Вы не просто «выучите» конкретную версию Java, например 12.
- Скорее, вы получите хорошую основу для всех языковых функций вплоть до Java 8. Это послужит хорошей базой.
- А затем, из такого руководства, как это, вы можете узнать, какие дополнительные возможности появились в Java 9–19, и будете использовать их всегда, когда это возможно.
Каковы примеры этих новых возможностей новых версий Java?
Посмотрите раздел «Возможности Java 8–19» ниже.
Но, как правило: старые, более длинные циклы выпуска (3–5 лет, вплоть до Java 8) означали большое количество новых функций в каждом выпуске.
Шестимесячный цикл выпуска означает гораздо меньшее количество функций на один выпуск, поэтому вы можете быстро освоить языковые возможности Java 9–19.
В чем разница между JRE и JDK?
До сих пор мы говорили только о «Java». Но что именно означает «Java»?
Во‑первых, необходимо различать JRE (Java Runtime Environment) и JDK (Java Development Kit).
Исторически сложилось так, что вы загружали только JRE, если вас интересовал только запуск программ на Java. JRE включает, помимо прочего, виртуальную машину Java (JVM) и инструмент командной строки «java».
Для разработки новых программ на Java необходимо было загрузить JDK. JDK включает в себя все, что есть в JRE, а также компилятор javac и несколько других инструментов, таких как javadoc (генератор документации Java) и jdb (отладчик Java).
Теперь, почему я говорю в прошедшем времени?
Вплоть до Java 8 веб‑сайт Oracle предлагал JRE и JDK в качестве отдельных файлов загрузки, хотя JDK также всегда включал JRE в отдельной папке. В Java 9 это различие практически исчезло, и вы всегда загружаете JDK. Структура каталогов JDK также изменилась, так как в ней больше не было явной папки JRE.
Поэтому, несмотря на то что некоторые дистрибутивы (см. Раздел «Дистрибутивы Java») по‑прежнему предлагают отдельную загрузку JRE, похоже, наметилась тенденция предлагать только JDK. Следовательно, с этого момента мы будем использовать Java и JDK как взаимозаменяемые понятия.
Как установить Java или JDK?
Пока не обращайте внимания на образы Java‑Docker, оболочки.msi или пакеты для конкретной платформы. В конце концов, Java — это просто ZIP‑файл, ни больше, ни меньше.
Поэтому все, что вам нужно сделать, чтобы установить Java на свой компьютер, — это разархивировать файл jdk‑.zip. Для этого даже не нужны права администратора.
Ваш распакованный файл Java будет выглядеть следующим образом:
Directory C:\dev\jdk-11 12.11.2019 19:24 . 12.11.2019 19:24 .. 12.11.2019 19:23 bin 12.11.2019 19:23 conf 12.11.2019 19:24 include 12.11.2019 19:24 jmods 22.08.2018 19:18 legal 12.11.2019 19:24 lib 12.11.2019 19:23 1.238 release
Магия происходит в каталоге /bin, который в Windows выглядит следующим образом:
Directory C:\dev\jdk-11\bin . 12.11.2019 19:23 272.736 java.exe . 12.11.2019 19:23 20.832 javac.exe .
Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.
Если вам интересно, установщики с графическим интерфейсом, такие как Oracle или Adoptium, выполняет для вас распаковку и изменение переменной PATH, вот и все.
Чтобы убедиться, что вы правильно установили Java, вы можете просто выполнить команду java ‑version. Если результат выглядит так, как показано ниже, вы готовы начать разработку.
openjdk version "11" 2018-09-25 OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
Теперь остался один вопрос: откуда вам взять этот ZIP‑файл с Java? Что подводит нас к теме дистрибутивов.
Дистрибутивы Java
Есть множество сайтов, предлагающих скачать Java (читай: JDK), и непонятно, «кто что предлагает и с какой лицензией». Этот раздел прольет на это некоторый свет.
Проект OpenJDK
Что касается исходного кода Java (читайте: исходного кода для вашего JRE / JDK), существует только один, находящийся на сайте проекта OpenJDK.
Однако это всего лишь исходный код, а не распространяемая сборка (представьте: ваш файл.zip со скомпилированной командой java для вашей конкретной операционной системы). Теоретически мы с вами могли бы создать сборку из этого исходного кода, назвать ее, скажем, MarcoJDK и начать ее распространять. Но нашему дистрибутиву не хватило бы сертификации, чтобы легально называть этот дистрибутив совместимым с Java SE.
Вот почему на практике есть несколько поставщиков, которые действительно создают эти сборки, получают их сертификацию (см. TCK) и затем распространяют их.
И хотя поставщики не могут, скажем, удалить метод из класса String до выпуска новой сборки Java, они могут добавить брэндинг (ура!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.
Сборки OpenJDK (от Oracle) и OracleJDK
Одним из производителей, который собирает Java из исходников, является Oracle. Это приводит к появлению двух разных дистрибутивов Java, что поначалу может казаться очень запутанными.
- Сборки OpenJDK от Oracle (!). Эти сборки бесплатны и не брендированы, но Oracle не будет выпускать обновления для более старых версий, скажем, Java 15, как только выйдет Java 16.
- OracleJDK, которая является фирменной, коммерческой сборкой, выпускаемая начиная с изменения лицензии в 2019 году. Это означает, что ее можно использовать бесплатно во время разработки, но вам придется заплатить Oracle при ее использовании в производственной среде. За это вы получаете более длительную поддержку, то есть все обновления дистрибутива и номер телефона, по которому можно позвонить, если с вашей JVM будут проблемы.
Исторически (до появления Java 8) между сборками OpenJDK и OracleJDK существовали фактические различия в исходных текстах, и можно было сказать, что OracleJDK был «лучше». Но на сегодняшний день обе версии практически одинаковы, с небольшими отличиями.
Впрочем все сводится к тому, требуется ли вам платная коммерческая поддержка (номер телефона) для используемой версии Java.
Eclipse Temurin от Adoptium (ранее AdoptOpenJDK)
В 2017 году группа членов Java User Group, разработчиков и поставщиков (Amazon, Microsoft, Pivotal, Redhat и другие) основала сообщество под названием AdoptOpenJDK. С августа 2021 года проект AdoptOpenJDK переехал в новый дом и теперь называется проектом Eclipse Adoptium.
Adoptium предоставляет бесплатные, надежные сборки OpenJDK, называемые Eclipse Temurin с более длительной доступностью/обновлениями для различных операционных систем, архитектур и версий.
Настоятельно рекомендую ее, если вы хотите установить Java.
Azul Zulu, Amazon Corretto, SAPMachine
Полный список сборок OpenJDK можно найти на сайте OpenJDK Wikipedia. Среди них Azul Zulu, Amazon Corretto, а также SapMachine и это лишь некоторые из имеющих. Проще говоря, различия сводятся к тому, что у вас есть различные варианты поддержки/ гарантии обслуживания.
Тем не менее, если вы, например, работаете на AWS, имеет смысл просто использовать их сборки Amazon Corretto OpenJDK, если они предлагают версию, которую вы хотите использовать.
Полный обзор дистрибутива OpenJDK
Рафаэль Винтерхальтер (Rafael Winterhalter) составил отличный список всех доступных сборок OpenJDK, включая их описания: ОС, архитектуру, лицензирование, окна поддержки и обслуживания.
Рекомендация
Повторим с еще раз, что в 2022 и 2023 годах, если у вас нет специфических требований, возьмите файл jdk.zip (.tar.gz/.msi/.pkg) с сайта https://adoptium.net (под названием Eclipse Temurin) или выберите пакет, предоставленный вашим поставщиком ОС/облака.
Возможности Java 8–19
Как уже упоминалось в самом начале этого руководства: практически все (не придирайтесь) функции языка Java 8 работают в Java 19. То же самое относится и ко всем другим версиям Java между ними.
Что в свою очередь означает, что знание всех языковых возможностей Java 8 служит очень хорошей базой в изучении Java, а все остальные версии (Java 9–19) в значительной степени дают дополнительные функции поверх этого базового уровня.
Вот краткий обзор того, что могут предложить конкретные версии:
— Java 8 —
Java 8 была массовым релизом, и вы можете найти список всех функций на веб‑сайте Oracle. Однако здесь я хотел бы упомянуть два основных набора функций:
Возможности языка: лямбды и т.д.
До Java 8 всякий раз, когда вы хотели создать экземпляр, например, нового Runnable, вам приходилось писать анонимный внутренний класс следующим образом:
Runnable runnable = new Runnable() < @Override public void run()< System.out.println("Hello world !"); >>;
С лямбда-выражениями тот же код выглядит так:
Runnable runnable = () -> System.out.println("Hello world two!");
Вы также получили ссылки на методы, повторяющиеся аннотации, методы по умолчанию для интерфейсов и некоторые другие возможности языка.
Коллекции и потоки
В Java 8 вы также получили функциональный стиль операций для коллекций, также известный как Stream API. Быстрый пример:
List list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");
До появления Java 8, вам приходилось писать циклы for, чтобы что‑то сделать с этим списком.
С помощью API Streams вы можете сделать следующее:
list.stream() .filter(name -> name.startsWith("f")) .map(String::toUpperCase) .sorted() .forEach(System.out::println);
Очевидно, что в рамках данного руководства я могу только дать лишь краткий обзор каждого недавно добавленного метода Stream, Lambda или Optional в Java 8.
— Java 9 —
Java 9 также была довольно большой версией, с несколькими дополнениями:
Коллекции
Коллекции получили несколько новых вспомогательных методов для простого создания списков, наборов и карт.
List list = List.of("one", "two", "three"); Set set = Set.of("one", "two", "three"); Map map = Map.of("foo", "one", "bar", "two");
Streams
Потоки получили несколько дополнений в виде методов takeWhile, dropWhile и iterate.
Stream stream = Stream.iterate("", s -> s + "s") .takeWhile(s -> s.length() < 10);
Optionals
Optionals получили метод ifPresentOrElse, которого очень не хватало.
user.ifPresentOrElse(this::displayAccount, this::displayLogin);
Интерфейсы
Интерфейсы получили private методы:
public interface MyInterface < private static void myPrivateMethod()< System.out.println("Yay, I am private!"); >>
Другие возможности языка
И пара других улучшений, таких как улучшенный оператор try‑with‑resources или расширения diamond оператора.
JShell
Наконец, в Java появилась оболочка, в которой вы можете опробовать простые команды и получить немедленные результаты.
% jshell | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> int x = 10 x ==> 10
HTTPClient
В Java 9 появилась начальная предварительная версия нового HttpClient. До этого встроенная поддержка Http в Java была довольно низкоуровневой, и вам приходилось прибегать к использованию сторонних библиотек, таких как Apache HttpClient или OkHttp (кстати, отличные библиотеки!).
В Java 9 у Java появился собственный современный клиент, хотя и в режиме превью, что означает возможность его изменения в более поздних версиях Java.
Project Jigsaw: Модули Java и мультирелизные JAR-файлы
В Java 9 появилась система модулей Jigsaw, которая чем‑то напоминает старую добрую спецификацию OSGI. В задачи данного руководства не входит подробное описание Jigsaw — посмотрите предыдущие ссылки, чтобы узнать больше.
Мультирелизные JAR‑файлы позволили создать один файл.jar, который содержит различные классы для различных версий JVM. Таким образом, ваша программа может вести себя по‑разному / использовать разные классы, например, при запуске на Java 8 и Java 10.
- Java 10 -
В Java 10 было внесено несколько изменений, таких как сборка мусора и т. д. Но единственное реальное изменение, которое вы, как разработчик, скорее всего заметите, — это введение ключевого слова «var», также называемого выводом типа локальной переменной.
Вывод типа локальной переменной: ключевое слово var
// Pre-Java 10 String myName = "Marco"; // With Java 10 var myName = "Marco"
Похоже на Javascript, не так ли? Тем не менее, Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash, за то, что снова указали на это).
- Java 11 -
Java 11 также была несколько меньшей версией с точки зрения разработчика.
Строки и файлы
Строки и файлы получили несколько новых методов (здесь перечислены не все):
"Marco".isBlank(); "Mar\nco".lines(); "Marco ".strip(); Path path = Files.writeString(Files.createTempFile("helloworld", ".txt"), "Hi, my name is!"); String s = Files.readString(path);
Запуск исходных файлов
Начиная с Java 10, вы можете запускать исходные файлы Java без предварительной их компиляции. Это шаг к созданию сценариев.
ubuntu@DESKTOP-168M0IF:~$ java MyScript.java
Вывод типа локальной переменной (var) для лямбда-параметров
Заголовок говорит сам за себя:
(var firstName, var lastName) -> firstName + lastName
HttpClient
HttpClient из Java 9 в его окончательной, не предварительной версии.
Прочее
Flight Recorder (Регистратор полетов), сборщик мусора No‑Op, Nashorn‑Javascript‑Engine объявлен deprecated (устаревшим) и т. д.
- Java 12 -
В Java 12 появилось несколько новых функций и исправлений, но единственные, о которых стоит упомянуть здесь, это поддержка Unicode 11 и предварительный просмотр нового выражения switch, о котором вы узнаете в следующем разделе.
- Java 13 -
Полный список возможностей можно найти здесь, но в основном вы получаете поддержку Unicode 12.1, а также две новые или улучшенные превью функции (могут быть изменены в будущем):
Switch выражение (Preview — предварительная версия)
Switch выражения теперь могут возвращать значение. И вы можете использовать синтаксис в стиле лямбда для своих выражений, без проблем с ошибками:
Старые операторы switch выглядели следующим образом:
switch(status) < case SUBSCRIBER: // code block break; case FREE_TRIAL: // code block break; default: // code block >
В то время как в Java 13 операторы switch могут выглядеть следующим образом:
boolean result = switch (status) < case SUBSCRIBER ->true; case FREE_TRIAL -> false; default -> throw new IllegalArgumentException("something is murky!"); >;
Многострочные строки (предварительная версия)
Наконец‑то, вы можете сделать это на Java:
String htmlBeforeJava13 + " \n" + " Hello, world
\n" + " \n" + "