example java string charsequence

example - string java



¿CharSequence VS String en Java? (9)

Programando 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 ?

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


CharSequence

Un CharSequence es una interfaz, no una clase real. Una interfaz es solo un conjunto de reglas (métodos) que una clase debe contener si implementa la interfaz. En Android, CharSequence es un paraguas para varios tipos de cadenas de texto. Éstos son algunos de los más comunes:

(Puedes leer más sobre las diferencias entre estos here .)

Si tiene un objeto CharSequence , entonces es en realidad un objeto de una de las clases que implementa CharSequence . Por ejemplo:

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

La ventaja de tener un tipo general de paraguas como CharSequence es que puede manejar múltiples tipos con un solo método. Por ejemplo, si tengo un método que toma un CharSequence como un parámetro, podría pasar un String o un SpannableStringBuilder y manejaría cualquiera de los dos.

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

Cuerda

Se podría decir que un String es solo un tipo de CharSequence . Sin embargo, a diferencia de CharSequence , es una clase real, por lo que puede crear objetos a partir de ella. Para que pudieras hacer esto:

String myString = new String();

pero no puedes hacer esto

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

Dado que CharSequence es solo una lista de reglas que cumple String , puede hacer esto:

CharSequence myString = new String();

Eso significa que cada vez que un método solicite una CharSequence , está bien asignarle un String .

String myString = "hello"; getLength(myString); // OK // ... public int getLength(CharSequence text) { return text.length(); }

Sin embargo, lo contrario no es cierto. Si el método toma un parámetro de String , no puede pasarle algo que generalmente solo se conoce como CharSequence , porque en realidad podría ser un SpannableString o algún otro tipo de CharSequence .

CharSequence myString = "hello"; getLength(myString); // error // ... public int getLength(String text) { return text.length(); }


CharSequence es una secuencia legible de valores char que implementa String. tiene 4 metodos

  1. charAt (índice int)
  2. longitud()
  3. subsecuencia (int inicio, int fin)
  4. Encadenar()

Por favor, consulte la documentación CharSequence documentación


Creo que es mejor usar CharSequence. La razón es que String implementa CharSequence, por lo tanto, puede pasar un String a una CharSequence, SIN EMBARGO, no puede pasar un CharSequence a una String, ya que CharSequence no implementa String. TAMBIÉN, en Android, el método EditText.getText() devuelve un Editable, que también implementa CharSequence y se puede pasar fácilmente a uno, mientras que no es fácil en una cadena. ¡CharSequence se encarga de todo!


En general, el uso de una interfaz le permite variar la implementación con un daño colateral mínimo. Aunque las java.lang.String son muy populares, puede ser posible que en ciertos contextos uno quiera usar otra implementación. Al construir la API alrededor de CharSequences en lugar de cadenas, el código le da a uno la oportunidad de hacerlo.


Este diagrama de clase puede ayudarlo a ver el panorama general de los tipos de cadena en Java 7/8. No estoy seguro de si todos estos están presentes en Android, pero el contexto general puede resultar útil para usted.

Además, tenga en cuenta los comentarios hechos en la respuesta aceptada . La interfaz de CharSequence se CharSequence a las estructuras de clase existentes, por lo que hay algunas sutilezas importantes ( equals() y hashCode() ). Observe las diversas versiones de Java (1, 2, 4 y 5) etiquetadas en las clases / interfaces, un poco de abandono a lo largo de los años. Idealmente, CharSequence habría estado en su lugar desde el principio, pero así es la vida.


Esto es casi seguro por razones de rendimiento. Por ejemplo, imagine un analizador que pasa por un ByteBuffer de 500k que contiene cadenas.

Hay 3 enfoques para devolver el contenido de la cadena:

  1. Construye una cadena [] a la vez, un carácter a la vez. Esto tomará una cantidad notable de tiempo. Podemos usar == en lugar de .equals para comparar referencias en caché.

  2. Cree un int [] con desplazamientos en el momento del análisis, luego genere String dinámicamente cuando ocurra un get (). Cada cadena será un objeto nuevo, por lo que no se almacenarán en caché los valores devueltos y se utilizarán ==

  3. Construye un CharSequence [] en tiempo de análisis. Dado que no se almacenan datos nuevos (aparte de las compensaciones en el búfer de bytes), el análisis es mucho menor que el # 1. En el momento de obtener, no necesitamos crear una Cadena, así que obtener el rendimiento es igual a # 1 (mucho mejor que # 2), ya que solo estamos devolviendo una referencia a un objeto existente.

Además de las ganancias de procesamiento que obtiene con CharSequence, también reduce la huella de memoria al no duplicar los datos. Por ejemplo, si tiene un búfer que contiene 3 párrafos de texto y desea devolver los 3 o un solo párrafo, necesita 4 cadenas para representarlo. Usando CharSequence solo necesita 1 búfer con los datos y 4 instancias de una implementación de CharSequence que rastrea el inicio y la duración.


Un problema que surge en el código práctico de Android es que compararlos con CharSequence.equals es válido, pero no funciona necesariamente como debe.

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

La comparación debe ser hecha por

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


Las cadenas son CharSequences , así que puedes usar cadenas y no preocuparte. Android simplemente intenta ser útil al permitirle también especificar otros objetos CharSequence, como StringBuffers.


CharSequence es una interfaz y String implementa. Puede crear una instancia de un String pero no puede hacer eso para CharSequence ya que es una interfaz. Puede encontrar otras implementaciones en CharSequence en el sitio web oficial de Java.