36 votes

Où «+» est-il implémenté pour Strings dans le code source Java?

String est un cas spécial en Java. C'est une classe, je peux examiner dans le code source, mais il a aussi son propre opérateur infixe +, ce qui semble être sucre syntaxique pour StringBuilder.

Par exemple,

"Hello " + yourName;

pourrait devenir

new StringBuilder().append("Hello ").append(yourName).toString();

Il n'y a pas défini par l'utilisateur opérateurs en Java, donc où est - + spécifié pour String?

Pourraient le même mécanisme être utilisé pour faire d'autres opérateurs, tels que pour les vecteurs?

44voto

TheLostMind Points 10813

+ est implémenté dans les compilateurs java. Le compilateur remplace String + String par des constantes de temps de compilation ou par du code StringBuilder . Notez que cela s'applique aussi aux primitives . c'est-à-dire que int i=1+2 pourrait être directement remplacé par int i=3 lors de la compilation elle-même.

23voto

Vous pouvez le vérifier avec la spécification. Le compilateur avoir la mise en œuvre de ça, pas le code source Java.

Java Language Specification- 15.18.1. String Concatenation Operator +

Une mise en œuvre peut choisir d'effectuer la conversion et de la concaténation en une seule étape pour éviter de créer puis de les jeter l'intermédiaire de la Chaîne de l'objet. Pour augmenter le rendement de la répétition de concaténation de chaîne, d'un compilateur Java peut utiliser la classe StringBuffer ou une technique similaire pour réduire le nombre des intermédiaires de la Chaîne des objets qui sont créés par l'évaluation d'une expression.

Il montre la preuve que la mise en œuvre dépend du compilateur.

8voto

Rahul Tripathi Points 1

Compilateurs Java ont de la mise en œuvre de +. La documentation Javadoc dit:

Le langage Java fournit un soutien spécial pour la chaîne l'opérateur de concaténation ( + ), et pour la conversion des autres objets les chaînes de caractères. La concaténation de chaîne est mise en œuvre par le biais de la StringBuilder(ou StringBuffer) de la classe et de sa méthode append.Chaîne les conversions sont mis en œuvre par le biais de la méthode toString, défini par Objet et héritées par toutes les classes en Java. Pour plus d' informations sur la concaténation de chaîne et de conversion, voir Gosling, de la Joie, et Steele, La Java Langage de Spécification.

Vous pouvez essayer de vérifier ce:

public static void main(String[] args) {
    String s1 = "s1";
    String s2 = "s2";
    String s3 = s1 + s2;
    String s4 = new StringBuilder(s1).append(s2).toString();
}

Le code ci-dessus génère le même bytecode pour + et lors de l'utilisation de StringBuilder:

L0
LINENUMBER 23 L0
LDC "s1"
ASTORE 1

L1
LINENUMBER 24 L1
LDC "s2"
ASTORE 2

// s3 = s1 + s2

L2
LINENUMBER 25 L2

NEW java/lang/StringBuilder
DUP
ALOAD 1
INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

ASTORE 3

// s4 = new StringBuilder(s1).append(s2).toString()

L3
LINENUMBER 26 L3

NEW java/lang/StringBuilder
DUP
ALOAD 1
INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

ASTORE 4
L4
LINENUMBER 27 L4
RETURN

5voto

Tagir Valeev Points 14218

Bien que la plupart des compilateurs Java utilisent actuellement la chaîne StringBuilder , il n’est pas précisé que cela devrait toujours être ainsi. En particulier, il est proposé de changer radicalement cette situation dans Java-9 en remplaçant par l'appel unique invokedynamic et en introduisant une nouvelle métafabrique qui générera un MethodHandle approprié pour l'exécution de la concaténation.

2voto

Paulo Madeira Points 1986

Comme pour la langue, non, il n'est pas extensible. C'est un comportement spécifique, aucune autre classe étend la + de l'opérateur.

Pour savoir où cela est fait, recherche pour l' string_add (pas une vraie JVM op) dans les fichiers suivants:


Pourquoi, Java était censé être simple, ou au moins plus simple que le C++, et une base de chose, comme la manipulation de la chaîne était obligatoire. Cependant, la surcharge d'opérateur serait ajouter de la complexité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X