preguntas de la entrevista de cadena, después de leer estas cinco, tiene la garantía de ganar algo

 [Recomendado] La última colección de libros electrónicos de Java en 2020.pdf (Hematemesis) >>>

 https://www.cnblogs.com/xiaogeng88/p/12692306.html

 

En este artículo, echemos un vistazo a las 5 preguntas de la entrevista sobre la clase Java String. De estas cinco preguntas, personalmente experimenté algunas preguntas durante la entrevista. Después de aprender esto, me di cuenta y me di cuenta de por qué esta respuesta es. Este artículo lo lleva a comprender por qué las respuestas a estas preguntas son así.

1. Determine si st1 y st2 definidos como tipo de cadena son iguales, por qué

 cadena de paquete ;

public class Demo2_String {

  public static void main (String [] args)  {
    String st1 =  "abc";
    Cadena st2 =  "abc";
    System.out.println (st1 == st2);
    System.out.println (st1.equals (st2));
  }

}

Salida: primera línea: verdadera segunda línea: análisis verdadero: primer vistazo a la primera declaración de impresión, en Java == este símbolo es un operador de comparación, puede ser el tipo de datos básico y el tipo de datos de referencia son iguales, si es básico Para los tipos de datos, == compara si los valores son iguales, y si es un tipo de datos de referencia, == compara si las direcciones de memoria de los dos objetos son iguales. La cadena no pertenece al tipo de datos básico en 8, el objeto de cadena pertenece al tipo de datos de referencia, "abc" se asigna a los dos objetos de cadena st1 y st2 al mismo tiempo, apuntando a la misma dirección, por lo que la primera impresión La salida de comparación == en el enunciado es verdadera. Luego observamos la comparación de equals en el segundo enunciado de impresión. Sabemos que equals es un método de la clase padre de Object. Este método de igualdad se reescribe en la clase String. En la API JDK 1.6 Encuentre el método de igualdad bajo la clase String en el documento, haga clic para ver la oración "Compare esta cadena con el objeto especificado. Si y solo si el parámetro no lo es null, y es el objeto el que representa la misma secuencia de caracteres que este  objeto El resultado es entonces ". Tenga en cuenta que esta misma secuencia de caracteres, la comparación de dos matrices, listas y diccionarios introducidos más adelante se implementará por esta lógica para escribir código. Dado que los valores de st1 y st2 son "abc", los dos apuntan al mismo objeto y la secuencia de caracteres actual es la misma, por lo que el resultado de la impresión de la segunda línea también es verdadero. Dibujemos un gráfico de memoria para representar el código anterior, que parece más convincente. String true

El proceso de memoria es aproximadamente el siguiente: 1) Ejecutar primero para compilar y luego cargar el archivo de clase actual Demo2_String.class en el área de método de la memoria 2) El segundo paso, el método principal se inserta en la memoria de la pila 3) El grupo constante crea un objeto "abc" y genera una memoria Dirección 4) Luego asigne la dirección de memoria "abc" a la variable miembro st1 en el método principal. En este momento, st1 apunta a "abc" en el grupo constante de acuerdo con la dirección de memoria. 5) Como se mencionó en el artículo anterior, el grupo constante tiene esta característica. Si se descubre que existe, no creará objetos duplicados. 6) Ejecute el código Stringst2 = "abc", porque el grupo constante tiene "abc", por lo que no se volverá a crear. Asigne directamente la dirección de memoria "abc" a st27) Finalmente, st1 y st2 apuntan a la misma dirección en la memoria, por lo que los dos son idénticos. 2. La siguiente oración crea varios objetos en la memoria. La respuesta es: crear dos objetos en la memoria, uno en la memoria del montón y otro en el grupo constante. El objeto de la memoria del montón es una copia del objeto del grupo constante. Análisis: tomemos un mapa de memoria directamente debajo.

Cuando vemos la palabra clave new, debemos pensar que los objetos que salen de new se almacenan en la memoria de almacenamiento dinámico. Luego explicamos por qué los objetos en el montón son copias de objetos en el grupo constante. "Abc" es una cadena y la cadena es una constante, por lo que debe crearse en el grupo constante, por lo que el primer objeto creado es "abc" en el grupo constante. El segundo objeto es una copia de la copia en la memoria del montón. Esto requiere una nota sobre el constructor de String (String original) en JDK API 1.6: inicialice un String objeto
recién creado para que represente un parámetro con el mismo Secuencia de caracteres; en otras palabras, la cadena recién creada es una copia de la cadena de parámetros. Entonces, salió la respuesta, dos objetos.
3. Determine si los siguientes st1 y st2 definidos como tipos de cadena son iguales

 cadena de paquete ;
public class Demo2_String {
   public static void main (String [] args)  {
     String st1 =  new String ("abc");
     Cadena st2 =  "abc";
     System.out.println (st1 == st2);
     System.out.println (st1.equals (st2));
   }
}


Respuesta: falso y verdadero Debido a las dos experiencias y teorías anteriores sobre el análisis de la memoria, puedo obtener rápidamente la respuesta anterior. == Compare las direcciones de memoria de los objetos st1 y st2. Dado que st1 apunta a la dirección de la memoria de almacenamiento dinámico, st2 ve que "abc" ya existe en el grupo constante, por lo que no se volverá a crear, por lo que st2 apunta a la dirección de memoria del grupo constante, Entonces == resultado del resultado del juicio falso, los dos no son iguales. La segunda comparación es igual, la comparación es si las dos secuencias de cadena son iguales, porque solo hay un "abc", por lo que son completamente iguales. El mapa de memoria es el siguiente

4. Determine si los siguientes st1 y st2 definidos como tipos de cadena son iguales

 cadena de paquete ;
 
public class Demo2_String {
 
   public static void main (String [] args)  {
     String st1 =  "a" +  "b" +  "c";
     Cadena st2 =  "abc";
     System.out.println (st1 == st2);
     System.out.println (st1.equals (st2));
   }
}

La respuesta es: análisis verdadero y verdadero: "a", "b", "c" son originalmente constantes de cadena, después de que el signo + se empalma, se convierte en "abc", y "abc" es una constante de cadena (en Java Hay un mecanismo de optimización constante), por lo que el grupo constante creará inmediatamente un objeto constante de cadena "abc", st2 = "abc", en este momento, el grupo constante existe "abc", por lo que ya no se crea. Entonces, ya sea que compare direcciones de memoria o compare secuencias de cadenas, todas son iguales. 5. Determine si los siguientes st2 y st3 son iguales

 cadena de paquete ;
 
public class Demo2_String {
 
   public static void main (String [] args)  {
     String st1 =  "ab";
     Cadena st2 =  "abc";
     Cadena st3 = st1 +  "c";
     System.out.println (st2 == st3);
     System.out.println (st2.equals (st3));
   }
}

Respuesta: análisis falso y verdadero: la primera respuesta es falsa, la segunda es verdadera y la segunda es verdadera, lo entendemos muy bien, porque la comparación es "abc" y la otra es "abc" obtenida por costura. Por lo tanto, es igual a la comparación, esto es cierto, lo entendemos muy bien. Entonces, el primer juicio es por qué es falso, estamos muy confundidos. De manera similar, a continuación usamos anotaciones de API y mapas de memoria para explicar por qué esto no es igual. Primero, abra la introducción de String en JDK API 1.6 y encuentre la oración en la imagen a continuación.

El punto clave es la oración en el círculo rojo. Sabemos que cualquier dato y cadena son más (+), y el resultado es una nueva cadena. El comentario anterior muestra que el principio de este empalme se logra mediante la clase StringBuilder o StringBuffer y el método append dentro, y luego se llama a toString () para convertir el objeto empalmado en un objeto de cadena, y finalmente la dirección del objeto de cadena se asigna a una variable. Combinado con esta comprensión, dibujamos un gráfico de memoria para analizar.

Proceso de memoria aproximada
1) El grupo constante crea un objeto "ab" y lo asigna a st1, por lo que st1 apunta a "ab" 2) El grupo constante crea un objeto "abc" y lo asigna a st2, por lo que st2 apunta a "abc" 3) El método de unión + utilizado aquí, por lo que el tercer paso es utilizar el método append de la clase StringBuffer para obtener "abc". En este momento, la memoria 0x0011 representa un objeto StringBuffer. Tenga en cuenta que no es un objeto String. 4) Se llamó al método toString de Object para reemplazar el objeto StringBuffer con un objeto String. 5) Asigne el objeto String (0x0022) a st3. Por lo tanto, los resultados de juicio st = y st2 == no son iguales, porque las direcciones de memoria de los dos objetos son diferentes. Resumen: Esta pregunta de la entrevista requiere dominar por completo algunas de las anotaciones y principios de la API JDK, así como el análisis del mapa de memoria para obtener los resultados correctos. Admito que dibujar el mapa de memoria me permite entender por qué la respuesta es así. Después de dibujar el mapa de memoria, obtenga la respuesta, lo encontrará muy interesante, y finalmente habrá tal lamento.

Supongo que te gusta

Origin www.cnblogs.com/xiaogeng88/p/12692266.html
Recomendado
Clasificación