2010-11-16 10 views
13

¿Está utilizando un constructor String() como una cadena literal beneficiosa en cualquier escenario? El uso de literales de cadena permite la reutilización de objetos existentes, entonces, ¿por qué necesitamos el constructor público? ¿Hay algún uso del mundo real? Por ejemplo, ambos literales apuntan al mismo objeto.¿Por qué no es privado el constructor de String()?

String name1 = "name";//new String("name") creates a new object. 
String name2 = "name"; 

Respuesta

18

Un ejemplo en el que el constructor tiene un propósito útil: Strings creados por String.substring() comparten la char[] subyacente de la String que están creados por. Entonces, si tiene un String de longitud 10.000.000 (ocupando 20 MB de memoria) y toma sus primeros 5 caracteres como subcadena, entonces descarte el String original, esa subcadena aún impedirá que el objeto de 20MB sea elegible para recolección de basura. Usar el constructor String evitará eso, ya que hace una copia de solo la parte de la matriz char subyacente que es realmente utilizada por la instancia String.

Por supuesto, si se crea y utiliza una gran cantidad de subcadenas de la misma String, especialmente si se superponen, entonces sería mucho quieren que les permite compartir el subyacente char[], y utilizando el constructor sería contraproducente.

+0

Esta fue una dura lección aprendida para mí hace unos 5 años. –

+0

Fue una hermosa conferencia, pero no responde a la pregunta del encabezado: "¿por qué el constructor de cadenas * no es privado?" String.subsring() puede implementar todas sus optimizaciones utilizando constructor privado como método de clase String. La pregunta es por qué es este constructor público? – AlexR

+1

@AlexR: Lee la respuesta nuevamente, específicamente la última oración del primer párrafo. –

0

Porque a veces es posible que desee crear una copia y no solo tener una nueva referencia a la misma cadena.

+0

¿Puedes dar un ejemplo de tal escenario? – cdhowie

+3

Vi esta mañana una pregunta sobre un WeakHashMap, que es un HashMap que elimina un elemento automáticamente cuando su clave es recogida de basura. Resulta que no debe usar literales de cadena como claves porque nunca se recuperarán. –

3

Dado que la secuencia es inmutable, las operaciones como la subcadena mantienen la cadena original que puede ser larga. Usar el constructor para crear una nueva cadena a partir de la subcadena creará una nueva cadena y permitirá soltar la cadena anterior (a GC). De esta manera podría liberar la memoria necesaria.
Ejemplo:

String longS = "very long"; 
String shortS = new String(longS.substring(4)); 
+0

@Erick: No, no necesariamente idéntico. Ver la respuesta de Michael. –

+0

@Erick: sí, porque la matriz char subyacente puede ser mucho más grande que el contenido String "visible". –

+0

Michael explica esto mejor. –

0

Todas las buenas respuestas aquí, pero creo que vale la pena señalar que el Java trata literales bastante diferentes a Strings construidos de la manera tradicional.

Esto es a good Q/A sobre esto.

Cuestiones relacionadas