Es String Literal Pool una colección de referencias al objeto String, o una colección de objetos

Estoy completamente confundido después de leer el artículo en el sitio javaranch por Corey McGlone, el autor de The SCJP Tip Line. nombrado Strings, Literally y la Guía del programador Java 6 de SCJP por Kathy Sierra (cofundadora de javaranch) y Bert Bates.

Intentaré citar lo que el Sr. Corey y la Sra. Kathy Sierra han citado sobre String Literal Pool.

1. Según el señor Corey McGlone:

String Literal Pool es una colección de referencias que apuntan a los objetos String.

String s = "Hello"; (Suponga que no hay ningún objeto en el montón llamado "Hola"), creará un objeto String"Hello" en el montón, y colocará una referencia a este objeto en el String Literal Pool (Constant Table)

String a = new String("Bye"); (Suponga que no hay ningún objeto en el montón llamado "Bye",new el operador obligará a la JVM a crear un objeto en el Heap.

Ahora la explicación de"new" El operador para la creación de un String y su referencia es un poco confuso en este artículo, por lo que estoy poniendo el código y la explicación del artículo tal como está a continuación.

public class ImmutableStrings
{
    public static void main(String[] args)
    {
        String one = "someString";
        String two = new String("someString");

        System.out.println(one.equals(two));
        System.out.println(one == two);
    }
}

En este caso, en realidad terminamos con un comportamiento ligeramente diferente debido a la palabra clave"new." En tal caso, las referencias a los dos literales de cadena aún se colocan en la tabla de constantes (el Grupo de cadenas literales), pero, cuando se llega a la palabra clave"new," La JVM está obligada a crear un nuevo objeto String en tiempo de ejecución, en lugar de usar el de la tabla de constantes.

Aquí está el diagrama explicándolo.

Entonces, ¿significa que String Literal Pool también tiene una referencia a este objeto?

Aquí está el enlace al artículo por Corey McGlone

http://www.javaranch.com/journal/200409/Journal200409.jsp#a1

2. Según Kathy Sierra y Bert Bates en el libro de SCJP:

Para hacer que Java sea más eficiente en la memoria, la JVM reserva un área especial de memoria llamada "grupo de constantes de cadenas", cuando el compilador encuentra una cadena literal, verifica el grupo para ver si ya existe una cadena idéntica o no. Si no, entonces crea un nuevo objeto literal de cadena.

String s = "abc"; // Crea un objeto String y una variable de referencia ....

eso está bien, pero luego me confundió esta declaración:

String s = new String("abc") // Crea dos objetos, y una variable de referencia.

Dice en el libro que .... un nuevo objeto String en la memoria normal (no de grupo), y "s" se referirá a él ... mientras que un literal "abc" adicional se colocará en el grupo.

Las líneas anteriores en el libro chocan con la del artículo de Corey McGlone.

Si String Literal Pool es una colección de referencias al objeto String como lo menciona Corey McGlone, ¿por qué se colocará el objeto literal "abc" en el pool (como se menciona en el libro)?

¿Y dónde reside este Grupo de Cuerdas Literales?

Por favor, elimine esta duda, aunque no importará mucho al escribir un código, pero es muy importante desde el punto de vista de la gestión de la memoria, y esa es la razón por la que quiero borrar esta base.

Respuestas a la pregunta(1)

Su respuesta a la pregunta