2010-02-24 8 views
7

Vi this question hace unos minutos, y decidí echar un vistazo en la clase java String para comprobar si había alguna sobrecarga para el operador +.+ operador para Cadena en Java

no pude encontrar nada, pero sé que puedo hacer esto

String ab = "ab"; 
String cd = "cd"; 
String both = ab + cd; //both = "abcd" 

dónde está ese implementado?

Respuesta

12

Desde el Fine Manual:

El lenguaje Java proporciona un apoyo especial para el operador de concatenación (+), y para la conversión de otros objetos a cadenas. La concatenación de cadenas se implementa mediante la clase StringBuilder (o StringBuffer) y su método append. Las conversiones de cadenas se implementan a través del método toString, definido por Object y heredado por todas las clases en Java. Para obtener información adicional sobre la concatenación y la conversión de cadenas, consulte Gosling, Joy y Steele, Especificación del lenguaje Java.

Ver String Concatenation en el JLS.

+0

'StringBuilder' debe ser preferido cuando la sincronización no es una preocupación. – gpampara

+0

@gpampara El compilador sabe usar StringBuilder. StringBuffer se utilizó en versiones anteriores a la introducción de StringBuilder. –

2

Es manejado por el compilador.

+1

Impresionante respuesta. ¿Has considerado ser un maestro? – whiskeysierra

+0

@Willi Schönborn: Bueno, es la respuesta simple y correcta. No tuve tiempo para escribir más cuando lo escribí y cuando volví a la computadora había muchas respuestas que lo explicaban con más detalle. Lamento decirlo, pero no veo el punto de duplicar las otras respuestas, recomiendo leer @ Sean's y @ jleedev si necesita más información (Y sí, la enseñanza está en mi currículum). – Fredrik

+0

El punto es: su respuesta es tan general que cabe para casi ~ 75% de todas las preguntas relacionadas con Java en SO. – whiskeysierra

2

Este es un comportamiento especial documentado en language specification.

15.18.1 Concatenación de cadenas Operador +

Si sólo una expresión operando es de tipo String , a continuación, la conversión de cadenas se realiza en el otro operando a producir una cadena en tiempo de ejecución. El resultado es una referencia a un objeto String (recién creado, a menos que la expresión es un tiempo de compilación constante expresión (§15.28)) que es el concatenación de los dos operandos cuerdas. Los caracteres del operando de la izquierda preceden a los caracteres del operando de la derecha en la cadena recién creada. Si un operando de tipo String es nulo, entonces se usa la cadena "nulo" en lugar de ese operando.

7

El compilador trata el código como si hubiera escrito algo como:

String both = new StringBuilder().append(ab).append(cd).toString(); 

Editar: Cualquier referencia? Bueno, si puedo compilar y descompilar el código de la OP, me sale esto:

0: ldC#2; //String ab 
2: astore_1 
3: ldC#3; //String cd 
5: astore_2 
6: new #4; //class java/lang/StringBuilder 
9: dup 
10: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V 
13: aload_1 
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
17: aload_2 
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
24: astore_3 
25: return 

Por lo tanto, es como dije.

+1

alguna referencia para esto? –

0

String se define como un tipo estándar como int, double, float, etc. en el nivel de compilación. Esencialmente, todos los compiladores tienen sobrecarga del operador. La sobrecarga del operador no está definida para Desarrolladores (a diferencia de C++).

Curiosamente: Esta pregunta se registra como un error: http://bugs.sun.com/view_bug.do?bug_id=4905919

2

La mayoría de las respuestas aquí son correctas (es manejado por el compilador, + se convierte en .Append() ...)

Quería agregar que todos deberían echar un vistazo al código fuente de String y anexar en algún momento, es bastante impresionante.

creo que todo se redujo a algo como:

"a"+"b"+"c" 

=

new String().append("a").append("b").append("c") 

Pero entonces sucede algo de magia. Esto se convierte en:

  • Crear una matriz de cadenas de longitud 3
  • copia una a la primera posición.
  • copia b en la segunda
  • copia C en la tercera

Mientras que la mayoría de la gente cree que va a crear "ab", a continuación, tirar a la basura cuando se crea "abc". Realmente entiende que está siendo encadenado y hace algo de manipulación.

También hay un truco en el que si tienes la cadena "abc" y pides una subcadena que resulta ser "bc", PUEDEN compartir exactamente la misma matriz subyacente. Notarás que hay una posición de inicio, posición final y bandera "compartida".

De hecho, si no se comparte, es posible que se extienda la longitud de una cadena y copiar los otros en.

Ahora estoy siendo confuso. Lee el código fuente, es bastante genial.

+1

No hay 'nuevo String(). Append (" a "). Append (" b "). Append (" c ")', pero 'new StringBuilder(). Append (" a "). Append (" b) .append ("c"). toString() '. El modo * no-stringbuilder * sería' "a" .concat ("b"). concat ("c") ', y esta es la manera ineficiente como usted describió. (Pero al usar + con constantes de tiempo de compilación, todo esto ya lo hace el compilador). –