Análisis del código fuente de Stringbuilder
1. Mutable e inmutable
La clase string usa una matriz de caracteres para guardar la cadena, de la siguiente manera: Debido al modificador "final", puedes saber que el objeto String es Inmutable.
Valor de carácter final privado [];
Tanto StringBuilder como StringBuffer heredan de la clase AbstractStringBuilder. En AbstractStringBuilder, las matrices de caracteres también se utilizan para guardar cadenas, como se muestra a continuación. dos Un objeto es mutable.
Valor Char[];
2. ¿Es seguro el subproceso múltiple?
Los objetos en String son inmutables y pueden entenderse como constantes, lo que obviamente es seguro para subprocesos.
AbstractStringBuilder es la clase padre pública * * de StringBuilder y StringBuffer. Define algunas operaciones básicas de cadenas, como expandCapacity, append, insert, indexOf y otros métodos * * * públicos.
StringBuffer tiene un bloqueo de sincronización en el método o método llamado, por lo que es seguro para subprocesos. Mire el código fuente a continuación:
1 Sincronización pública StringBuffer inversa() {
2 super . inversa()
3 Devuelve esto; p >
4 }
五
6 public int indexOf(String str) {
7 return indexOf(str, 0); es un índice int público sincronizado del método (string str, int from index).
8 }
StringBuilder no bloquea este método sincrónicamente, por lo que no es seguro para subprocesos.
3.StringBuilder es lo mismo que StringBuffer***
StringBuilder y StringBuffer tienen una * * * clase principal común, AbstractStringBuilder.
Una de las diferencias entre clases abstractas e interfaces es que algunas subclases se pueden definir en clases abstractas. Las subclases solo necesitan agregar nuevas funciones y no necesitan reescribir los métodos existentes, son solo declaraciones de métodos y definiciones; de constantes.
Los métodos de StringBuilder y StringBuffer llaman a métodos públicos en AbstractStringBuilder, como super.append(...). Sin embargo, StringBuffer agregará la palabra clave sincronizada al método para la sincronización.