Sind Java String Objects ein Array von Zeichen?

8

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 ...

JLS 10.9

  

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.

JLS 4.3.3

  

4.3.3 Die Klassen-String-Instanzen der Klasse String repräsentieren Sequenzen von Unicode-Code-Punkten.

    
Eddie B 02.11.2012, 19:47
quelle

1 Antwort

17
  

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:

  • A char[] enthält die tatsächlichen Zeichen
  • Ein Startindex in das Array
  • Eine Länge
  • Ein zwischengespeicherter Hash-Code, faul berechnet

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.

    
Jon Skeet 02.11.2012, 19:50
quelle

Tags und Links