Ich bin neu in Java und versuche, die Grundlagen und Grundlagen der Sprache zu verstehen.
Ist es richtig zu sagen, dass Java-String-Objekte intrinsisch eine Klasse sind, die als unveränderliches Array von Zeichen definiert ist?
Ich frage dies, weil ich etwas verwirrt bin über die Spezifikation im Vergleich zu Char-Arrays und der String-Klasse ...
10.9 Ein Array von Zeichen ist kein String In der Java-Programmiersprache ist im Gegensatz zu C ein Array von Zeichen kein String, und weder ein String noch ein Array von Zeichen wird durch '\ u0000' (das NUL Charakter). Ein String-Objekt ist unveränderlich, dh sein Inhalt ändert sich nie, während ein Array von Char hat veränderbare Elemente. Die Methode toCharArray in der Klasse String gibt ein Array von Zeichen zurück, die enthalten die gleiche Zeichenfolge wie ein String. Die Klasse StringBuffer implementiert nützlich Methoden auf veränderbaren Arrays von Zeichen.
4.3.3 Die Klassen-String-Instanzen der Klasse String repräsentieren Sequenzen von Unicode-Code-Punkten.
Stimmt es, dass Java-String-Objekte intrinsisch eine Klasse sind, die als unveränderliches Array von Zeichen definiert ist?
Nein. Ein Java-String-Objekt ist (derzeit - es ist ein Implementierungsdetail, das ich möglicherweise ändere) eine Klasse , die einige Felder enthält:
char[]
enthält die tatsächlichen Zeichen Der Grund für den Index und die Länge ist, dass mehrere Strings Verweise auf das gleiche char[]
enthalten können. Dies wird von einigen Operationen wie substring
(in vielen Implementierungen sowieso) verwendet.
Wichtig ist jedoch die API für String
, die sich stark von der API für ein Array unterscheidet. Es ist die API, an die Sie denken würden, wenn Sie die JLS-Definition berücksichtigen: a String
steht für eine Folge von Unicode-Codepunkten. Sie können also eine Subsequenz ( Substring
) verwenden, eine bestimmte Subsequenz ( indexOf
) finden, in eine Großbuchstabe konvertieren usw.
Tatsächlich wäre die JLS etwas genauer, um sie als Sequenz von UTF-16-Code-Einheiten zu bezeichnen; Es ist durchaus möglich, eine Zeichenfolge zu konstruieren, die keine gültige Sequenz von Unicode-Codepunkten ist, z. indem man die Hälfte eines "Ersatzpaars" von UTF-16-Code-Einheiten enthält, aber nicht die andere. Es gibt Teile der API, die tun mit dem String
in Bezug auf Code-Einheiten umgehen, aber ehrlich gesagt meisten Entwickler verbringen am meisten der Zeit Strings so behandeln, als ob Nicht-BMP-Zeichen nicht existierten.