Буквально некоторое время назад Oracle официально объявила, что Java 11 (18.9 LTS) официально выпущена и может использоваться в производственных средах!Это, несомненно, отличная новость для нас. Как разработчик Java, хотя я должен снова изучить и понять java11, я все равно доволен. Я думаю, по крайней мере, у вас такое же настроение, как у меня: Ява в руках, у меня есть мир!
Сегодня давайте посмотрим, что такое Java 11, что в ней особенного и стоит ли переходить на Java 11.
Что такого особенного в Java 11
На официальном сайте Oracle перейдите на страницу загрузки, первая версия JDK, доступная для загрузки, была заменена на Java SE 11 (LTS), где LTS означает Long-Term-Support.
По сравнению с Java 9, выпущенной в сентябре 2017 года, и Java 10, выпущенной в марте 2018 года, самая большая разница между Java 11, выпущенной на этот раз, заключается в том, что с точки зрения долгосрочной поддержки (Long-Term-Support) Oracle заявила, что будет поддерживать Java. 11 обеспечивает сильную поддержку до сентября 2026 года. Это первый долгосрочный выпуск, поддерживаемый после Java 8.
Почему говорят, что это долгосрочная версия, смотрите официально выпущенную дорожную карту поддержки ниже.
На картинке выше показан план поддержки для каждой версии JDK, опубликованной Oracle. По пути указано официальное время релиза и план поддержки Java 6 - Java 12.
Видно, что Java 9 и Java 10 не обеспечивают долгосрочную поддержку до Java 11, а последней версией, предоставляющей долгосрочную поддержку, является Java 8, которая будет поддерживаться до марта 2025 года.
Долгосрочная поддержка означает, что Oracle предоставит долгосрочные исправления, безопасность и другую расширенную поддержку.
Следующим выпуском с долгосрочной поддержкой станет Java 17, который выйдет в 2021 году.
Большинство из них сейчас используют Java 8, а Java 9 и 10 в настоящее время используются редко, по крайней мере, я не нашел ни одной компании, использующей их в производственной среде, то есть ухаживающей за смертью.
Сейчас, когда Java 11 поддерживается уже давно, в нее уже включены все возможности 9 и 10, а 9 и 10 естественно придет к концу. .
Итак, давайте посмотрим, какие важные новые функции появились в Java 9–11?
новые возможности
1. Вывод типа локальной переменной
Что такое вывод типа локальной переменной?
var javastack = "javastack";
System.out.println(javastack);
Как вы можете видеть, вывод типа локальной переменной означает, что тип слева определяется непосредственно с помощью var вместо записи конкретного типа.Компилятор может автоматически вывести тип на основе выражения справа, такого как String выше.
var javastack = "javastack";
эквивалентно:
String javastack = "javastack";
2. Улучшение строки
Java 11 добавляет ряд методов обработки строк, как показано ниже.
// 判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
// 复制字符串
"Java".repeat(3); // "JavaJavaJava"
// 行数统计
"A\nB\nC".lines().count(); // 3
3. Установить усиление
Начиная с Java 9, Jdk добавил методы of и copyOf к коллекциям (List/Set/Map). Оба они используются для создания неизменяемых коллекций. Давайте посмотрим на их использование и различия.
Пример 1:
var list = List.of("Java", "Python", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
Пример 2:
var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy); // false
Код примера 1 и 2 похожи, почему один истинный, а другой ложный?
Взгляните на их исходный код:
static <E> List<E> of(E... elements) {
switch (elements.length) { // implicit null check of elements
case 0:
return ImmutableCollections.emptyList();
case 1:
return new ImmutableCollections.List12<>(elements[0]);
case 2:
return new ImmutableCollections.List12<>(elements[0], elements[1]);
default:
return new ImmutableCollections.ListN<>(elements);
}
}
static <E> List<E> copyOf(Collection<? extends E> coll) {
return ImmutableCollections.listCopy(coll);
}
static <E> List<E> listCopy(Collection<? extends E> coll) {
if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
return (List<E>)coll;
} else {
return (List<E>)List.of(coll.toArray());
}
}
Видно, что метод copyOf сначала определит, относится ли исходная коллекция к типу AbstractImmutableList. Если да, то он вернется напрямую, если нет, то вызовет для создания новой коллекции.
Пример 2. Поскольку коллекция, созданная с помощью new, не является подклассом неизменяемого класса AbstractImmutableList, метод copyOf создает новый экземпляр, поэтому он имеет значение false.
Примечание. Коллекции, созданные с помощью of и copyOf, являются неизменяемыми коллекциями и не могут быть добавлены, удалены, заменены, отсортированы и т. д., в противном случае будет сообщено об исключении java.lang.UnsupportedOperationException.
Вышеприведенное демонстрирует методы of и copyOf для List, интерфейсы Set и Map.
4. Улучшение потока
Stream — это новая функция в Java 8, а в Java 9 к Stream добавлены следующие 4 новых метода.
- Добавьте конструктор с одним параметром, который может быть нулевым.
Stream.ofNullable(null).count(); // 0
- Добавьте методы takeWhile и dropWhile.
Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]
Считаем с начала и до конца, когда n
Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1]
Это противоположно предыдущему и начинает расчет, как только n
3) повторять перегрузку
Эта новая перегрузка метода iterate позволяет указать предикат, чтобы указать, когда закончить итерацию.
Если вы не знакомы с Stream в JDK 8, вы можете просмотреть эту серию руководств, опубликованных ранее.
5. Дополнительное улучшение
Opthonal также добавляет несколько действительно крутых методов, теперь легко преобразовать необязательный в поток или дать ему альтернативу, когда присутствует пустой необязательный.
Optional.of("javastack").orElseThrow(); // javastack
Optional.of("javastack").stream().count(); // 1
Optional.ofNullable(null)
.or(() -> Optional.of("javastack"))
.get(); // javastack
6. Улучшение InputStream
Наконец, у InputStream есть очень полезный метод: transferTo, который можно использовать для передачи данных непосредственно в OutputStream, что очень часто используется при работе с необработанными потоками данных, как показано в следующем примере.
var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("javastack.txt");
var javastack = File.createTempFile("javastack2", "txt");
try (var outputStream = new FileOutputStream(javastack)) {
inputStream.transferTo(outputStream);
}
7. HTTP-клиентский API
Это инкубационный клиентский API HTTP, который был представлен для обработки HTTP-запросов в Java 9. API поддерживает синхронный и асинхронный режим и официально доступен в Java 11. Вы можете найти его вjava.netНайдите этот API в пакете.
Давайте посмотрим на использование HTTP-клиента:
var request = HttpRequest.newBuilder()
.uri(URI.create("https://javastack.cn"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
Вышеупомянутый .GET() можно опустить, метод запроса по умолчанию — Get!
Дополнительные примеры использования вы можете увидеть в этом API, и у вас будет возможность продемонстрировать его позже.
Теперь, когда Java поставляется с HTTP Client API, нужно ли нам в будущем использовать инструментарий Apache HttpClient?
8. Упростите сложность, скомпилируйте и запустите исходный код одной командой
См. код ниже.
// 编译
javac Javastack.java
// 运行
java Javastack
По нашему мнению, чтобы запустить исходный код Java, вы должны сначала скомпилировать, а затем запустить двухэтапное выполнение. В будущей версии Java 11 это можно будет сделать напрямую через java-команду, как показано ниже.
java Javastack.java
Больше новых функций
Недавно выпущенная Java 11 предоставляет 17 JEP (предложение по улучшению JDK) с точки зрения новых функций.
На приведенном выше рисунке показаны все новые функции, включенные в Java 11, анонсированные Oracle, среди которых несколько ключевых новых функций:
ZGC: масштабируемый сборщик мусора с низкой задержкой
ZGC — это сборщик мусора, который утверждает, что гарантирует, что время паузы каждого GC не превышает 10 мс, а по сравнению с текущей сборкой мусора по умолчанию G1 пропускная способность падает не более чем на 15%.
Epsilon: сборщик мусора, который ничего не делает
В Java 11 также добавлен довольно специальный сборщик мусора — Epsilon, который называется сборщиком «без операций» и будет обрабатывать выделение памяти без реализации какого-либо фактического механизма освобождения памяти. Другими словами, это сборщик мусора, который не занимается сборкой мусора. Этот сборщик мусора не кажется полезным, он в основном используется для тестирования производительности, проверки нагрузки на память и т. д. Epsilon GC может использоваться в качестве контрольной группы для измерения производительности других сборщиков мусора. Великий бог Мартейн сказал, что Epsilon GC может хотя бы помочь понять интерфейс GC и помочь создать более модульную JVM.
Расширенное использование var
В Java 10 была добавлена функция вывода типа локальной переменной, и var можно использовать для определения локальных переменных. Хотя многие люди критиковали эту функцию, она не влияет на постоянное улучшение ее использования в Java.В Java 11 var можно использовать как объявление локальной переменной в лямбда-выражениях.
Удалите модули Java EE и CORBA.
Еще при выпуске Java SE 9 компания Java заявила, что удалит модули Java EE и CORBA в будущих выпусках, и этот шаг, наконец, реализован в Java 11. Наконец-то избавился от модулей Java EE и CORBA.
Дальнейшее обновление HTTP-клиента
API клиента HTTP был стандартизирован в JDK 9, а затем обновлен в JDK 10 до JEP 110. В этом списке обновлений Java 11 он дополнительно обновлен JEP 321. API обеспечивает неблокирующую семантику запроса и ответа через CompleteableFutures, которую можно использовать вместе для запуска соответствующих действий. JDK 11 полностью переписал эту функцию. Теперь стало проще отслеживать поток данных между публикаторами запросов и ответов пользовательского пространства и базовым сокетом, что снижает сложность и максимизирует возможность повторного использования между HTTP/1 и HTTP/2.
Обновлять или нет
В августе 2017 года исполнительный комитет JCP предложил изменить частоту выпуска релизов Java на каждые шесть месяцев.
- В сентябре 2017 года была выпущена Java 9.
- В марте 2018 года была выпущена Java 10.
- В сентябре 2018 года была выпущена Java 11.
Большинство людей используют версию JDK по-прежнему Java 8 и ниже, и даже некоторые компании используют JDK 1.6 в своих производственных средах.
Итак, стоит ли компаниям и разработчикам обновлять и изучать Java 11 в производственной среде и среде разработки?
Для бизнеса
Для предприятий по-прежнему необходимо обновить версию JDK в производственной среде до Java 11. Есть две основные причины:
1. Oracle обеспечит долгосрочную поддержку Java 11, и предприятия могут уверенно использовать эту версию. А следующая версия с долгосрочной поддержкой будет выпущена через три года, а это уже давно.
2. Java 11 предоставляет некоторые хорошие функции, особенно ZGC, который является эпохальным сборщиком мусора. Преимущества здесь не повторяются. С помощью ZGC можно преодолеть узкое место производительности JVM.
для разработчиков
С точки зрения кодирования Java 11 не изменилась так сильно, как Java 8. В конце концов, Java 8 предоставляет возможности функционального программирования, что является важной причиной для многих разработчиков изучать Java 8.
Тем не менее, Java 11 не совсем без улучшений, по крайней мере, в новой версии разработчики Java могут наконец избавиться от старого HttpURLConnection. Новый HTTP API обеспечивает поддержку ведущих отраслевых стандартов, таких как HTTOP/2, и обеспечивает оптимизированный и удобный интерфейс API.
Поэтому, чтобы подвести итог, будь то для предприятий или разработчиков, необходимо обновить Java 11, по крайней мере, гораздо более необходимо, чем Java 9 и Java 10. Насчет того, насколько это необходимо, автор дает простое объяснение:
- Если ваша текущая версия JDK/Java ниже, чем Java 8, сначала выполните обновление до Java 8.
- Если ваша текущая версия JDK/Java выше, чем Java 7, рассмотрите возможность обновления до Java 11. Конечно, вы можете сразу перейти с Java 6 на Java 11.
Наконец
Многие люди все еще используют Java 8 или 7, но в начале 2019 года бесплатные обновления для 8 прекратятся. Теперь, когда выпуск 11 является выпуском с долгосрочной поддержкой, самое время изучить и начать работу с 11. Надеюсь, эта статья вдохновит вас.
читать далее
Есть такая операция?Разбор зачем смотреть исходники
Я изменил строку кода в последнем релизе!
Преимущества, недостатки и сценарии применения NoSQL, такие как MongoDB, Hbase и Redis.
31 вопрос для Android-интервью, которые укрепят ваш фундамент!
Верь в себя, нет ничего невозможного, только неожиданное
Здесь вы найдете не только технологии!