449 votes

CharSequence VS Chaîne en Java?

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

Pourquoi donc? Quel est le bénéfice, et quels sont les principaux impacts de l'utilisation de CharSequence sur String?

Quelles sont les principales différences, et quels sont les problèmes attendus, en les utilisant, et en les convertissant de l'un à l'autre?

353voto

Zarkonnen Points 11086

Les chaînes sont des CharSequences , donc vous pouvez simplement utiliser des chaînes et ne pas vous inquiéter. Android essaie simplement d'être utile en vous permettant de spécifier également d'autres objets CharSequence, comme StringBuffers.

39voto

Sham Points 139

Je crois qu'il est préférable d'utiliser CharSequence. La raison est que String implémente CharSequence, donc vous pouvez passer une String dans une CharSequence, CEPENDANT vous ne pouvez pas passer une CharSequence dans une String, car CharSequence n'implémente pas String. AUSSI, dans Android, la méthode EditText.getText() retourne un Editable, qui implémente aussi CharSequence et peut facilement être passé en un, alors que ce n'est pas facile dans une chaîne. CharSequence gère tout!

23voto

Itay Maman Points 15470

En général, l'utilisation d'une interface vous permet de 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, vous souhaitiez utiliser une autre implémentation. En construisant l'API autour de CharSequences plutôt que de Strings, le code donne l'opportunité de le faire.

8voto

Phil Lello Points 4582

Ce n'est presque certainement des raisons de performances. Imaginez, par exemple, un analyseur qui passe par un 500k ByteBuffer contenant des chaînes de caractères.

Il y a 3 approches à la restitution de la chaîne de contenu: 1. Construire 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 .est égal à comparer cache références.

  1. Construire un int[] avec des décalages au moment de l'analyse, puis de générer dynamiquement Chaîne lors d'un get() qui se passe. Chaque Chaîne sera un nouvel objet, donc pas de mise en cache les valeurs de retour et l'utilisation de ==

  2. Construire un CharSequence[] au moment de l'analyse. Depuis aucune nouvelle donnée n'est stockée (autres que les décalages dans le tampon d'octets), l'analyse est beaucoup plus faible que le #1. Dans le temps, nous n'avons pas besoin de construire une Chaîne, afin d'obtenir le rendement est égal à #1 (beaucoup mieux que le #2), comme nous ne sommes que de retourner une référence à un objet existant.

Outre le traitement des gains que vous obtenez en utilisant CharSequence, vous avez également de réduire l'empreinte mémoire par pas de duplication des données. Par exemple, si vous avez un tampon contenant 3 paragraphes de texte, et que vous voulez retourner tous les 3 ou un seul paragraphe, vous avez besoin de 4 Cordes pour représenter cette. À l'aide de CharSequence vous avez seulement besoin de 1 tampon avec les données, et 4 cas d'un CharSequence de mise en œuvre qui suit le début et la durée.

Phil Lello

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X