Red de conocimiento informático - Aprendizaje de programación - ¿Cuáles son las diferencias entre String, StringBuffere, StringBuilder y StringTokenizer en Java?

¿Cuáles son las diferencias entre String, StringBuffere, StringBuilder y StringTokenizer en Java?

Clase String

Clase String:

La clase java.lang.String, que no pertenece a los 8 tipos de datos básicos, String es un objeto que representa. una constante de cadena.

Debido a que el valor predeterminado de un objeto es nulo, el valor predeterminado de String también es nulo, pero es un tipo especial de objeto y tiene características que otros objetos no tienen.

New String() y new String("") declaran una nueva cadena vacía, que es una cadena vacía y no nula. Diferencia: a la cadena vacía se le asigna memoria a través del nuevo operador, es decir, realmente existe (definida). No hay (solo declaración) para nulo, y llamar al método de una cadena nula generará una excepción de puntero nulo.

Comprenda fundamentalmente la clase java.lang.String y el grupo de cadenas.

1. La clase String es definitiva y no se puede heredar. Cadena de clase final pública.

2. La esencia de la clase String es una matriz de caracteres char[] y su valor no se puede cambiar. valor de carácter final privado [];

3. Los objetos de clase String tienen un método de creación especial, como String x="abc" "abc" representa un objeto de cadena y x es "abc" La dirección; del objeto se llama referencia "abc".

4. El tiempo de ejecución de Java mantendrá un grupo de cadenas (grupo de cadenas). El contenido de la cadena en el grupo de cadenas no se puede repetir. Sin embargo, este grupo de búfer no existe para objetos generales (clases que no son cadenas). y el área de pila de objetos creados se usa solo para métodos.

5. Hay tres formas de crear una cadena:

<1> Utilice la nueva palabra clave para crear una cadena, String s = new String("abc");<. /p>

<2>, Especifique directamente, String s = "abc";

<3>, Utilice concatenación para generar una nueva cadena, String s = "ab" + "c";

Creación de un objeto de cadena:

1. Cuando se utiliza cualquier método para crear un objeto de cadena, la JVM utilizará este objeto para encontrar si hay caracteres con el mismo contenido en el. Grupo de cadenas. Objeto de cadena. Si no existe, cree una cadena en el grupo; de lo contrario, no la agregue al grupo.

2. En Java, siempre que utilice la nueva clase de palabra clave para crear un objeto, definitivamente se creará un nuevo objeto (en el área del montón o pila).

3. Si utiliza especificación directa o concatenación de cadenas pura para crear un objeto String, solo verificará y mantendrá la cadena en el grupo de cadenas. Si no hay ninguna cadena en el grupo, cree una en el. pool. Si lo hay, devolverá directamente alguna dirección de objeto de cadena (referencia). El objeto String nunca más se creará en la pila.

4. Utilice una expresión que contenga variables para crear un objeto String. No solo se verificará y mantendrá el grupo de String, sino que también se creará un objeto String en el área de la pila.

Inmutabilidad de la cadena:

Las cadenas inmutables tienen una gran ventaja: el compilador puede configurar la cadena para que sea única.

El tipo de cadena es inmutable, por ejemplo, cuando desea cambiar un objeto String, como por ejemplo:

String s = "abc";

s = " joder";

La JVM no cambiará el objeto original ("abc"), sino que generará un nuevo objeto String ("joder", por supuesto, primero verifique si ya existe una cadena "joder" en el objeto del grupo de cadenas (si existe, haga referencia a él; si no, créelo) y luego señalémoslo. Si el "abc" original no tiene ningún objeto que haga referencia a él, el mecanismo de recolección de basura de la máquina virtual lo recibirá. .

¡Esto puede mejorar la eficiencia operativa!

Nota: La comparación de contenidos de cadenas en Java utiliza métodos especiales como igual, compareTo, etc. == compara si las referencias de cadenas son las mismas.

Clase StringBuffer:

Variable de cadena. Secuencia de cadena modificable, el espacio de memoria de la entidad objeto de esta clase puede cambiar automáticamente el tamaño para facilitar el almacenamiento de una secuencia de caracteres variable.

La clase StringBuffer tiene 3 métodos de construcción:

StringBuffer()

StringBuffer(int size)

StirngBuffer(String s)

Cuando se utiliza el primer constructor sin parámetros, la capacidad inicial de la entidad asignada al objeto puede acomodar 16 caracteres. Cuando la longitud de la secuencia de caracteres extendida es >16, la capacidad de la entidad aumenta automáticamente para acomodar los nuevos. cadena de caracteres.

Al utilizar el segundo constructor, puede especificar que la capacidad inicial de la entidad asignada al objeto sea el número de caracteres especificados por el parámetro de tamaño. Aumenta automáticamente cuando la longitud de la entidad del objeto es > tamaño.

Cuando se utiliza el tercer constructor, la capacidad inicial de la entidad asignada al objeto es la longitud de la cadena de parámetros s + 16 caracteres. Cuando la longitud de la entidad del objeto es mayor que la capacidad inicial, la capacidad inicial de la entidad asignada al objeto es la longitud de la cadena de parámetros s + 16 caracteres. la capacidad de la entidad aumenta automáticamente.

El objeto StringBuffer se puede liberar para obtener la longitud de la secuencia de caracteres almacenada por la entidad a través de length(). Obtenga la capacidad real de la entidad actual mediante el método capacidad().

Clase StringTokenizer:

Utilice la clase java.util.StringTokenizer para analizar una cadena y dividirla en palabras que se pueden usar de forma independiente.

La clase StringTokenizer tiene dos métodos de construcción comúnmente utilizados:

StringTokenizer(String s): construye un analizador para cadenas. Utilice el conjunto predeterminado de delimitadores, es decir, caracteres de espacio (varios caracteres de espacio se consideran un espacio), carácter de avance de línea, carácter de retorno de carro, carácter de tabulación y carácter de avance de papel (\f).

StringTokenizer(String s, String dilim): construye un analizador para string s. Los caracteres del parámetro dilim se utilizan como delimitadores.

Haga referencia al objeto StringTokenizer como un analizador de cadenas. Un analizador puede utilizar el método nextToken() para obtener los símbolos del idioma (palabras) en la cadena uno por uno. Siempre que se llame a nextToken(), se obtendrá el siguiente símbolo del idioma en la cadena. el análisis de cadena El valor de la variable responsable de contar en el dispositivo se reduce automáticamente en 1. El valor inicial de la variable de conteo es igual al número de palabras en la cadena (puede usar el objeto StringTokenizer para llamar a countTokens() método para obtener el valor de conteo).

Por ejemplo:

String str="somos stud,ents";

StringTokenizer fenxi = new StringTokenizer(str,", " //); Uso Los espacios y las comas se utilizan como separadores

int count=fenxi.countTokens();

while(fenxi.hasMoreElements())

{

Cadena s = fenxi.nextToken();

System.out.println(s);

}

System.out.println( "* **Hay palabras: "+cuenta+".

");

Además, StringTokenizer se puede reemplazar por la función de división de la clase String

String str="abc;bcd;efg";

String[] splitStrs =str.split(";");

for(int i=0;i

System.out.println(splitStrs [i]) ;

Clase StringBuilder La clase StringBuilder es nueva desde JDK 5. Esta clase proporciona una API compatible con StringBuffer, pero no garantiza la sincronización. Esta clase está diseñada para ser un reemplazo simple de StringBuffer. Cuando el búfer de cadena es utilizado por un solo subproceso (lo cual es muy común), la clase StringBuilder generalmente debe usarse con preferencia a la clase StringBuffer porque admite las mismas operaciones, pero es más rápida ya que no realiza sincronización. Se recomienda utilizar esta clase en lugar de StringBuffer si es posible, ya que es más rápido que StringBuffer en la mayoría de los casos. Nota: No es seguro utilizar una instancia de StringBuilder con varios subprocesos. Si se requiere dicha sincronización, se recomienda utilizarla. la clase StringBuffer.