Новые возможности JDK16

Java задняя часть Spring
Новые возможности JDK16

"Это 10-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

Введение

16 марта 2021 года JDK представила новую версию JDK16.Хотя JDK16 не является LTS-версией, в качестве предшествующей версии следующей LTS-версии JDK17 JDK16 принесла нам 17 улучшений, в том числе новые языковые функции, новые инструменты, улучшенные управление памятью и т.д.

Итак, давайте посмотрим, какие новые возможности предоставляет нам JDK16.

Новые возможности JDK16

В целом JDK16 имеет следующие новые функции:

  • Некоторые новые функции, представленные в JDK14, были окончательно определены в JDK16.
  • Улучшенное управление памятью
  • новый инструмент для упаковки
  • UNIX-Domain Socket channels
  • Предупреждения для классов на основе значений
  • Encapsulating JDK Internals by default
  • Предоставляет возможности языка C++14.
  • Некоторые другие новые функции предварительной версии

На следующем рисунке показано количество новых функций JDK от 8 до 16:

Видно, что больше всего JDK8 и JDK9, а потом изменений в принципе меньше.

JDK8 представил ряд очень полезных функций, таких как потоки, лямбда-выражения и дженерики. В JDK9 представлена ​​новая модульная система JPMS, так что изменений много.

Условно говоря, изменения после JDK10 в основном относительно небольшие, и это также может быть связано с регулярным выпуском версии каждые 6 месяцев. Ведь времени относительно мало, поэтому и изменений в версии относительно мало.

Обратите внимание, что JDK16 не является LTS-версией, а JDK17, выпущенная в сентябре! , вы можете обратить внимание на мои последующие статьи о новых возможностях JDK17. На данный момент LTS-версия JAVA имеет JDK8, JDK11 и JDK17. Какой вы используете сейчас?

улучшение языка

В JDK16 есть два основных улучшения языка: сопоставление с образцом и записи. Обе эти новые функции были представлены в качестве предварительных версий в JDK14 и в конечном итоге стали окончательными в JDK16.

Давайте сначала посмотрим на сопоставление с образцом. Сопоставление с образцом в основном относится к ключевому слову instanceof. Мы знаем, что в JAVA для определения того, является ли объект экземпляром определенного класса, мы можем использовать instanceof. Если это экземпляр или подкласс класса, вернуть true, иначе false.

Но после суждения, если вы хотите использовать соответствующий объект, вам нужно отобразить преобразование типа следующим образом:

//传统写法
        if(site instanceof String){
            String stringSite = (String)site;
            System.out.println(stringSite.length());
        }

В сопоставлении с образцом в JDK16 вы можете написать:

 //JDK16写法
        if(site instanceof String stringSite){
            System.out.println(stringSite.length());
        }

Еще одна финальная версия — Records, представленная в JDK14 и 15. Records — это специальный класс Java, который в основном используется для представления структуры неизменяемых объектов.

Давайте посмотрим на определение Records:

public record Address(
        String addressName,
        String city
) {
}

Выше мы определили объект Address, который имеет два свойства, addressName и city.Если вы декомпилируете результат компиляции приведенного выше кода, вы можете получить:

public record Address(String addressName, String city) {
    public Address(String addressName, String city) {
        this.addressName = addressName;
        this.city = city;
    }

    public String addressName() {
        return this.addressName;
    }

    public String city() {
        return this.city;
    }
}

По сути, это эквивалентно традиционному:

public class AddressOld {
    
    private final String addressName;
    private final String city;

    public AddressOld(String addressName, String city) {
        this.addressName = addressName;
        this.city = city;
    }

    public String getAddressName() {
        return addressName;
    }

    public String getCity() {
        return city;
    }
}

Но писать гораздо удобнее и проще.

Улучшения в управлении памятью

Глядя на улучшения в управлении памятью, можно выделить два основных аспекта: Elastic Metaspace и параллельную обработку стека потоков ZGC.

Основная функция Metaspace — управлять памятью метаданных класса. Elastic Metaspace был введен для улучшения выделения и освобождения памяти метапространства в HotSpot JVM. Ненужная память может быть возвращена в операционную систему быстрее, что снижает накладные расходы и фрагментацию памяти.

Elastic Metaspace выделяет память, используя блоки меньшего размера, и повышает эластичность, возвращая операционной системе неиспользуемую память метапространства. Это повышает производительность и снижает затраты на техническое обслуживание.

Так что же представляет собой обработка стека параллельных потоков в ZGC?

Мы знаем, что ZGC — это алгоритм сборки мусора с малой задержкой в ​​HotSpot JVM. Но в процессе стековой обработки потоков всегда есть ограничение — точки безопасности. В точках сохранения поток java должен быть приостановлен, что ограничивает эффективность GC.

А обработка стека параллельных потоков ZGC может гарантировать, что потоки Java могут выполняться одновременно, пока присутствуют точки безопасности GC.

Unix-Domain Socket Channel

Вообще говоря, связь через сокеты основана на TCP/IP, но друзья, знакомые с Unix, должны знать, что в Unix все существует в виде файлов, даже при обмене внутренними процессами.

Если процессы на одном хосте обмениваются данными, использование межпроцессного взаимодействия (IPC) самого Unix, несомненно, является самым быстрым и более безопасным способом.

Поэтому в JDK16 была добавлена ​​поддержка Unix-Domain Socket Channel.

Warning For Value-based Classes

Что это значит? Мы знаем, что соответствующий первичный тип в java имеет тип Object, например, int соответствует Integer.

Если мы используем конструктор Integer, мы можем построить его следующим образом:

 Integer integer= new Integer(100);

Но в JDK16 такой конструктор устарел:

    @Deprecated(since="9", forRemoval = true)
    public Integer(int value) {
        this.value = value;
    }

Мы можем просто написать это так:

Integer integer2= 100;

Инкапсулирует внутренний пакет JDK

Вообще говоря, пакеты, которые мы используем, представляют собой API-интерфейсы, предоставляемые JDK, но иногда мы по-прежнему используем некоторые классы, которые используются внутри JDK. Такие классы не рекомендуется использовать извне. JDK16 инкапсулирует большинство этих классов. Вы можете напрямую найти и использовать его в стандартном JDK позже.

Возможности языка C++14

Это связано с тем, что базовый исходный код C++ JDK использует языковую функцию C++14, и средний пользователь JDK не может ее непосредственно ощутить.

Языковые функции предварительного просмотра

В JDK16 были анонсированы несколько новых языковых функций, здесь мы в основном говорим о Vector API и Sealed Classes.

Идея Vector API состоит в том, чтобы предоставить метод векторных вычислений, который в конечном итоге работает лучше, чем традиционные методы скалярных вычислений (при поддержке архитектур ЦП). Что такое векторные вычисления? Друзья, знакомые с пандами, возможно знают, что в пандах удобно считать матрицу, если это реализовано на java, то нужно вычислять каждый элемент в матрице, что очень хлопотно, поэтому библиотека pandas для python популярный.

Теперь это умеет и JDK16, давайте посмотрим, первый — это традиционный способ записи:

//传统写法
        int[] x = {1, 2, 3, 4};
        int[] y = {4, 3, 2, 1};

        int[] c = new int[x.length];

        for (int i = 0; i < x.length; i++) {
            c[i] =x[i] * y[i];
        }

Обход по элементам может быть выполнен только в том случае, если мы хотим, чтобы числа двух массивов были перемножены. Текущий способ написания:

        var vectorA = IntVector.fromArray(IntVector.SPECIES_128, x, 0);
        var vectorB = IntVector.fromArray(IntVector.SPECIES_128, y, 0);
        var vectorC = vectorA.mul(vectorB);
        vectorC.intoArray(c, 0);

Мы создаем две переменные Vector и напрямую вызываем метод mul класса Vector.

В fromArray три параметра: первый — длина вектора, второй — исходный массив, а третий — смещение. Поскольку int имеет 4 байта, здесь мы используем SPECIES_128.

Sealed Classes — это концепция, представленная в JDK15, которая указывает, какие классы классу разрешено наследовать от него:

public sealed class SealExample permits Seal1, Seal2{
}

public non-sealed class Seal1 extends SealExample {
}

public final class Seal2 extends SealExample {
}

final означает, что Seal2 больше не может быть унаследован. незапечатанный означает, что любому классу может быть позволено наследовать.

Суммировать

Выше перечислены новые функции, которые нам принес JDK16. В целом они очень полезны. Что вы думаете?

Примеры этой статьиlearn-java-base-9-to-20

Эта статья была включена вWoohoo Freudpress.com/26-JDK16-а как насчет…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!