1. En primer lugar, String no pertenece a los 8 tipos de datos básicos.
Debido a que el valor predeterminado de un objeto es nulo, el valor predeterminado de String también es nulo pero es un objeto especial y tiene algunas características que otros objetos no tienen;
2. new String() y new String("") declaran una nueva cadena vacía, que es una cadena vacía y no nula;
3. Cadena str="kvill";
La diferencia entre String str=new String ("kvill");:
Aquí, no hablaremos sobre el montón o la pila, sino que simplemente presentaremos el concepto simple de grupo constante.
El grupo constante se refiere al grupo determinado en el momento de la compilación y almacenado en el grupo compilado. Algunos datos en el archivo de clase. Incluye constantes en clases, métodos, interfaces, etc., así como constantes de cadena.
Mira el ejemplo 1:
Copie el código de código de la siguiente manera:
Cadena s0="kvill";
Cadena s1="kvill";
Cadena s2="kv" + "enfermo";
System.out.println( s0==s1 );
System.out.println( s0==s2 );
El resultado es:
verdadero
verdadero
Primero, necesitamos saber que Java garantizará que solo haya una copia de una constante de cadena.
Debido a que "kvill" en s0 y s1 en el ejemplo son constantes de cadena, se determinan en el momento de la compilación, por lo que s0==s1 es verdadero y "kv" y "ill" también son constantes de cadena. múltiples constantes de cadena, debe ser en sí misma una constante de cadena, por lo que s2 también se analiza en una constante de cadena en el momento de la compilación, por lo que s2 también es uno de "kvill" en el grupo de constantes Quote.
Entonces obtenemos s0==s1==s2;
Las cadenas creadas con new String() no son constantes y no se pueden determinar en el momento de la compilación, por lo que las cadenas creadas con new String() no se colocan en el grupo de constantes, tienen su propio espacio de direcciones.
Mira el ejemplo 2:
Copie el código de código de la siguiente manera:
Cadena s0="kvill";
Cadena s1=nueva Cadena("kvill");
Cadena s2="kv" + nueva cadena("enfermo");
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
El resultado es:
FALSO
FALSO
FALSO
En el Ejemplo 2, s0 sigue siendo la aplicación de "kvill" en el grupo constante. Dado que s1 no se puede determinar en tiempo de compilación, es una referencia al nuevo objeto "kvill" creado en tiempo de ejecución. Dado que s2 tiene la segunda mitad de newString. ("ill"), tampoco se puede determinar en el momento de la compilación, por lo que también es una aplicación de un objeto recién creado "kvill". Si comprende esto, sabrá por qué se obtiene este resultado;
4. Cadena.interno():
Permítanme añadir un punto más: existe en. La JVM carga el grupo constante en el archivo de clase durante el tiempo de ejecución y se puede expandir. El método intern() de String es un método para expandir el grupo de constantes; cuando una instancia de String llama al método intern(), Java verifica si hay una constante de cadena con el mismo Unicode en el grupo de constantes. su referencia. Si no, agregue una cadena Unicode igual a str en el grupo constante y devuelva su referencia, quedará claro al observar el Ejemplo 3. Ejemplo 3:
Copie el código de código de la siguiente manera:
Cadena s0= "kvill";
Cadena s1=nueva Cadena("kvill");
Cadena s2=nueva Cadena("kvill");
System.out.println( s0==s1 );
System.out.println( "**********" );
s1.interno();
s2=s2.intern(); //Asigna la referencia de "kvill" en el grupo constante a s2
System.out.println(s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
El resultado es:
FALSO
**********
false //Aunque se ejecuta s1.intern(), su valor de retorno no está asignado a s1
true //Indica que s1.intern() devuelve una referencia a "kvill" en el grupo constante
verdadero
Finalmente, permítanme disipar otro malentendido:
Alguien dijo: "Utilice el método String.intern() para guardar una clase String en una tabla de cadenas global. Si ya hay una cadena Unicode con el mismo valor en esta tabla, este método devuelve la cadena que ya está en la tabla. dirección, si no hay una cadena con el mismo valor en la tabla, registre su propia dirección en la tabla "Si entiendo la tabla de cadenas global, dijo como un grupo constante, su última oración, "Si en Si no hay una cadena con el. mismo valor en la tabla, es incorrecto registrar su propia dirección en la tabla:
Mira el ejemplo 4:
Copie el código de código de la siguiente manera:
Cadena s1=nueva Cadena("kvill");
Cadena s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2);
System.out.println( s2==s1.intern() );
El resultado es:
FALSO
kvill kvill
verdadero
En esta clase, no declaramos una constante "kvill", por lo que no había "kvill" en el grupo de constantes al principio. Cuando llamamos a s1.intern(), se agregó una nueva constante "kvill" al grupo de constantes. Resulta que el "kvill" que no está en el grupo constante todavía existe, lo que significa que no está "registrando su propia dirección en el grupo constante".
s1==s1.intern() es falso, lo que indica que el "kvill" original todavía existe;
s2 ahora es la dirección de "kvill" en el grupo constante, por lo que s2==s1.intern() es verdadero.
5. Acerca de iguales() y ==:
Para String, esto es simplemente comparar si las secuencias Unicode de dos cadenas son equivalentes y devuelve verdadero si son iguales y == es comparar si las direcciones de las dos cadenas son las mismas, es decir, si son referencias; a la misma cadena.
6. Acerca de String es inmutable
Hay mucho que decir sobre esto siempre y cuando sepas que una instancia de String no cambiará una vez generada, por ejemplo: String str="kv"+"ill"+" "+"ans";
Hay 4 constantes de cadena. Primero, "kv" y "ill" generan "kvill" que se almacena en la memoria. Luego, "kvill" se combina con " " para generar "kvill" y finalmente se almacena en la memoria. se combina con "kvill ans" para generar "kvill ans" y asigna la dirección de esta cadena a str, porque la "inmutabilidad" de String genera muchas variables temporales, por lo que se recomienda usar StringBuffer, porque StringBuffer es cambiable.