CharSequence VS String en Java?

programmation dans Android, la plupart des valeurs du texte sont attendues dans CharSequence .

pourquoi? Quel est l'avantage et quels sont les principaux effets de l'utilisation de CharSequence au-dessus de String ?

Quelles sont les principales différences, et quelles questions sont attendus, tout en les utilisant, et de convertir de l'un à l'autre?

380
demandé sur Basil Bourque 2009-06-26 17:43:37

9 réponses

les Chaînes sont CharSequences , de sorte que vous pouvez simplement utiliser des Chaînes et ne pas s'inquiéter. Android est simplement essayer d'être utile en vous permettant de spécifier également D'autres objets CharSequence, comme StringBuffers.

317
répondu Zarkonnen 2011-09-25 16:07:26

ce diagramme de classe peut vous aider à voir la grande image des types de chaînes de caractères en Java 7/8. Je ne suis pas sûr si tous ceux-ci sont présents dans Android, mais le contexte général peut encore se révéler utile pour vous.

aussi, notez les commentaires faits sur le réponse acceptée . L'interface CharSequence a été modernisée sur les structures de classe existantes, il ya donc quelques subtilités importantes( equals() & hashCode() ). Notez les différentes versions de Java (1, 2, 4 & 5) marqués sur les classes/interfaces-assez peu de roulement au fil des ans. Idéalement CharSequence aurait été en place dès le début, mais telle est la vie.

diagram of various string-related classes and interfaces

36
répondu Basil Bourque 2017-05-23 12:26:27

je pense qu'il est préférable d'utiliser CharSequence. La raison en est que String implémente CharSequence, donc vous pouvez passer une chaîne dans une CharSequence, mais vous ne pouvez pas passer une CharSequence dans une chaîne, car CharSequence n'implémente pas la chaîne. En outre, dans Android, la méthode EditText.getText() renvoie un éditable, qui implémente également CharSequence et peut être passé facilement dans un, mais pas facilement dans une chaîne. CharSequence s'occupe de tout!

34
répondu Sham 2012-04-05 14:35:46

en général, l'utilisation d'une interface vous permet de modifier l'implémentation avec un minimum de dommages collatéraux. Bien que java.lang.Les chaînes de caractères sont très populaires il peut être possible que dans certains contextes on veuille utiliser une autre implémentation. En construisant l'API autour des CharSequences plutôt que des chaînes, le code donne l'occasion de le faire.

21
répondu Itay Maman 2009-06-26 13:45:59

ce sont presque certainement des raisons de performance. Par exemple, imaginez un analyseur qui passe par un ByteBuffer de 500k contenant des chaînes.

il y a 3 approches pour retourner le contenu de la chaîne:

  1. construisez une chaîne de caractères[] au moment de l'analyse, un caractère à la fois. Cela va prendre un certain temps. Nous pouvons utiliser == au lieu de .égal pour comparer des références cachées.

  2. Construisez Un int [] avec des offsets au moment de l'analyse, puis construisez dynamiquement une chaîne quand un get() arrive. Chaque chaîne sera un nouvel objet, donc aucune valeur de cache retournée et en utilisant = =

  3. Construire un CharSequence[] au moment de l'analyse. Comme aucune nouvelle donnée n'est stockée (autre que des offsets dans le tampon byte), l'analyse est beaucoup plus faible que #1. À get time, nous n'avons pas besoin de construire une chaîne de caractères, alors get performance est égal à #1 (bien mieux que #2), car nous ne retournons qu'un référence à un objet existant.

en plus des gains de traitement que vous obtenez en utilisant CharSequence, vous réduisez également l'empreinte mémoire en ne dupliquant pas les données. Par exemple, si vous avez un tampon contenant 3 paragraphes de texte, et que vous voulez retourner les 3 ou un seul paragraphe, vous avez besoin de 4 Chaînes pour représenter ceci. En utilisant CharSequence vous n'avez besoin que d'un tampon avec les données, et de 4 instances D'une implémentation CharSequence qui suit le début et durée.

8
répondu Phil Lello 2017-01-17 02:36:44

un problème qui se pose dans la pratique Code Android est que les comparer avec CharSequence.égale est valide mais ne fonctionne pas nécessairement comme prévu.

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

Comparaison doit être faite par

("OK").contentEquals(t.GetText()); 
7
répondu Crypth 2014-11-19 09:36:45

CharSequence

Un CharSequence est une interface, pas une classe réelle. Une interface est un ensemble de règles (méthodes) d'une classe doit contenir si elle implémente l'interface. Dans Android un CharSequence est un parapluie pour différents types de chaînes de texte. Voici quelques-uns des plus communs:

(vous pouvez en savoir plus sur les différences entre ces ici .)

si vous avez un objet CharSequence , alors il est en fait un objet d'une des classes qui implémentent CharSequence . Par exemple:

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

l'avantage d'avoir un type de parapluie général comme CharSequence est que vous pouvez manipuler plusieurs types avec une seule méthode. Par exemple, si j'ai une méthode qui prend un CharSequence comme paramètre, je pourrais passer dans un String ou un SpannableStringBuilder et il traiterait l'un ou l'autre.

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

Chaîne

on pourrait dire qu'un String n'est qu'une sorte de CharSequence . Cependant, contrairement à CharSequence , c'est une classe réelle, donc vous pouvez en faire des objets. Donc vous pouvez faire ceci:

String myString = new String();

mais vous ne pouvez pas faire cela:

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

puisque CharSequence n'est qu'une liste de règles auxquelles String se conforme, vous pouvez faire ceci:

CharSequence myString = new String();

cela signifie que chaque fois qu'une méthode demande un CharSequence , il est bien de lui donner un String .

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

// ...

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

cependant, le contraire n'est pas vrai. Si la méthode prend un paramètre String , vous ne pouvez pas lui passer quelque chose qui est généralement connu pour être un CharSequence , parce qu'il pourrait en fait être un SpannableString ou une autre sorte de CharSequence .

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

// ...

public int getLength(String text) {
    return text.length();
}
1
répondu Suragch 2017-11-10 11:45:46

CharSequence est une interface et String l'implémente. Vous pouvez instancier un String mais vous ne pouvez pas le faire pour CharSequence car c'est une interface. Vous pouvez trouver d'autres implémentations dans CharSequence sur le site officiel Java.

-1
répondu Xiaogang 2017-08-29 12:44:23

CharSequence est lisible une séquence de char valeurs qui met en Chaîne. il a 4 méthodes

  1. charAt (int index)
  2. length ()
  3. subSequence (int start, int end)
  4. toString ()

s'il vous Plaît se référer à la documentation CharSequence documentation

-4
répondu Srinivas Thammanaboina 2016-09-28 16:57:51