CharSequence
= Schnittstelle
String
= konkrete Umsetzung
Sie sagten:
Umwandlung von einem zum anderen
Es gibt keine Konvertierung von String
.
Mit anderen Worten, jeder String
es un CharSequence
, aber nicht jeder CharSequence
es un String
.
Programmierung an einer Schnittstelle
Bei der Programmierung in Android werden die meisten Textwerte in CharSequence erwartet.
Warum ist das so? Was ist der Vorteil und was sind die wichtigsten Auswirkungen der Verwendung von CharSequence gegenüber String?
Im Allgemeinen ist die Programmierung für eine Schnittstelle besser als die Programmierung für konkrete Klassen. Dies führt zu Flexibilität, so dass wir zwischen konkreten Implementierungen einer bestimmten Schnittstelle wechseln können, ohne anderen Code zu zerstören.
Bei der Entwicklung eines API von verschiedenen Programmierern in verschiedenen Situationen verwendet werden soll, schreiben Sie Ihren Code so, dass er möglichst allgemeine Schnittstellen bietet und nutzt. Dies gibt dem aufrufenden Programmierer die Freiheit, verschiedene Implementierungen dieser Schnittstelle zu verwenden, je nachdem, welche Implementierung für seinen speziellen Kontext am besten geeignet ist.
Sehen Sie sich zum Beispiel die Java Collections Framework . Wenn Ihre API eine geordnete Sammlung von Objekten bereitstellt oder entgegennimmt, deklarieren Sie Ihre Methoden als mit List
statt ArrayList
, LinkedList
oder eine andere Implementierung von Drittanbietern von List
.
Wenn Sie eine kleine, schnelle Methode schreiben, die nur von Ihrem Code an einer bestimmten Stelle verwendet werden soll, im Gegensatz zum Schreiben einer API, die an mehreren Stellen verwendet werden soll, brauchen Sie sich nicht mit der Verwendung der allgemeineren Schnittstelle anstelle einer bestimmten konkreten Klasse zu befassen. Aber selbst dann schadet es nicht, die allgemeinste Schnittstelle zu verwenden, die es gibt.
Worin bestehen die Hauptunterschiede, und welche Probleme sind bei ihrer Verwendung zu erwarten?
- Mit einem
String
Sie wissen, dass Sie einen einzigen Text haben, der sich vollständig im Speicher befindet und unveränderlich ist.
- Mit einem
CharSequence
Sie wissen nicht, was die Besonderheiten der konkreten Implementierung sein könnten.
En CharSequence
Objekt kann einen riesigen Textbrocken darstellen und hat daher Auswirkungen auf den Speicher. Oder es kann sich um viele Textstücke handeln, die separat verfolgt werden und die zusammengefügt werden müssen, wenn Sie toString
und hat daher Leistungsprobleme. Die Implementierung kann sogar Text von einem entfernten Dienst abrufen und hat daher Auswirkungen auf die Latenzzeit.
und die Umwandlung von einem zum anderen?
Im Allgemeinen werden Sie nicht hin und her konvertieren. A String
ist a CharSequence
. Wenn Ihre Methode deklariert, dass sie eine CharSequence
kann der aufrufende Programmierer eine String
Objekt, oder kann etwas anderes übergeben, wie zum Beispiel ein StringBuffer
o StringBuilder
. Der Code Ihrer Methode verwendet einfach das, was übergeben wurde, und ruft eine der CharSequence
Methoden.
Am ehesten kämen Sie einer Umwandlung nahe, wenn Ihr Code eine CharSequence
und Sie wissen, dass Sie eine String
. Vielleicht haben Sie eine Schnittstelle zu altem Code, der für String
Klasse und nicht in die CharSequence
Schnittstelle. Oder vielleicht arbeitet Ihr Code intensiv mit dem Text, z. B. durch wiederholte Schleifen oder andere Analysen. In diesem Fall wollen Sie alle möglichen Leistungseinbußen nur einmal in Kauf nehmen, also rufen Sie toString
Vorne. Fahren Sie dann mit Ihrer Arbeit fort, indem Sie das, was Sie als einen einzigen Text kennen, vollständig aus dem Gedächtnis abrufen.
Verdrehte Geschichte
Beachten Sie die Kommentare zur akzeptierte Antwort . Die CharSequence
Schnittstelle wurde nachträglich in bestehende Klassenstrukturen eingebaut, so dass es einige wichtige Feinheiten gibt ( equals()
& hashCode()
). Beachten Sie die verschiedenen Java-Versionen (1, 2, 4 und 5), die auf den Klassen/Schnittstellen vermerkt sind - da hat sich im Laufe der Jahre so einiges getan. Idealerweise CharSequence
wäre von Anfang an vorhanden gewesen, aber so ist das Leben.
Mein Klassendiagramm unten kann Ihnen helfen, das Gesamtbild der Stringtypen in Java 7/8 zu sehen. Ich bin mir nicht sicher, ob alle diese Typen in Android vorhanden sind, aber der Gesamtzusammenhang kann sich für Sie als nützlich erweisen.
![diagram of various string-related classes and interfaces]()
1 Stimmen
Bessere Antworten finden Sie unter Genauer Unterschied zwischen CharSequence und String in Java