Creo que todos comprenden bien la diferencia entre String y StringBuffer, pero se estima que todavía hay muchos compañeros que no tienen claros los principios de funcionamiento de estas dos clases. Hoy revisaré este concepto para todos, y por. la forma en que J2SE 5.0 trae una nueva clase de manipulación de caracteres: StringBuilder (no se apresure a tirarme ladrillos, todavía estoy sobrio, no estoy hablando de C# aquí, Java también tiene una clase StringBuilder). Entonces, ¿cuáles son las diferencias entre StringBuilder y StringBuffer y la clase String que conocimos por primera vez? ¿Cuál deberíamos utilizar en diferentes situaciones? Me gustaría compartir mis puntos de vista sobre estas categorías, y también espero que todos puedan dar sus opiniones. Todos han cometido errores, y mientras los corrigen, es una buena oportunidad para aprender.
En pocas palabras, la principal diferencia de rendimiento entre el tipo String y el tipo StringBuffer es en realidad que String es un objeto inmutable (¿Por qué? Pregúntele a los diseñadores de Java, ¿por qué String no es un tipo nativo?) Por lo tanto, cada vez que se cambia el tipo String De hecho, es equivalente a generar un nuevo objeto String y luego apuntar el puntero al nuevo objeto String. Por lo tanto, es mejor no usar String para cadenas que cambian con frecuencia de contenido, porque cada vez que se genera un objeto. Tendrá un impacto en el rendimiento del sistema, especialmente cuando se usa memoria. Cuando hay demasiados objetos sin referencia, el GC de la JVM comenzará a funcionar y la velocidad definitivamente será bastante lenta. He aquí un ejemplo que no es muy apropiado:
Cadena S1 = "abc";
For(int I = 0; I < 10000; I ++) // For simula múltiples llamadas del programa
{
S1 + = "definición";
S1 = "abc";
}
Si este es el caso, una vez completado el bucle for, si el GC no ha borrado los objetos de la memoria, habrá más de 20.000 en la memoria, un número sorprendente, y si este es un sistema utilizado por muchos personas, entonces el número no es muy grande, por lo que todos deben tener cuidado al usarlo.
Si usa la clase StringBuffer, los resultados serán diferentes cada vez que el resultado será una operación en el objeto StringBuffer en sí, en lugar de generar un nuevo objeto y luego cambiar la referencia del objeto. Por lo tanto, en general recomendamos usar StringBuffer, especialmente cuando los objetos de cadena cambian con frecuencia. En algunos casos especiales, la JVM interpreta la concatenación de cadenas de objetos String como la concatenación de objetos StringBuffer, por lo que en estos casos la velocidad de los objetos String no será más lenta que la de los objetos StringBuffer, y especialmente los siguientes objetos de cadena son generado Entre ellos, la eficiencia de String es mucho más rápida que StringBuffer:
Cadena S1 = “Esto es sólo una” + “simple” + “prueba”;
StringBuffer Sb = new StringBuilder("Esto es sólo un").append("simple").append("prueba");
Se sorprenderá al descubrir que la velocidad de generación de objetos String S1 es simplemente demasiado rápida y, en este momento, StringBuffer no tiene ninguna ventaja en velocidad. De hecho, esto es un truco de la JVM. A los ojos de la JVM, esto.
Cadena S1 = “Esto es sólo una” + “simple” + “prueba” De hecho, es: Cadena S1 = “Esto es sólo una prueba simple” Entonces, por supuesto, no lleva mucho tiempo; Pero lo que todos deberían tener en cuenta aquí es que si su cadena proviene de otro objeto String, la velocidad no será tan rápida, por ejemplo:
Cadena S2 = "Esto es sólo un";
Cadena S3 = "simple";
Cadena S4 = "prueba";
Cadena S1 = S2 +S3 + S4;
En este momento, la JVM se comportará de la manera original y la velocidad de generación de objetos S1 no será tan rápida como antes. Podemos hacer una prueba para verificarlo más adelante.
De esto obtenemos la conclusión del primer paso: en la mayoría de los casos StringBuffer > String
¿Y cómo se compara StringBuilder con ellos? Permítanme presentarles brevemente primero. StringBuilder es una clase recién agregada en JDK5.0. La diferencia entre ella y StringBuffer es la siguiente (fuente: JavaWorld):
Java.lang.StringBuffer Secuencia de caracteres mutables segura para subprocesos. Un búfer de cadena similar a String, pero que no se puede modificar. Los buffers de cadenas pueden ser utilizados de forma segura por múltiples subprocesos. Estos métodos se pueden sincronizar cuando sea necesario, de modo que todas las operaciones en cualquier instancia particular parezcan ocurrir en un orden en serie consistente con el orden de las llamadas a métodos realizadas por cada subproceso involucrado.
Cada búfer de cadena tiene una capacidad determinada. Siempre que la longitud de la secuencia de caracteres contenida en el búfer de cadena no exceda esta capacidad, no es necesario asignar una nueva matriz de búfer interna. Esta capacidad aumenta automáticamente si el búfer interno se desborda. A partir de JDK 5.0, se ha agregado a esta clase una clase equivalente para uso de un solo subproceso, StringBuilder. La clase StringBuilder generalmente debe usarse con preferencia a esta clase porque admite las mismas operaciones pero es más rápida porque no realiza sincronización.
Pero no es seguro utilizar una instancia de StringBuilder con varios subprocesos. Si se requiere dicha sincronización, se recomienda utilizar StringBuffer.
Dicho esto, creo que todos pueden entender la diferencia entre ellos, así que hagamos una derivación general a continuación:
En la mayoría de los casos StringBuilder > StringBuffer
Por tanto, según el teorema de transferencia de esta desigualdad: en la mayoría de los casos StringBuilder > StringBuffer > String (cuanto mayor sea el número de operaciones, más estable será).
Obtenga el tiempo del sistema long start = System.currentTimeMillis(); long end = System.currentTimeMillis() para conocer el valor de milisegundos en ejecución.
para(i=0;i<str.length()/2;i++)
si(str.charAt(i)!=str.charAt(str.length()-i-1))
romper;
si(i>=cadena.longitud()/2)
JOptionPane.showMessageDialog(null,"es una cadena palíndromo");
demás
JOptionPane.showMessageDialog(null, "No es una cadena palíndromo");
}
}
*/
si (cadena.es igual a (cadena2))
JOptionPane.showMessageDialog(null,"es una cadena palíndromo");
demás
JOptionPane.showMessageDialog(null, "No es una cadena palíndromo");
}
}