Características de JDK11

Descripción general de JAVA11

El 26 de septiembre de 2018, Oracle lanzó oficialmente JAVA11. Esta es la primera versión de soporte a largo plazo después de los principales cambios en el ciclo de versiones de JAVA, y es muy digna de atención. La última versión de JAVA11 traerá características importantes como ZGC y HttpClient. Hay un total de 17 JEP que requieren nuestra atención. Documento de referencia http://openjdk.java.net/projects/jdk/11/

imagen.png

Introducción a funciones específicas

  • 181: control de acceso basado en anidamiento
  • 309: Constantes de archivos de clases dinámicas
  • 315: Mejorar los intrínsecos de Aarch64
  • 318:Epsilon: un recolector de basura no operativo
  • 320: Eliminar módulos Java EE y CORBA
  • 321: cliente HTTP (estándar)
  • 323: Parámetros Lambda de sintaxis de variable local
  • 324: Consistente con las claves de Curve25519 y Curve448
  • 327: Unicódigo 10
  • 328: registrador de vuelo
  • 329: Algoritmos criptográficos ChaCha20 y Poly1305
  • 330: iniciar un programa de código fuente de un solo archivo
  • 331: análisis de montón de gastos generales bajos
  • 332: TLS (Seguridad de la capa de transporte) 1.3
  • 333:ZGC: un recolector de basura escalable de baja latencia (experimental)
  • 335: el motor JavaScript de Nashorn está obsoleto
  • 336: Las herramientas y API de Pack200 están en desuso

cambios en el nivel gramatical

Actualización de inferencia de tipo de variable local

La inferencia de tipos de variables locales es una nueva característica agregada desde Java 10. La inferencia de variables locales se ha actualizado en Java 11. La var admite el formato de sintaxis para agregar anotaciones, lo cual no es posible en JAVA 10.

En las expresiones lambda, cuando las anotaciones modifican variables, el tipo de datos de la variable debe escribirse y no puede omitirse. Escribir como el siguiente es incorrecto

Consumer<String> con =(@Deprecated  t) -> System.out.println(t.toLowerCase());

En este momento, debe agregar tipos de datos para los parámetros entre paréntesis, que deben escribirse así

Consumer<String> con =(@Deprecated String t) -> System.out.println(t.toLowerCase());

En java11, el tipo de datos del parámetro en la expresión lambda puede usar var, pero debe escribirse

Consumer<String> con =(@Deprecated var t) -> System.out.println(t.toLowerCase());

Mejora del nivel API

Cadena de nuevos métodos

Hay muchos métodos nuevos para el procesamiento de cadenas en JDK11. Simplifique las operaciones en cadenas

describir Ejemplo
Determinar si la cadena está en blanco " ".está en blanco(); // verdadero
Eliminar los espacios en blanco iniciales y finales de la cadena " www.boge.com ".strip(); // “www.boge.com”
Eliminar espacios finales de la cadena " www.boge.com “.stripTrailin(); // " www.boge.com”
Eliminar espacios iniciales de la cadena " www.boge.com ".stripLeading(); // "www.boge.com "
copiar cadena “boge”.repeat(2);// “bogeboge”
Número de filas “A\nB\nC\nD”.lines().count(); // 4
    public static void main(String[] args) {
    
    
        // 判断字符串是否为空白
        boolean b = " ".isBlank();// true
        // 去除字符串首尾空白
        String s1 = " www.boge.com ".strip();// "www.boge.com"
        // 去除字符串尾部空格
        String s2 = " www.boge.com ".stripTrailing();// " \n \twww.boge.com"
        // 去除字符串首部空格
        String s3 = " www.boge.com ".stripLeading();// "www.boge.com\n \t "
        // 复制字符串
        String r = "boge".repeat(2);// "bogeboge"
        // 行数统计
        long c = "A\nB\nC\nD".lines().count();// 4
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(r);
        System.out.println(c);
    }

Nuevo método opcional

Opcional también ha añadido varios métodos muy útiles. Ahora puedes convertir fácilmente un Opcional en un Stream, o reemplazarlo cuando un Opcional esté vacío. Descubrimos que desde que apareció Stream en JDK8, cada versión tiene actualizaciones relacionadas.

Agregar método describir Nueva versión
booleano está vacío() Determinar si el valor está vacío JDK11
T o ElseThrow() el valor no está vacío, devuelve el valor; de lo contrario, lanza NoSuchElementExpception JDK10
ifPresentOrElse(Consumidor<? super T> acción,Acción vacía ejecutable) Si el valor no está vacío, ejecute la función del parámetro 1. Si el valor está vacío, ejecute la función del parámetro 2. JDK9
Opcional<T>o(Proveedor<? extiende Opcional<? extiende T> proveedor) Si el valor no está vacío, se devuelve el Opcional correspondiente. Si el valor está vacío, se devuelve el Opcional encapsulado por el parámetro formal. JDK9
Corriente<T>corriente(); Si el valor no está vacío, se devuelve un Steam que contiene solo este valor. De lo contrario, se devuelve un Stream vacío. JDK 9
    public static void main(String[] args) {
    
    
        Optional<String> optional =Optional.empty();
        //JDK8 判断value是否存在
        System.out.println(optional.isPresent());
        //JDK11 判断value是否为空
        System.out.println(optional.isEmpty());

        //JDK10 返回value,如果为null则直接抛出 NoSuchElementExpception
        Optional<String> optional2 = Optional.of("element1");
        String value = optional2.orElseThrow();
        System.out.println(value);

        //JDK9  value非空,执行参数1功能,如果value为空,执行参数2功能
        Optional<String> optional3 =Optional.empty();// Optional.of("element1");
        optional.ifPresentOrElse((v)-> System.out.println("value为"+v),()-> System.out.println("value为null"));

        // JDK9 value非空,返回对应的Optional,value为空,返回形参封装的Optional
        Optional<String> optional4 =Optional.empty();// Optional.of("element1");
        Optional<String> optional5 = optional4.or(() -> Optional.of("element2"));
        System.out.println(optional5);

        // JDK9 value非空,返回一个仅包含此value的Steam,否则,返回一个空的Stream
        Optional<String> optional6 =Optional.of("element3");//Optional.empty();
        Stream<String> stream = optional6.stream();
        stream.forEach(System.out::println);
    }

Cliente HTTP

JAVA9 comenzó a introducir una API HTTPClient para manejar solicitudes HTTP. La API admite sincronización y asincronía, y estuvo oficialmente disponible en JAVA11. Esta API se puede encontrar en el paquete java.net. Reemplazará HTTPUrlConnection (creado en Http1.0s era, y utilizando un método independiente del protocolo), y proporcionando soporte para WebSocket y HTTP2.

HttpClient reemplaza el método de sincronización HttpUrlConnection original


HttpClient client =HttpClient.newHttpClient();
HttpRequest request =HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/demo")).build();
HttpResponse.BodyHandler<String> respnoseBodyHandler= HttpResponse.BodyHandlers.ofString();
HttpResponse<String> response =client.send(request,respnoseBodyHandler);
String body = response.body();
System.out.println(body);

HttpClient reemplaza el método asincrónico HttpUrlConnection original

HttpClient client =HttpClient.newHttpClient();
HttpRequest request =HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/demo")).build();
HttpResponse.BodyHandler<String> respnoseBodyHandler= HttpResponse.BodyHandlers.ofString();
CompletableFuture<HttpResponse<String>> sendAsync = client.sendAsync(request, respnoseBodyHandler);
sendAsync.thenApply(t-> t.body()).thenAccept(System.out::println);

Otros cambios

Compilación y ejecución simplificadas

La sintaxis para compilar un archivo de código fuente de Java antes de JAVA11 debería ser

javac Test1.java

Explique que la sintaxis para ejecutar un código de bytes de Java debe ser

java Test1

En java11, las dos cosas anteriores se pueden hacer directamente mediante un comando java. La sintaxis es:

java Test1.java

hay que tener en cuenta es:

  1. Si hay varias clases en el archivo de código fuente, se ejecuta el método principal de la primera clase en el archivo fuente. Tenga en cuenta que el primero aquí es el primero en la secuencia del código, independientemente de si lo modifica el público.
  2. No se pueden usar clases personalizadas en otros archivos fuente. Se pueden usar clases personalizadas en el archivo actual.

Definir un archivo de código fuente para probar

public class HelloJAVA11{
    
    
    public static void main(String[] args){
    
    
        System.out.println("HelloJAVA11.main");
        // 实例化当前文件中的Person类
        Person p=new Person();
        // 实例化另一个文件中的Student类
        Student stu =new Student();
  
    }
  
}

class Person {
    
    
    private String pid;
    private String pname;
  
}
class Test2{
    
    
    public static void main(String[] args){
    
    
        System.out.println("Test2.main");
    }
}
public class Student{
    
    
  
}

Si el archivo actual no utiliza clases en otros archivos, se puede ejecutar directamente y con éxito.

imagen.png

Si una clase de otro archivo se utiliza en el archivo actual, se producirá una excepción.

imagen.png

ZGC

GC es una de las principales ventajas de Java (la otra es la potente JVM) y siempre será un punto central de la optimización de Java. Sin embargo, cuando el STW (detener el mundo) del GC es demasiado largo, afectará el tiempo de respuesta de la aplicación. Eliminar o reducir los tiempos de pausa de GC hará de Java una plataforma más atractiva para una gama más amplia de escenarios de referencia. Además, la memoria disponible en los sistemas modernos continúa creciendo y los usuarios y programadores esperan que la JVM utilice esta memoria de una manera más eficiente y sin la necesidad de STW largos. ZGC Un recolector de basura escalable de baja latencia (experimental) es la característica más llamativa de JDK11, pero le sigue Experimental, lo que indica que es una versión experimental y no se recomienda su uso en un entorno de producción. ZGC es un recolector de basura compresivo concurrente basado en regiones. Solo la fase de escaneo raíz será STW, por lo que el tiempo de pausa del GC no aumentará con el crecimiento del montón y el crecimiento de los objetos vivos.

Ventaja:

  • El tiempo de pausa no excederá los 10 ms.
  • Puede manejar tanto pequeños montones de cientos de megabytes como grandes montones de varios T (OMG)
  • En comparación con G1, el rendimiento de la aplicación no disminuirá más del 15%
  • Sentar las bases para futuras funciones y optimización del GC mediante punteros de colores y barreras de carga
  • Inicialmente solo admite sistemas de 64 bits

Objetivos de diseño:

  1. Admite capacidad de memoria a nivel de TB, tiempo de pausa bajo (<10 ms) y menos del 15 % de impacto en el rendimiento total del programa
  2. En el futuro, el mecanismo de implementación se podrá ampliar para admitir muchas funciones interesantes, como el montón multinivel o el montón comprimido.

Otra información

  • unicode10
  • Desaprobar las herramientas y la API de Pack200
  • Nuevo recolector de basura Epsilon
  • Soporte completo para contenedores de Linux, incluido Docker
  • Admite recolección de basura completa paralela en G1
  • El último protocolo de seguridad HTTPS TLS 1.3
  • Grabador de vuelo JAVA

Supongo que te gusta

Origin blog.csdn.net/qq_28314431/article/details/132919900
Recomendado
Clasificación