¿CharSequence VS cadena en Java?

Resuelto Bite code asked hace 15 años • 9 respuestas

Al programar en Android, la mayoría de los valores de texto se esperan en formato CharSequence.

¿Porqué es eso? ¿Cuál es el beneficio y cuáles son los principales impactos del uso CharSequenceexcesivo String?

¿Cuáles son las principales diferencias y qué problemas se esperan al usarlos y al convertir de uno a otro?

Bite code avatar Jun 26 '09 20:06 Bite code
Aceptado

Las cadenas son CharSequences , por lo que puedes usar cadenas y no preocuparte. Android simplemente intenta ser útil permitiéndole especificar también otros objetos CharSequence, como StringBuffers.

Zarkonnen avatar Jun 26 '2009 13:06 Zarkonnen

CharSequence= interfaz
String= implementación concreta

  • CharSequencees una interfaz .
  • Varias clases implementan esta interfaz.
    • Stringes una de esas clases, una implementación concreta de CharSequence.

Usted dijo:

convirtiendo de uno a otro

No hay conversión de String.

  • Cada Stringobjeto es un CharSequence.
  • Cada uno CharSequencepuede producir un String. Llamar CharSequence::toString. Si CharSequenceresulta ser a String, entonces el método devuelve una referencia a su propio objeto.

En otras palabras, cada Stringes un CharSequence, pero no cada CharSequencees un String.

Programación en una interfaz

Al programar en Android, la mayoría de los valores de texto se esperan en CharSequence.

¿Porqué es eso? ¿Cuál es el beneficio y cuáles son los principales impactos del uso de CharSequence sobre String?

Generalmente, programar en una interfaz es mejor que programar en clases concretas. Esto genera flexibilidad, por lo que podemos cambiar entre implementaciones concretas de una interfaz particular sin romper otro código.

Al desarrollar una API para que la utilicen varios programadores en diversas situaciones, escriba su código para dar y recibir las interfaces más generales posibles. Esto le da al programador que llama la libertad de utilizar varias implementaciones de esa interfaz, la que sea mejor para su contexto particular.

Por ejemplo, mire el marco de colecciones de Java . Si su API proporciona o recibe una colección ordenada de objetos, declare que sus métodos usan Listen lugar de ArrayList, LinkedListo cualquier otra implementación de terceros de List.

Al escribir un pequeño método rápido y sucio para que su código lo use solo en un lugar específico, en lugar de escribir una API para usarla en múltiples lugares, no necesita molestarse en usar la interfaz más general en lugar de una concreta específica. clase. Pero incluso entonces, duele usar la interfaz más general posible.

¿Cuáles son las principales diferencias y qué problemas se esperan al utilizarlos?

  • Con un Stringsabes que tienes un solo fragmento de texto, completamente en la memoria y que es inmutable.
  • Con a CharSequence, no sabes cuáles podrían ser las características particulares de la implementación concreta.

El CharSequenceobjeto podría representar una enorme porción de texto y, por lo tanto, tiene implicaciones para la memoria. O pueden haber muchos fragmentos de texto rastreados por separado que deberán unirse cuando llame toStringy, por lo tanto, tengan problemas de rendimiento. La implementación puede incluso recuperar texto de un servicio remoto y, por lo tanto, tiene implicaciones de latencia.

y convertir de uno a otro?

Por lo general, no realizarás conversiones de un lado a otro. A String es un CharSequence. Si su método declara que requiere un CharSequence, el programador que realiza la llamada puede pasar un Stringobjeto o algo más, como un StringBuffero StringBuilder. El código de su método simplemente usará lo que se pase, llamando a cualquiera de los CharSequencemétodos.

Lo más cerca que estarás de convertir es si tu código recibe un CharSequencey sabes que necesitas un archivo String. Quizás esté interactuando con código antiguo escrito en Stringla clase en lugar de escrito en la CharSequenceinterfaz. O tal vez su código trabaje intensamente con el texto, como bucles repetidos o análisis de otro modo. En ese caso, deseas recibir cualquier posible impacto en el rendimiento solo una vez, por lo que llamas toStringpor adelantado. Luego continúa con tu trabajo usando lo que sabes que es un solo fragmento de texto completamente en la memoria.

Historia retorcida

Tenga en cuenta los comentarios realizados sobre la respuesta aceptada . La CharSequenceinterfaz se adaptó a las estructuras de clases existentes, por lo que hay algunas sutilezas importantes ( equals()& hashCode()). Observe las diversas versiones de Java (1, 2, 4 y 5) etiquetadas en las clases/interfaces: bastante rotación a lo largo de los años. Lo ideal CharSequencesería que hubiera estado ahí desde el principio, pero así es la vida.

El siguiente diagrama de clases puede ayudarle a ver el panorama general de los tipos de cadenas en Java 7/8. No estoy seguro de si todos estos están presentes en Android, pero el contexto general aún puede resultarle útil.

diagrama de varias clases e interfaces relacionadas con cadenas

Basil Bourque avatar Jul 01 '2015 18:07 Basil Bourque

Creo que es mejor utilizar CharSequence. La razón es que String implementa CharSequence, por lo tanto, puede pasar un String a un CharSequence, SIN EMBARGO, no puede pasar un CharSequence a un String, ya que CharSequence no implementa String. ADEMÁS, en Android el EditText.getText()método devuelve un Editable, que también implementa CharSequence y se puede pasar fácilmente a uno, aunque no fácilmente a un String. ¡CharSequence se encarga de todo!

Sham avatar Oct 27 '2010 02:10 Sham