Ver esta explicación es bueno, así que la daré la vuelta
Hay 3 clases en Java responsables de las operaciones de personajes.
1. El personaje es una operación de un solo personaje.
2. La cuerda opera en una cadena de caracteres, clase inmutable.
3.StringBuffer también es una operación en una cadena de caracteres y es una clase mutable.
Cadena:
Es un objeto, no un tipo primitivo.
Es un objeto inmutable y una vez que se crea, su valor no puede modificarse.
La modificación de los objetos de cadena existentes es recrear un nuevo objeto y guardar el nuevo valor en él.
La cadena es una clase final, es decir, no se puede heredar.
StringBuffer:
Es un objeto mutable.
Solo puede ser creado por constructores,
StringBuffer sb = new StringBuffer ();
Nota: No se puede pagar mediante símbolos de asignación.
sb = "¡Bienvenido a aquí!"; // Error
Después de que se cree el objeto, el espacio de memoria se asignará en la memoria y se guardará inicialmente un nulo.
sb.append ("hola");
La eficiencia de StringBuffer es mayor que la de la cadena en la concatenación de cadenas:
Cadena str = new String ("Bienvenido a");
str += "aquí";
El paso de procesamiento es realmente creando un stringbuffer, luego llamando a append () y finalmente
Luego agregue StringBuffer Tosting ();
De esta manera, la operación de conexión de cadena tendrá algunas operaciones adicionales que StringBuffer y, por supuesto, la eficiencia se reducirá.
Y dado que el objeto de cadena es un objeto inmutable, cada operación de aguja recreará un nuevo objeto para guardar el nuevo valor.
De esta manera, el objeto original será inútil y se recolectará basura.
Eche un vistazo al siguiente código:
Repita 26 letras inglesas 5,000 veces.
La copia del código es la siguiente:
Cadena temptr = "abcdefghijklmnopqrstuvwxyz";
intimes = 5000;
long lstart1 = System.CurrentTimemillis ();
Cadena str = "";
para (int i = 0; i <times; i ++) {
str += temptr;
}
Long Lend1 = System.CurrentTimemillis ();
mucho tiempo = (lend1 - lstart1);
System.out.println (tiempo);
Desafortunadamente, mi computadora no es una supercomputadora, y los resultados que obtengo no son necesariamente los mismos cada vez, generalmente alrededor de 46687.
Eso es 46 segundos.
Echemos un vistazo al siguiente código
La copia del código es la siguiente:
Cadena temptr = "abcdefghijklmnopqrstuvwxyz";
intimes = 5000;
long lstart2 = System.CurrentTimemillis ();
StringBuffer sb = new StringBuffer ();
para (int i = 0; i <times; i ++) {
sb.append (tempttr);
}
Long Lend2 = System.CurrentTimemillis ();
mucho tiempo2 = (lend2 - lstart2);
System.out.println (Time2);
El resultado es 16 y a veces es 0
Entonces, la conclusión es obvia, la velocidad de Stringbuffer es casi decenas de miles de veces la de la cuerda. Por supuesto, estos datos no son muy precisos. Debido a que el número de ciclos es 100,000 veces, la diferencia es aún mayor. Si no me crees, intenta
Si aún no puedes entender:
1) La diferencia entre el método Junk + de String y el método de adjunto de StringBuff:
Cuando el operador String + realiza la operación de la cadena, primero convierte el objeto de cadena actual en el tipo StringBuff, llama a su método de append y finalmente convierte el objeto StringBuff generado en una cadena de tipo de cadena a través de su método de tostración, por lo que es ineficiente.
Sin embargo, en términos de legibilidad, el operador de conexión de la cadena sigue siendo alto.
2) StringBuff es seguro de hilo
La cadena no es segura para los hilos
3) La cadena es un objeto de cadena que no se puede modificar, mientras que StringBuff se modifica.
La copia del código es la siguiente:
Public static boolean fileCopy (string srcstr, string Deststr) {
Archivo srcfile = null;
Archivo destfile = null;
Lector lector = null;
Escritor escritor = nulo;
bandera booleana = falso;
intentar {
srcfile = nuevo archivo (srcstr);
if (! srcfile.exists ()) {
System.out.println ("El archivo de origen no existe");
System.exit (0);
} demás {
lector = new FileReader (srcfile);
}
DestFile = nuevo archivo (DestStr);
escritor = nuevo FileWriter (destfile);
char [] buff = new Char [1024];
int len;
Cadena str = "";
StringBuffer sbuff = new StringBuffer ();
while ((len = lector.read (buff))! = -1) {
// str += nueva cadena (buff, 0, len);
sbuff.append (nueva cadena (buff, 0, len));
}
// escritor.write (str.toCarArray ());
Writer.Write (sbuff.ToString (). toCarArray ());
bandera = verdadero;
escritor.flush ();
lector.close ();
escritor.close ();
} Catch (ioException e) {
System.out.println ("Excepción de copia de archivo: =" + e.getMessage ());
}
Bandera de regreso;
}