Strings compactas en Java 9 con ejemplos

Requisitos previos : String

Compact String es una de las mejoras de rendimiento introducidas en JVM como parte de JDK 9 . Hasta JDK 8, cada vez que creamos un objeto String , internamente se representa como char[], que consiste en los caracteres del objeto String.

¿Cuál es la necesidad de Compact String?

  • Hasta JDK 8, Java representa el objeto String como char[] porque cada carácter en Java es de 2 bytes porque Java usa internamente UTF-16.
  • Si cualquier string contiene una palabra en inglés, el carácter se puede representar usando un solo byte, no necesitamos 2 bytes para cada carácter. Muchos caracteres requieren 2 bytes para representarlos, pero la mayoría de los caracteres requieren solo 1 byte, que se incluye en el conjunto de caracteres LATIN-1. Por lo tanto, existe la posibilidad de mejorar el consumo de memoria y el rendimiento.
  • Java 9 introdujo el concepto de strings compactas. El objetivo principal de la string compacta es cada vez que creamos un objeto de string y los caracteres dentro del objeto se pueden representar usando 1 byte, que no es más que una representación LATIN-1, luego internamente Java creará un byte []. En otros casos, si algún carácter requiere más de 1 byte para representarlo, cada carácter se almacena utilizando 2 bytes, es decir, representación UTF-16.
  • Así es como los desarrolladores de Java cambiaron la implementación interna de String, es decir, Compact String, que mejorará el consumo de memoria y el rendimiento de String.

Implementación interna de la clase de string antes de Java 9 :

Java 8 or before

import java.io.Serializable;
  
public final class String
    implements Serializable,
               Comparable<String>,
               CharSequence {
  
    // The value is used
    // for character storage.
    private final char value[];
}

Nota: en el programa anterior, podemos ver que antes de Java 9, Java representaba el objeto String solo como char[]. Supongamos que creamos un objeto String y el objeto contiene los caracteres que se pueden representar usando 1 byte. En lugar de representar el objeto como byte[], solo creará char[], lo que consumirá más memoria.

Los desarrolladores de JDK analizaron que la mayoría de las strings se pueden representar solo con el conjunto de caracteres Latin-1 . Un carácter Latin-1 se puede almacenar en un byte, que es exactamente la mitad del tamaño de un carácter. Esto mejorará el rendimiento de String.

Implementación interna de clase de string de Java 9

Java 9 and after

import java.io.Serializable;
  
public final class String
    implements Serializable,
               Comparable<String>,
               CharSequence {
  
    private final byte[] value;
  
    private final byte coder;
}

Nota: Ahora la pregunta es ¿cómo distinguirá entre las representaciones LATIN-1 y UTF-16 ? Los desarrolladores de Java introdujeron un codificador variable de bytes final que conserva la información sobre la representación de caracteres. El valor del valor del codificador puede ser:

static final byte LATIN1 = 0;
static final byte UTF16 = 1;

Por lo tanto, la nueva implementación de String conocida como Compact String en Java 9 es mejor que String antes de Java 9 en términos de rendimiento porque Compact String usa aproximadamente la mitad del área en comparación con String en el montón de JDK 9.

Veamos la diferencia de la memoria utilizada por un objeto String antes de Java 9 y desde Java 9 :

// Program to illustrate the memory
// used by String before Java 9
  
public class Geeks {
    public static void main(String[] args)
    {
        String s
            = new String("Geeksforgeeks");
    }
}

Puntos clave a tener en cuenta cuando estamos ejecutando Java 8 o anterior:

  • Aquí, creamos un objeto String con 13 caracteres y los caracteres dentro del objeto se pueden representar usando 1 byte, que no es más que una representación LATIN-1.
  • Si ejecutamos el programa anterior con JDK versión 8 o anterior, como JDK 8 usa UTF-16 de forma predeterminada, la string interna se representará como char[].
  • Aquí no necesitamos char[], podemos representar cada carácter con solo 1 byte. En lugar de crear byte[], se creará char[] y para cada carácter, se asignan 2 bytes en la memoria del montón. Esto no es más que un desperdicio de memoria del montón.
// Program to illustrate the memory
// used by String from Java 9
  
public class Geeks {
    public static void main(String[] args)
    {
  
        String s1 = new String("Geeksforgeeks");
        String s2 = new String("Geeksforgeeks€");
    }
}

Puntos clave a tener en cuenta cuando estamos ejecutando en Java 9:

  • A partir de Java 9, según la necesidad, se crearán char[] o byte[] para los objetos String. Aquí, como podemos ver, creamos el objeto String s1 con 13 caracteres y el objeto s2 con 14 caracteres.
  • Cada carácter presente dentro del objeto s1 se puede representar usando solo 1 byte. Es por eso que para el objeto s1, se creará un byte[].
  • Ahora, para s2, tenemos un carácter adicional además de los caracteres presentes en el objeto s1, es decir, €. No podemos representar el carácter € usando el juego de caracteres LATIN-1. Aquí necesitamos 2 bytes para representar €. Es por eso que aquí Java usará UTF-16 para presentar los caracteres representados dentro de s2.
  • Para el objeto s2, se creará internamente char[].
  • Es así como la nueva implementación de String conocida como Compact String en Java 9 es mejor que String antes de Java 9 en términos de consumo de memoria y rendimiento.

Publicación traducida automáticamente

Artículo escrito por Bishal Kumar Dubey y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *