Question

Programmation sous Android, la plupart des valeurs de texte sont attendues dans CharSequence.

Pourquoi ça? Quel est l'avantage et quels sont les principaux impacts de l'utilisation de String sur <=>?

Quelles sont les principales différences et quels problèmes sont attendus lors de leur utilisation et de la conversion de l'un à l'autre?

Était-ce utile?

La solution

Les chaînes sont des séquences de caractères , de sorte que peut simplement utiliser des chaînes et ne pas s'inquiéter. Android tente simplement d’être utile en vous permettant de spécifier également d’autres objets CharSequence, tels que StringBuffers.

Autres conseils

Ce diagramme de classes peut vous aider à avoir une vue d'ensemble des types de chaînes dans Java 7/8. Je ne sais pas si tout cela est présent dans Android, mais le contexte général peut encore vous être utile.

Notez également les commentaires formulés dans la réponse acceptée . L’interface CharSequence ayant été adaptée aux structures de classe existantes, certaines subtilités sont importantes (equals() & Et <;>). Notez les différentes versions de Java (1, 2, 4 & Et 5) balisées sur les classes / interfaces & # 8212, ce qui a provoqué beaucoup de déséquilibre au fil des ans. Idéalement, hashCode() aurait été en place depuis le début, mais telle est la vie.

diagramme de diverses classes et interfaces liées aux chaînes

Je pense qu'il est préférable d'utiliser CharSequence. La raison en est que String implémente CharSequence. Par conséquent, vous pouvez passer d'une chaîne à une CharSequence. CEPENDANT, vous ne pouvez pas transmettre une CharSequence à une chaîne, car CharSequence ne l'implémente pas. ALSO, sous Android, la méthode EditText.getText() renvoie une variable Editable, qui implémente également CharSequence et peut être facilement passée en une seule, mais pas facilement en une chaîne. CharSequence gère tout!

En général, l’utilisation d’une interface vous permet de faire varier l’implémentation avec un minimum de dommages collatéraux. Bien que java.lang.String soit très populaire, il est possible que, dans certains contextes, on veuille utiliser une autre implémentation. En construisant l'API autour de CharSequences plutôt que de chaînes, le code donne l'occasion de le faire.

Ce sont presque certainement des raisons de performance. Par exemple, imaginez un analyseur qui parcourt un ByteBuffer de 500 Ko contenant des chaînes.

Il existe 3 méthodes pour renvoyer le contenu de la chaîne:

  1. Construisez une chaîne [] au moment de l'analyse, un caractère à la fois. Cela prendra un temps considérable. Nous pouvons utiliser == au lieu de .equals pour comparer les références en cache.

  2. Construisez un int [] avec des décalages au moment de l'analyse, puis construisez dynamiquement String quand un get () se produit. Chaque chaîne sera un nouvel objet, donc aucune mise en cache des valeurs renvoyées et en utilisant ==

  3. Construisez un CharSequence [] au moment de l'analyse. Etant donné qu'aucune nouvelle donnée n'est stockée (autres que les décalages dans la mémoire tampon d'octets), l'analyse est beaucoup plus basse que # 1. Au moment d’obtenir Get, nous n’avons pas besoin de créer une chaîne. Les performances sont donc égales à # 1 (bien mieux que n ° 2), car nous ne renvoyons une référence qu’à un objet existant.

Outre les gains de traitement obtenus grâce à CharSequence, vous réduisez également l'encombrement de la 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 renvoyer tous les 3 ou un seul paragraphe, vous avez besoin de 4 chaînes pour le représenter. Avec CharSequence, vous n’avez besoin que d’un tampon avec les données et de 4 instances d’une implémentation CharSequence permettant de suivre le début et la longueur.

Un problème qui se pose dans le code Android pratique est que leur comparaison avec CharSequence.equals 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.

La comparaison doit être faite par

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

Séquence de caractères

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

(Pour en savoir plus sur les différences entre ces cliquez ici .)

Si vous avez un objet <=>, il s'agit en fait d'un objet d'une des classes qui implémente <=>. Par exemple:

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

L’avantage d’avoir un type de parapluie général tel que <=> est que vous pouvez gérer plusieurs types avec une seule méthode. Par exemple, si j’ai une méthode qui prend un <=> en tant que paramètre, je pourrais passer un <=> ou un <=> et elle gérera l’une ou l’autre.

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

Chaîne

Vous pouvez dire qu'un <=> n'est qu'un. genre de <=>. Cependant, contrairement à <=>, c'est une classe réelle, vous pouvez donc en faire des objets. Pour que vous puissiez faire ceci:

String myString = new String();

mais vous ne pouvez pas faire ceci:

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

Etant donné que <=> n'est qu'une liste de règles auxquelles <=> se conforme, vous pouvez le faire:

CharSequence myString = new String();

Cela signifie que chaque fois qu'une méthode demande un <=>, il convient de lui donner un <=>.

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 <=>, vous ne pouvez pas lui transmettre quelque chose qui est généralement considéré comme un <=>, car il peut s'agir en fait d'un <=> ou d'un autre type de <=>.

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

// ...

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

CharSequence est une interface et String l'implémente. Vous pouvez instancier un <=> mais vous ne pouvez pas le faire pour <=> car il s'agit d'une interface. Vous pouvez trouver d'autres implémentations dans <=> sur le site Web officiel de Java.

CharSequence est une séquence lisible de valeurs de caractères qui implémente String. il a 4 méthodes

  1. charAt (int index)
  2. longueur ()
  3. sous-séquence (int start, int end)
  4. toString ()

Veuillez vous reporter à la documentation documentation CharSequence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top