2012-06-24 15 views
6

¿Cuántos objetos de cadena se crearán con el siguiente código?¿Cuántos objetos de cadena se crearán en la memoria?

String s=""; 
s+=new String("a"); 
s+="b"; 

Tuve esta pregunta en el examen. Quiero saber la respuesta correcta. Dije 2 objetos.
El objeto del conjunto que contiene "", "b" y el objeto creado por la nueva Cadena ("a");

+3

¿Qué es 'B'? Realmente no podemos responder tu pregunta sin saber eso. –

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String%28java.lang.String%29 –

Respuesta

8

Cadena s = "";

no crea objetos.

s + = new Cadena ("a");

crea cinco objetos. el new String, el StringBuilder y su char [] y el String resultante y su char []

s + = "b";

crea cuatro objetos, el StringBuilder y su char [] y la cadena resultante y su char []

por lo que obtener un total de nueve objetos de los cuales son tres objetos String

Nota: Puede estar seguro de que "" ya se ha cargado como aparece en muchas clases del sistema, incluidos ClassLoader y Class.

Las cadenas "a" y "b" pueden o no considerarse nuevas cadenas a efectos de esta pregunta. En mi humilde opinión, no los contaría, ya que solo se crearán a lo sumo una vez y si este código solo se ejecuta una vez, no importa cuántas cadenas se creen. Lo que es más probable que sea útil es saber cuántos objetos se crean cada vez que se ejecuta el código.

+0

El código no se compila (más específicamente, la siguiente línea ' s + = new String ("a"); '). ¿Cómo se las arregló para contar la cantidad de objetos creados en tiempo de ejecución? –

+6

La pregunta es acerca de las instancias String. No solo objetos –

+0

@DarinDimitrov Mi IDE y el compilador dicen que compila. ¿Cuál se supone que es el problema? –

9

Voy a anwser a otro, más clara pregunta: ¿cuántas instancias de Cuerda están involucrados en el siguiente fragmento de código:

String s=""; 
s+=new String("a"); 
s+="b"; 

y la respuesta es 6:

  • la cadena vacía literal: "";
  • la Cadena literal "a";
  • la copia del literal de cadena "a": new String("a");
  • la Cadena creada por concatenación s y la copia de "a";
  • la cadena literal "b"
  • la cadena creada mediante la concatenación de s y "b".

Si supone que los tres literales de Cadena ya han sido creados por el código previamente cargado, el fragmento de código crea 3 nuevas instancias de Cadena.

+0

Cadena s1 = nueva Cadena ("hello"); , ¿Cuántas referencias se crean a nivel de JVM? Conozco dos objetos: 1 en el momento de la carga de clase para "hola" y 1 en el momento real de ejecución del comando. 1 referencia es s1, mi duda es que también hay una segunda referencia s2 que es el resultado de la cadena "hola" en la carga de clase que se pasa al "nuevo constructor de cadena()". En Java, no hay forma de que podamos pasar un objeto en sí mismo en una función o constructor, solo podemos pasar una referencia. Además, debería haber una tercera referencia s3, que debería ser el resultado de una nueva cadena ("hola") y luego debería asignarse a s1. –

0

El número de objetos realmente creados en una situación JITC es indeterminado.El JITC bien puede reconocer que new String("a") es una identidad, y que no se hace referencia a valores intermedios de s, por lo que solo se crea StringBuilder. Hay varios efectos secundarios potenciales que se deben imitar en el caso general (por ejemplo, cuando el argumento new String() puede no ser válido), pero con literales no pueden ocurrir.

De hecho, javac podría reconocer que el resultado es "ab", sin efectos secundarios potenciales, y solo produce un literal String de ese valor. (Lo hace combinando cadena en casos poco menos complicados.)

0

Creación de nuevas cadenas

Anteriormente se comprometió a hablar más sobre las sutiles diferencias entre los distintos métodos de creación de una cadena. Veamos un par de ejemplos de cómo se podría crear una cadena, y vamos a suponer, además, que no existen otros objetos String en la piscina:

String s = "abc"; // creates one String object and one reference variable 

En este caso sencillo, "abc" irá en el grupo ys se referirán a él.

String s = new String("abc"); // creates two objects, and one reference variable 

En este caso, porque utilizamos la palabra clave new, Java creará un nuevo objeto String en memoria normal (nonpool), y s referiremos a ella. Además, el literal "abc" se colocará en el grupo.

De SCJP Programador Certificado guía de estudio Java 6 (Examen 310-065) .pdf

Cuestiones relacionadas