Was ist die Mechanik hinter Java, die String-Literale automatisch als String-Objekte interpretiert, da es keine überladenen Operatoren gibt und keine Standardunterstützung für Low-Level-String-Puffer (ohne den High-Level-StringBuffer)? Ist dies ein Kontext für eine Sprache oder eine virtuelle Maschine?
Es ist ein wenig von beidem.
Die JVM hat Bytecodes zum Laden Stringliterale auf dem Laufzeitstapel, und diese Opcodes sind in der JVM-Spezifikation spezifiziert durch Drücken eines entsprechend konstruierten String-Objekt auf den Stapel, deren Inhalt gleich einem Stringliteral spezifiziert in der arbeiten, Klassendatei. Es gibt keine Spezifikation, wie dies andere getan wird, als dass das String-Objekt gebracht werden muß, was bedeutet, dass die Transformation Umsetzung spezifisch.
Auf dem Sprachniveau kann der Compiler behandelt von Stringliteralen es sieht als komplettes String-Objekt für die Zwecke der Typprüfung und kann dann nur die wörtliche schreiben und die entsprechenden Bytecode in die Klassendatei.
Java hat tatsächlich ein paar überladene Operatoren. Zum Beispiel kann +
auf String-Objekte sowie auf Int, Float und andere numerische Typen angewendet werden. In jedem Fall wird der Rückgabetyp durch den Typ des Ausdrucks auf jeder Seite von +
definiert. Alle überladenen Operatoren sind jedoch in der Sprache vordefiniert. Programmierer haben keinen Mechanismus in der Sprache, um andere zu definieren. Einzelheiten finden Sie in der Sprachspezifikation .
Grundsätzlich schreibt der Compiler Ihren Code um.
%Vor%Für die Verkettung ist es nur syntaktischer Zucker für die StringBuffer Append-Methode, dh:
%Vor%wird wie folgt kompiliert:
%Vor%Jetzt für ein einzelnes Concat ist dies ein Objekt erstellt und 2 Methodenaufrufe. Wenn Sie also eine sehr lange Zeichenfolge innerhalb einer Schleife erstellen, ist es viel effizienter zu schreiben:
%Vor%anstatt:
%Vor%Bearbeiten: falscher Codebeispiel entfernt ...