La diferencia entre cadenas, búferes de cadenas y constructores de cadenas
String, StringBuffer y StringBuilder en JAVA son clases de cadenas que se usan a menudo en programación. La diferencia entre ellas es una pregunta que se hace a menudo en las entrevistas. Ahora resuma sus similitudes y diferencias.
1. Mutable e inmutable
La clase String usa una matriz de caracteres para guardar una cadena, como se muestra a continuación. Debido a que hay un modificador "final", puedes saber que la cadena. El objeto es inmutable.
valor de carácter final privado[];
StringBuilder y StringBuffer heredan de la clase AbstractStringBuilder, y AbstractStringBuilder también usa matrices de caracteres para guardar cadenas, como se muestra a continuación. puedo ver Ambos objetos son mutables.
valor char[];
2. ¿Es seguro el subproceso múltiple?
La cadena en el objeto es inmutable y puede entenderse como una constante, lo cual es obviamente un hilo Seguro.
AbstractStringBuilder es la clase principal pública de StringBuilder y StringBuffer. Define algunas operaciones básicas en cadenas, como expandCapacity, append, insert, indexOf y otros métodos públicos.
StringBuffer es seguro para subprocesos porque agrega un bloqueo de sincronización al método o al método llamado. Mire el siguiente código fuente: 1?public?synchronized?StringBuffer?reverse()?{
2?super.reverse();
3?return?this;
4?}
5?
6?public?int?indexOf(String?str)?{
7?return? indexOf( str,?0);//exist?public?synchronized?int?indexOf(String?str,?int?fromIndex)? método
8?}
StringBuilder lo hará El método not be agrega un bloqueo de sincronización, por lo que no es seguro para subprocesos. 3. La máxima similitud entre StringBuilder y StringBuffer
StringBuilder y StringBuffer tienen una clase principal común, AbstractStringBuilder (clase abstracta).
Una diferencia entre clases abstractas e interfaces es que las clases abstractas pueden definir algunos métodos públicos para las subclases, y las subclases solo necesitan agregar nuevas funciones sin reescribir los métodos existentes. En una interfaz, solo es necesario; para declarar métodos y definir constantes.
En StringBuilder, los métodos StringBuffer llamarán a los métodos **** públicos en AbstractStringBuilder, como super.append(..). Solo StringBuffer se sincronizará agregando la palabra clave sincronizada en el método.
Finalmente, si el programa no es multiproceso, usar StringBuilder es más eficiente que usar StringBuffer.