Интервьюер спросил меня, каковы важные новые функции Java 8~14, я заплакал~~~

Java

Всем привет, меня зовут Гид! Эта статья написана читателями.После двух крупных изменений двухнедельное улучшение наконец-то завершено. Ознакомьтесь с новыми функциями Java 8 здесь:Лучшее руководство по новым функциям Java 8.

Brother Guide: Функции чужих домов использовались уже несколько лет, а у меня вышла только Java, ха-ха! реальность!

Java9

Опубликовано 21 сентября 2017 г. Как новая версия, выпущенная через три с половиной года после Java8, Java 9 принесла много серьезных изменений, наиболее важным из которых является введение системы модулей платформы Java и других, таких как коллекции, потоки Stream.

Система модулей платформы Java

Модульная система платформы Java, также известная как Project Jigsaw, привносит методы модульной разработки на платформу Java. После введения модульной системы JDK был реорганизован в 94 модуля. Приложения Java могут использовать новый инструмент jlink для создания пользовательского образа среды выполнения, содержащего только те модули JDK, от которых они зависят. Это значительно уменьшает размер среды выполнения Java.

Важной особенностью модуля Java 9 является включение файла module-info.class в корневой каталог его артефакта, описывающего модуль. Формат артефакта может быть традиционным файлом JAR или файлом JMOD, который является новым в Java 9.

Jshell

jshell — новая утилита в Java 9. Предоставляет инструменты взаимодействия с командной строкой в ​​реальном времени, аналогичные Python для Java.

В Jshell вы можете напрямую вводить выражения и просматривать результаты их выполнения.

Коллекции, потоки и необязательные

  • выросList.of(),Set.of(),Map.of()иMap.ofEntries()и другие фабричные методы для создания неизменяемых коллекций, таких какList.of("Java", "C++");,Map.of("Java", 1, "C++", 2); (Эта часть контента является отсылкой к Гуаве)
  • StreamДобавлены новые методы вofNullable,dropWhile,takeWhileиiterateметод.CollectorsДобавлены новые методы вfilteringиflatMapping
  • Optionalдобавлен в классifPresentOrElse,orиstreamи т.д. метод

API процесса

Добавлена ​​Java 9ProcessHandleИнтерфейс, который может управлять собственными процессами, особенно подходит для управления длительными процессами.

API и службы ведения журналов платформы

Java 9 позволяет настроить одну и ту же реализацию ведения журнала как для JDK, так и для приложения. недавно добавленныйSystem.LoggerFinderРеализация регистратора, используемая для управления использованием JDK. JVM имеет только один общесистемныйLoggerFinderпример.

Мы можем добавить своиSystem.LoggerFinderРеализовано, чтобы позволить JDK и приложениям использовать другие платформы ведения журналов, такие как SLF4J.

Реактивные потоки (Reactive Streams)

  • в Java9java.util.concurrent.FlowВ класс добавлен основной интерфейс спецификации Reactive Streams.
  • Включено в потокFlow.Publisher,Flow.Subscriber,Flow.SubscriptionиFlow.Processorи т. д. 4 основных интерфейса. Java 9 также предоставляетSubmissionPublisherв видеFlow.Publisherреализация .

дескриптор переменной

  • Дескриптор переменной — это ссылка на переменную или группу переменных, включая статические поля, нестатические поля, элементы массива и компоненты в структурах данных вне кучи и т. д.
  • Значение дескриптора переменной аналогично существующему дескриптору метода.MethodHandle
  • по классу Javajava.lang.invoke.VarHandleдля представления вы можете использовать классjava.lang.invoke.MethodHandles.Lookupстатический фабричный метод вVarHandleобъект

Улучшенный дескриптор метода

  • Дескрипторы методов были введены начиная с Java7 и Java9.java.lang.invoke.MethodHandlesДобавлено больше статических методов для создания различных типов дескрипторов методов.

Другие новые функции

  • Приватные методы интерфейса: Java 9 позволяет приватные методы в интерфейсах.
  • улучшения попытки с ресурсами: эффективно-конечные переменные можно использовать в операторах try-with-resources (что такое эффективно-конечные переменные, см. в этой статье).IL kin UL as.GitHub.IO/programming…)
  • своего родаCompletableFutureНесколько новых методов были добавлены в (completeAsync,orTimeoutЖдать)
  • Улучшения в движке Nashorn: Движок JavaScript, представленный Nashorn из Java8, Java9, внес некоторые улучшения в Nashorn и реализовал некоторые новые функции ES6.
  • Новые возможности потокового ввода/вывода: добавлены новые методы для чтения и копирования данных, содержащихся в InputStream.
  • Улучшить безопасность приложений: Java 9 добавляет 4 новых хеш-алгоритма SHA-3: SHA3-224, SHA3-256, SHA3-384 и SHA3-512.
  • ......

Java10

Выпущенный 20 марта 2018 г., наиболее известной функцией должно быть введение ключевого слова var (определение типа локальной переменной) и другие новые функции, такие как улучшения сборщика мусора, улучшения GC, улучшения производительности и управления потоками.

ключевое слово var

  • вводить: Предоставляет ключевое слово var для объявления локальных переменных:var list = new ArrayList<String>(); // ArrayList<String>
  • ограничение: может использоваться только с конструкторамилокальная переменнаяи в цикле for

Brother Guide: На самом деле Lombok уже давно использует подобное ключевое слово, его использование может упростить код, но может снизить читабельность и удобство сопровождения программы. В общем, я лично не рекомендую его использовать.

Неизменяемые коллекции

list, set, map предоставляют статические методыcopyOf()Возвращает неизменяемую копию набора входных параметров (ниже приведен исходный код JDK)

static <E> List<E> copyOf(Collection<? extends E> coll) {
    return ImmutableCollections.listCopy(coll);
}

java.util.stream.CollectorsДобавлен новый статический метод для сбора элементов в потоке в виде неизменяемой коллекции.

Optional

  • недавно добавленныйorElseThrow()метод для создания исключения, если нет значения

Параллельный полный сборщик мусора G1

Начиная с Java9, G1 имеет сборщик мусора по умолчанию.G1 спроектирован с сборщиком мусора с малой задержкой, чтобы избежать полного GC, но FullGC в Java9 по-прежнему использует один поток для завершения удаления метки.алгоритм, что может привести к срабатыванию периода сборки мусора Полный сборщик мусора, когда память не может быть восстановлена.

Чтобы свести к минимуму влияние пауз приложений, вызванных полным сборщиком мусора, начиная с Java 10, полный сборщик мусора G1 был изменен на параллельный алгоритм маркировки-развертки, и будет использоваться такое же количество параллельных рабочих потоков, как сбор молодого поколения и смешанный сбор. , тем самым сокращая полный сборщик мусора. Сборщик мусора позволяет улучшить производительность и увеличить пропускную способность.

Совместное использование данных класса приложений

Совместное использование данных классов (CDS) было введено в Java 5, что позволяет предварительно обрабатывать набор классов в общем архиве, чтобы можно было выполнять сопоставление памяти во время выполнения, чтобы сократить время запуска программ Java. ) совместно использовать один и тот же архив, это также может уменьшить объем динамической памяти и сократить объем ресурсов, когда несколько виртуальных машин работают на одной физической или виртуальной машине.

Java 10 расширяет существующие функциональные возможности CDS, позволяя размещать классы приложений в общих архивах. Функция CDS расширяет поддержку CDS (Application Class-Data Sharing) класса приложения на основе исходного класса начальной загрузки. Принцип таков: запишите процесс загрузки класса при запуске, запишите его в текстовый файл, и непосредственно прочитайте текст запуска и загрузите его, когда он снова запустится. Представьте, что если не будет серьезных изменений в среде приложения, скорость запуска улучшится.

Другие особенности

  • локальное управление потоком: управление потоком в Java 10 представляет концепцию точки безопасности JVM, которая позволяет реализовать обратные вызовы потока без запуска глобальной точки безопасности JVM, выполняемой самим потоком или потоком JVM, сохраняя при этом поток в заблокированном состоянии, что делает stop Становится возможным только один поток вместо того, чтобы включать или останавливать все потоки.

  • Выделение кучи в альтернативном хранилище: Java 10 позволит JVM использовать кучи, подходящие для различных типов механизмов хранения, выделения памяти в куче на дополнительных устройствах памяти.

  • Единый интерфейс сборки мусора: в Java 10, с точки зрения реализации кода hotspot/gc, представлен чистый интерфейс GC для улучшения изоляции различных исходных кодов GC.Код деталей реализации, совместно используемый несколькими GC, должен существовать во вспомогательных классах. Основная причина унификации интерфейса сборки мусора — сделать код сборщика мусора (GC) более аккуратным, что удобно новичкам для начала разработки и облегчения последующего исследования сопутствующих проблем.

Java11

Java11 был официально выпущен 25 сентября 2018 года, и это очень важная версия! Самая большая разница между Java 11 и Java 9, выпущенными в сентябре 2017 года, и Java 10, выпущенной в марте 2018 года, заключается в следующем:Oracle заявила, что обеспечит надежную поддержку Java 11 до сентября 2026 года. Это первый долгосрочный выпуск, поддерживаемый после Java 8.

Струнная арматура

Java 11 добавляет ряд методов обработки строк, как показано ниже.

Brother Guide: Проще говоря, это означает, что существует несколько уровней инкапсуляции.Люди в команде разработчиков JDK не упустили из виду распространенные инструментальные среды на рынке!

//判断字符串是否为空
" ".isBlank();//true
//去除字符串首尾空格
" Java ".strip();// "Java" 
//去除字符串首部空格
" Java ".stripLeading();   // "Java "  
//去除字符串尾部空格
" Java ".stripTrailing();  // " Java"  
//重复字符串多少次
"Java".repeat(3);             // "JavaJavaJava"  

//返回由行终止符分隔的字符串集合。
"A\nB\nC".lines().count();    // 3 
"A\nB\nC".lines().collect(Collectors.toList()); 

ZGC: масштабируемый сборщик мусора с низкой задержкой

ZGC расшифровывается как сборщик мусора Z., является масштабируемым сборщиком мусора с малой задержкой.

ZGC в основном предназначен для достижения следующих целей:

  • Время паузы GC не превышает 10 мс
  • Может обрабатывать небольшие кучи размером в сотни МБ или большие кучи размером в несколько терабайт.
  • Пропускная способность приложений не упадет более чем на 15% (по сравнению с алгоритмом рециркуляции G1).
  • На этой основе удобно вводить новые возможности GC и использовать colord
  • Оптимизация иглы и барьеров нагрузки закладывает основу
  • В настоящее время поддерживает только Linux/x64-битные платформы.

ZGC в настоящее времяв экспериментальной стадии, поддерживает только платформу Linux/x64

Обновление стандартного HTTP-клиента

Java 11 стандартизировала Http Client API, который был представлен в Java 9 и обновлен в Java 10, в то время как инкубация в первых двух версиях Http Client была почти полностью переписана и теперь полностью поддерживает асинхронную неблокировку.

А в Java11 имя пакета Http Client определяется какjdk.incubator.httpизменить наjava.net.http, API проходитCompleteableFutureОбеспечивает неблокирующую семантику запросов и ответов.

Он также очень прост в использовании, а именно:

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); 


Упрощенный способ запуска одного файла исходного кода

  • Средство запуска Java было улучшено для запуска исходного кода Java из одного файла. Эта функция позволяет напрямую выполнять исходный код Java с помощью интерпретатора Java. Исходный код компилируется в памяти, а затем выполняется интерпретатором. Единственным ограничением является то, что все связанные классы должны быть определены в одном и том же файле Java.
  • Особенно полезно для начинающих Java и тех, кто хочет попробовать простые программы, и может использоваться с jshell.
  • В определенной степени это может улучшить возможности использования Java для написания скриптовых программ.

Синтаксис локальной переменной для параметров Lambda

  • Ключевая функция вывода типа локальной переменной была представлена ​​начиная с Java 10. Вывод типа позволяет использовать ключевое слово var в качестве типа локальной переменной вместо фактического типа, компилятор выводит тип на основе значения, присвоенного переменной.
  • В Java 10 есть несколько ограничений на ключевое слово var.
    • можно использовать только с локальными переменными
    • Должен быть инициализирован при объявлении
    • нельзя использовать в качестве параметра метода
    • Нельзя использовать в лямбда-выражениях
  • Java11 начал позволять разработчикам использовать var в лямбда-выражениях для объявления параметров.

Другие особенности

  • Новый сборщик мусора Epsilon, полностью пассивная реализация GC, которая выделяет ограниченные ресурсы памяти для минимизации занимаемой памяти и задержки пропускной способности памяти.
  • Профилирование кучи с низкими накладными расходами: Java 11 предоставляет метод выборки распределения кучи с низкими накладными расходами Java, который может получать информацию о выделенных в куче объектах Java и может получать доступ к информации о куче через JVMTI.
  • Протокол TLS1.3: Java 11 включает реализацию спецификации Transport Layer Security (TLS) 1.3 (RFC 8446), заменяя TLS, включенный в предыдущие версии, включая TLS 1.2, а также улучшая другие функции TLS, такие как расширения сшивания OCSP (RFC 6066). , RFC 6961), а также хэширование сеанса и расширенные расширения главного ключа (RFC 7627) также внесли множество улучшений в безопасность и производительность.
  • Flight Recorder: Flight Recorder ранее был инструментом анализа в коммерческом JDK, но в Java 11 его код был включен в общедоступную кодовую базу, что сделало эту функцию доступной для всех.

Java12

Усовершенствованный переключатель

  • Традиционный синтаксис переключателя имеет проблему легкого пропуска разрыва, и с точки зрения чистоты кода множественные разрывы по существу повторяются.

  • Java12 предоставляет выражение swtich, которое использует лямбда-подобный синтаксис для выполнения блока после успешного совпадения условия без необходимости писать больше break

  • Добавлена ​​в качестве функции предварительного просмотра, она должна бытьjavacскомпилировать иjavaДобавить параметры во время выполнения--enable-preview

    switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
        case TUESDAY                -> System.out.println(7);
        case THURSDAY, SATURDAY     -> System.out.println(8);
        case WEDNESDAY              -> System.out.println(9);
    }

Инструменты форматирования чисел

  • NumberFormatДобавлена ​​поддержка форматирования комплексных чисел.

    NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
    String result = fmt.format(1000);
     System.out.println(result); // 输出为 1K,计算工资是多少K更方便了。。。

Shenandoah GC

  • Реализация Pauseless GC под руководством Redhat, основная цель — чтобы 99,9% пауз были меньше 10 мс, и пауза не зависела от размера кучи и т. д.
  • По сравнению с ZGC Java11 с открытым исходным кодом (который для использования необходимо обновить до JDK11), Shenandoah GC имеет стабильную версию JDK8u, что более целесообразно сегодня, когда Java8 занимает большую долю рынка.

Повышение коллектора G1

  • Java 12 содержит два обновления сборщика мусора по умолчанию G1:
    • Прерваемые наборы смешанных сборок: Реализация JEP 344, для достижения заданных пользователем целей времени паузы, JEP 344 позволяет сборщику мусора G1 прервать процесс сборки мусора. G1 может прервать сбор необязательных частей, чтобы выполнить целевое время паузы.
    • Своевременный возврат неиспользуемой выделенной памяти: реализация JEP346, улучшенный G1 GC для автоматического возврата памяти кучи Java в операционную систему при простое

Java13

Введите ключевое слово yield для Switch

  • SwitchВ выражении для выпрыгивания есть еще одно ключевое слово.Switchключевое слово блокаyield, в основном используется для возврата значения

  • yieldиreturnРазница в следующем:returnбудет напрямую выпрыгивать из текущего цикла или метода, иyieldпросто выпрыгнуть из теченияSwitchблокировать при использованииyield, должен иметьdefaultсостояние

     private static String descLanguage(String name) {
            return switch (name) {
                case "Java": yield "object-oriented, platform independent and secured";
                case "Ruby": yield "a programmer's best friend";
                default: yield name +" is a good language";
            };
     }

текстовый блок

  • Решите проблему, заключающуюся в том, что когда Java определяет многострочные строки, они могут поддерживаться только переходами на новую строку или коннекторами на новую строку, и введитетройные двойные кавычкидля определения многострочного текста

  • два"""Все, что находится между ними, интерпретируется как часть строки, включая символы новой строки.

    String json ="{\n" +
                  "   \"name\":\"mkyong\",\n" +
                  "   \"age\":38\n" +
                  "}\n";   // 未支持文本块之前

     String json = """
                    {
                        "name":"mkyong",
                        "age":38
                    }
                    """;

Расширенный ZGC для освобождения неиспользуемой памяти

  • ZGC, который был введен экспериментально в Java 11, имеет проблему, связанную с невозможностью активного освобождения неиспользуемой памяти для операционной системы при фактическом использовании.
  • Куча ZGC состоит из набора областей кучи, называемых ZPages. Когда области ZPages очищаются во время цикла GC, они освобождаются и возвращаются в кеш страницы.ZPageCache, Z-страницы в этом кэше расположены в порядке последних использованных (LRU) и организованы по размеру
  • В Java 13 ZGC будет возвращать в операционную систему страницы, помеченные как неиспользуемые в течение длительного времени, чтобы они были доступны для повторного использования другими процессами.

Рефакторинг SocketAPI

  • Java 13 привносит новый низкоуровневый метод реализации в Socket API, а в Java 13 новая реализация Socket используется по умолчанию, что упрощает поиск и устранение проблем и повышает удобство сопровождения.

Динамический класс приложений — совместное использование данных

  • Совместное использование данных класса приложений, представленное в Java 10, было дополнительно упрощено, улучшено и расширено в Java 13, а именно:Позволяет динамическое архивирование классов в конце выполнения приложения Java., конкретные классы, которые могут быть заархивированы, включают: все загруженные классы приложений, которые не принадлежат к базовой CDS по умолчанию, и классы в библиотеке классов, на которую ссылаются

Java14

ключевое слово записи

  • Упростите способ определения классов данных, используйте запись вместо классов, определенных классом, нужно только объявить атрибуты, вы можете получить методы доступа к атрибутам, а также методы toString, hashCode, equals

  • Подобно использованию Class для определения класса при использовании плагина lomobok и помечен@Getter,@ToString,@EqualsAndHashCodeаннотация

  • Представлено в качестве функции предварительного просмотра

    /**
     * 这个类具有两个特征
     * 1. 所有成员属性都是final
     * 2. 全部方法由构造方法,和两个成员属性访问器组成(共三个)
     * 那么这种类就很适合使用record来声明
     */
    final class Rectangle implements Shape {
        final double length;
        final double width;

        public Rectangle(double length, double width) {
            this.length = length;
            this.width = width;
        }

        double length() { return length; }
        double width() { return width; }
    }
    /**
     * 1. 使用record声明的类会自动拥有上面类中的三个方法
     * 2. 在这基础上还附赠了equals(),hashCode()方法以及toString()方法
     * 3. toString方法中包括所有成员属性的字符串表示形式及其名称
     */
    record Rectangle(float length, float width) { }

Запрос точности исключения нулевого указателя

  • Добавить через аргументы JVM-XX:+ShowCodeDetailsInExceptionMessages, вы можете получить более подробную информацию о вызове в исключении нулевого указателя, а также быстрее найти и решить проблему.

    a.b.c.i = 99; // 假设这段代码会发生空指针
    Exception in thread "main" java.lang.NullPointerException:
            Cannot read field 'c' because 'a.b' is null.
        at Prog.main(Prog.java:5) // 增加参数后提示的异常中很明确的告知了哪里为空导致

Улучшение переключателя наконец-то вернулось к норме

  • Переключатель (функция предварительного просмотра), введенный в JDK12, стал официальной версией в JDK14. Для его включения не требуется добавлять параметры, и его можно использовать непосредственно в JDK14.
  • в основном используют->на замену предыдущему:+break; Кроме того, yield предоставляется для возврата значения в блоке

Before Java 14

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

Java 14 enhancements

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

экземпляр расширения

  • instanceof в основном используется вКонкретный тип обнаруженного объекта до приведения типа, а затем выполнить конкретное приведение

  • Новая версия instanceof может завершить преобразование, определяя принадлежность к определенному типу.

Object obj = "我是字符串";
if(obj instanceof String str){
 System.out.println(str);
}

Другие особенности

  • ZGC, представленный в Java11, представляет собой алгоритм GC следующего поколения после G1.Он поддерживает MacOS и Window от поддержки платформы Linux до Java14 (личное ощущение, что я наконец-то могу ощутить эффект ZGC в повседневных инструментах разработки, хотя на самом деле G1 хватит пользы)
  • Удален сборщик мусора CMS (успешно)
  • Добавлен инструмент jpackage.Помимо стандартизации приложения в пакет jar, он также поддерживает пакеты функций для разных платформ, например под linux.debиrpm, под подоконникомmsiиexe

Суммировать

О свойствах предварительного просмотра

  • Сначала вставьте абзац оригинального официального сайта оракула:This is a preview feature, which is a feature whose design, specification, and implementation are complete, but is not permanent, which means that the feature may exist in a different form or not at all in future JDK releases. To compile and run code that contains preview features, you must specify additional command-line options.
  • Это предварительная функция, дизайн, спецификация и реализация которой завершены, но не являются постоянными, а это означает, что эта функция может существовать в других формах или вообще не существовать в будущих выпусках JDK. Для компиляции и запуска кода, включающего функции предварительного просмотра, необходимо указать дополнительные параметры командной строки.
  • просто возьмиswitchНапример, он был запущен в Java 12 и будет продолжать улучшаться в Java 13. Он не будет официально преобразован в JDK до Java 14. Вы можете уверенно использовать его, не принимая во внимание изменения или модификации последующих версий JDK.
  • С одной стороны, видно, что JDK, как стандартная платформа, скрупулезно добавляет новые функции, с другой стороны, я лично считаю, что функции предварительного просмотра следует использовать с осторожностью. Дизайн и реализация этой функции просты, но ее реальную ценность все еще необходимо проверять при использовании.

Оптимизация виртуальной машины JVM

  • Каждый выпуск Java сопровождается оптимизацией виртуальной машины JVM, в том числе улучшением существующих алгоритмов сборки мусора, введением новых алгоритмов сборки мусора, удалением старых алгоритмов сборки мусора, которые сегодня уже не применимы, и т. д.
  • Направление общей оптимизацииЭффективная сборка мусора с малой задержкой
  • Разработчиков ежедневных приложений могут больше беспокоить новые синтаксические функции, но с точки зрения компании более важно решить, стоит ли обновлять платформу Java.Улучшения времени выполнения JVM

Справочная информация

В этой статье используетсяmdniceнабор текста