Frage

Programmierung in Android, sind die meisten der Textwerte in CharSequence erwartet.

Warum ist das so? Was ist der Vorteil, und was sind die wichtigsten Auswirkungen von CharSequence über String mit?

Was sind die wichtigsten Unterschiede und welche Probleme zu erwarten sind, während sie verwendet wird, und von einem zum anderen konvertieren?

War es hilfreich?

Lösung

Strings sind CharSequences , so dass Sie kann nur Strings verwenden und sich keine Sorgen. Android ist nur versuchen, hilfreich zu sein, indem Sie auch andere CharSequence Objekte angeben, wie Stringbuffers.

Andere Tipps

Dieses Klassendiagramm kann man das große Bild von String-Typen in Java 8.7 sehen kann. Ich bin mir nicht sicher, ob alle diese in Android vorhanden sind, aber der Gesamtkontext können Sie immer noch als nützlich erweisen.

Beachten Sie auch, die auf der akzeptiert Antwort Kommentare hinzugefügt. Die CharSequence Schnittstelle wurde auf bestehende Klassenstrukturen nachgerüstet, so gibt es einige wichtige Feinheiten (equals() & hashCode()). Beachten Sie die verschiedenen Versionen von Java (1, 2, 4 und 5) markiert auf die Klassen / Schnittstellen-ziemlich viel Churn im Laufe der Jahre. Idealer CharSequence an Ort und Stelle gewesen, von Anfang an würde, aber so ist das Leben.

Diagramm verschiedener String bezogenen Klassen und Schnittstellen

Ich glaube, es ist am besten CharSequence zu verwenden. Der Grund dafür ist, dass String CharSequence implementiert, damit Sie einen String in einen CharSequence passieren kann, aber man kann nicht einen CharSequence in einen String übergeben, wie CharSequence nicht nicht String implementieren. in Android ALSO, gibt die EditText.getText() Methode, um eine bearbeitbare, die auch CharSequence implementiert und kann leicht in eine, wenn auch nicht leicht in einen String übergeben werden. CharSequence behandelt alle!

In der Regel über eine Schnittstelle können Sie die Implementierung mit minimalen Kollateralschäden variieren. Obwohl java.lang.String super beliebt sind, kann es möglich sein, dass in bestimmten Kontexten kann eine andere Implementierung verwenden möchten. Mit dem Bau der API um CharSequences anstatt Strings der Code gibt einem die Möglichkeit, das zu tun.

Dies ist fast sicher aus Performance-Gründen. Zum Beispiel vorstellen, einen Parser, der ein 500k ByteBuffer geht durch Zeichenketten enthalten.

Es gibt drei Ansätze, um den String Inhalt Rückkehr:

  1. Erstellen Sie eine String [] zur Analysezeit, um ein Zeichen zu einem Zeitpunkt. Dies wird eine beachtliche Menge Zeit in Anspruch nehmen. Wir verwenden == statt .equals im Cache gespeicherte Referenzen zu vergleichen.

  2. Erstellen Sie eine int [] mit Offsets zur Analysezeit, dann String dynamisch erstellen, wenn ein get () passiert. Jeder String wird ein neues Objekt sein, so dass keine Zwischenspeicherung zurückgegebenen Werte und mit ==

  3. Erstellen Sie eine CharSequence [] zur Analysezeit. Da keine neuen Daten (andere als Offsets in den Byte-Puffer) gespeichert sind, ist das Parsen viel geringer, dass 1 #. Zu get Zeit, brauchen wir nicht einen String zu bauen, so erhalten die Leistung gleich # 1 (viel besser als 2 #), wie wir nur einen Verweis auf ein vorhandenes Objekt zurück.

Neben der Verarbeitung erhält man CharSequence bekommen verwenden, verringern Sie auch den Speicherbedarf von Daten nicht zu duplizieren. Zum Beispiel, wenn Sie einen Puffer mit 3 Textabsätze haben und entweder alle 3 oder einen einzelnen Absatz zurückkehren möchten, müssen Sie 4 Strings dies darzustellen. Mit CharSequence Sie benötigen nur 1 Puffer mit den Daten und 4 Instanzen einer CharSequence Implementierung, die den Anfang und Länge verfolgt.

Ein Thema, das in der Praxis Android Code entsteht, ist, dass sie mit CharSequence.equals Vergleich gültig ist, aber nicht notwendigerweise wie vorgesehen.

EditText t = (EditText )getView(R.id.myEditText); // Contains "OK"
Boolean isFalse = t.getText().equals("OK"); // will always return false.

Vergleich sollte durch

gemacht werden
("OK").contentEquals(t.GetText()); 

CharSequence

CharSequence ist eine Schnittstelle, nicht eine tatsächliche Klasse. Eine Schnittstelle ist nur ein Satz von Regeln (Methoden), dass eine Klasse enthalten muss, wenn er die Schnittstelle implementiert. In Android ist ein CharSequence ein Regenschirm für verschiedene Arten von Text-Strings. Hier sind einige der gebräuchlichsten:

(Sie können mehr über die Unterschiede zwischen diesen hier .)

Wenn Sie ein CharSequence Objekt haben, dann ist es eigentlich eine Aufgabe einer der Klassen, die CharSequence implementieren. Zum Beispiel:

CharSequence myString = "hello";
CharSequence mySpannableStringBuilder = new SpannableStringBuilder();

Der Nutzen eines allgemeinen Umbrella wie CharSequence zu haben, ist, dass Sie mehrere Typen mit einer einzigen Methode verarbeiten kann. Zum Beispiel, wenn ich eine Methode, die ein CharSequence als Parameter annimmt, konnte ich in einem String oder einem SpannableStringBuilder passieren und es würde entweder ein handhaben.

public int getLength(CharSequence text) {
    return text.length();
}

String

Man könnte sagen, dass ein String ist nur eine Art von CharSequence. Doch im Gegensatz zu CharSequence, es ist eine tatsächliche Klasse, so dass man Objekte daraus machen. So könnten Sie dies tun:

String myString = new String();

Sie können dies aber nicht tun:

CharSequence myCharSequence = new CharSequence(); // error: 'CharSequence is abstract; cannot be instantiated

Da CharSequence nur eine Liste von Regeln, die String entspricht, könnten Sie dies tun:

CharSequence myString = new String();

Das bedeutet, dass jedes Mal, wenn ein Verfahren für eine CharSequence fragt, es ist in Ordnung, ihm eine String zu geben.

String myString = "hello";
getLength(myString); // OK

// ...

public int getLength(CharSequence text) {
    return text.length();
}

Allerdings ist das Gegenteil nicht wahr. Wenn das Verfahren einen String Parameter annimmt, können Sie es nicht etwas passieren, die nur allgemein bekannt ist, ein CharSequence zu sein, weil es eigentlich eine SpannableString oder eine andere Art von CharSequence sein könnte.

CharSequence myString = "hello";
getLength(myString); // error

// ...

public int getLength(String text) {
    return text.length();
}

CharSequence ist eine Schnittstelle und String implementiert es. Sie können eine String instanziiert, aber man konnte, dass für CharSequence nicht tun, da es sich um eine Schnittstelle ist. Sie können andere Implementierungen in CharSequence in der offiziellen Java-Website finden.

CharSequence ist eine lesbare Sequenz von char Werte, die String implementiert. es verfügt über 4 Methoden

  1. charAt (int index)
  2. length ()
  3. Teilfolge (int Start, int end)
  4. toString ()

Bitte beachten Dokumentation CharSequence Dokumentation

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top