String es una de las clases más ampliamente utilizadas en Java. Las clases StringBuffer y StringBuilder proporcionan métodos para manipular cadenas. Analizaremos la diferencia entre StringBuffer y StringBuilder. StringBuffer vs StringBuilder es una pregunta popular en entrevistas de Java.
String vs StringBuffer vs StringBuilder
La cadena es uno de los temas más importantes en las entrevistas de Java en el núcleo. Si estás escribiendo un programa que imprime algo en la consola, utilizas String. Este tutorial se centra en las características principales de la clase String. Luego compararemos las clases StringBuffer y StringBuilder.
Cadena en Java
-
La clase String representa cadenas de caracteres, y podemos instanciar String de dos maneras.
String str = "ABC"; // o String str = new String("ABC");
-
String es inmutable en Java. Por lo tanto, es adecuado para usar en un entorno de múltiples hilos. Podemos compartirlo entre funciones porque no hay preocupación por inconsistencia de datos.
-
Cuando creamos un String usando comillas dobles, la JVM busca primero el String con el mismo valor en el pool de strings. Si lo encuentra, devuelve la referencia del objeto String del pool. De lo contrario, crea el objeto String en el pool de strings y devuelve la referencia. La JVM ahorra mucha memoria utilizando el mismo String en diferentes hilos.
-
Si se utiliza el operador new para crear un String, se crea en la memoria heap.
-
El operador + está sobrecargado para String. Podemos usarlo para concatenar dos strings. Aunque internamente utiliza StringBuffer para realizar esta acción.
-
String sobrescribe los métodos equals() y hashCode(). Dos Strings son iguales solo si tienen la misma secuencia de caracteres. El método equals() distingue entre mayúsculas y minúsculas. Si buscas comprobaciones que no distingan entre mayúsculas y minúsculas, deberías usar el método equalsIgnoreCase().
-
La cadena utiliza la codificación UTF-16 para la secuencia de caracteres.
-
String es una clase final. Todos los campos son finales, excepto “private int hash”. Este campo contiene el valor de la función hashCode(). El valor de hash se calcula solo cuando se llama al método hashCode() por primera vez y luego se almacena en este campo. Además, el hash se genera utilizando los campos finales de la clase String con algunos cálculos. Entonces, cada vez que se llama al método hashCode(), dará el mismo resultado. Para el llamante, parece que los cálculos están ocurriendo cada vez, pero internamente está almacenado en el campo hash.
String vs StringBuffer
Dado que String es inmutable en Java, cada vez que realizamos manipulaciones de String como concatenación, substring, etc., se genera un nuevo String y se descarta el String anterior para la recolección de basura. Estas son operaciones pesadas y generan mucha basura en el montón (heap). Por lo tanto, Java ha proporcionado las clases StringBuffer y StringBuilder que deben usarse para la manipulación de cadenas. StringBuffer y StringBuilder son objetos mutables en Java. Proporcionan los métodos append(), insert(), delete() y substring() para la manipulación de cadenas.
StringBuffer vs StringBuilder
StringBuffer fue la única opción para la manipulación de cadenas hasta Java 1.4. Sin embargo, tiene una desventaja: todos sus métodos públicos están sincronizados. StringBuffer proporciona seguridad en hilos, pero a un costo de rendimiento. En la mayoría de los casos, no utilizamos cadenas en un entorno multihilo. Por eso, en Java 1.5 se introdujo una nueva clase, StringBuilder, similar a StringBuffer pero sin seguridad en hilos ni sincronización. StringBuffer tiene algunos métodos adicionales como substring, length, capacity, trimToSize, etc. Sin embargo, no son necesarios, ya que todos estos están presentes en String. Por eso, estos métodos nunca se implementaron en la clase StringBuilder. StringBuffer se introdujo en Java 1.0, mientras que la clase StringBuilder se presentó en Java 1.5 después de analizar las deficiencias de StringBuffer. Si estás en un entorno de un solo hilo o no te importa la seguridad en hilos, debes usar StringBuilder. De lo contrario, usa StringBuffer para operaciones seguras en hilos.
Rendimiento de StringBuilder vs StringBuffer
I am trying to check the effect on performance because of synchronization with a sample program that performs append()
on StringBuffer and StringBuilder object for multiple times.
package com.journaldev.java;
import java.util.GregorianCalendar;
public class TestString {
public static void main(String[] args) {
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i<10000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
I ran the same code for the StringBuffer object also to check the time and memory values. I have executed the code 5 times for each case and then calculated the average values.
Value of i | StringBuffer (Time, Memory) | StringBuilder (Time, Memory) |
---|---|---|
10,00,000 | 808, 149356704 | 633, 149356704 |
1,00,00,000 | 7448, 147783888 | 6179, 147783888 |
Es evidente que StringBuilder tiene un mejor rendimiento que StringBuffer incluso en un entorno de un solo hilo. Esta diferencia de rendimiento puede deberse a la sincronización en los métodos de StringBuffer.
Cadena vs StringBuffer vs StringBuilder
- String es inmutable, mientras que StringBuffer y StringBuilder son clases mutables.
- StringBuffer es seguro para subprocesos y sincronizado, mientras que StringBuilder no lo es. Por eso StringBuilder es más rápido que StringBuffer.
- El operador de concatenación de cadenas (+) utiliza internamente la clase StringBuffer o StringBuilder.
- Para manipulaciones de cadenas en un entorno no multihebra, deberíamos usar StringBuilder; de lo contrario, usar la clase StringBuffer.
Eso es todo para un rápido resumen de las diferencias entre String, StringBuffer y StringBuilder. StringBuilder es más adecuado que StringBuffer en la mayoría de los escenarios de programación general. Referencias:
Source:
https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder