Uso de la clase StringBuilder Un pequeño programa puede crear una gran cantidad de objetos String muy rápidamente . Por ejemplo , ¿cuántas te parece que este pedazo de código crea ? 10: String alpha = ""; 11: for(char current = 'a'; current <= 'z'; current++) 12: alpha += current; 13: System.out.println(alpha); La cadena vacía en la línea 10 es instanciada , y luego la línea 12 añade una "a" . Sin embargo,como el objeto String es inmutable , un nuevo objeto String se asigna a alpha y el objeto "" se puede elegir para la recolección de basura . La próxima vez a través del bucle , alpha es asignado a un nuevo objeto String , " ab " , y el objeto " a " se puede elegir para la basura colección. La siguiente iteración asigna alpha para " abc " y el objeto " ab " se convierte en elegible para la recolección de basura , y así sucesivamente Esta secuencia de eventos continúa, y después de 26 iteraciones a través del bucle , un total de 27 objetos son instanciados , la mayoría de los cuales son inmediatamente elegibles para la recolección de basura .Esto es muy ineficiente . Afortunadamente , Java tiene una solución . La clase StringBuilder crea una cadena sin almacenar todos los valores de cadena provisionales . A diferencia de la clase String ,StringBuilder no es inmutable . 15: StringBuilder alpha = new StringBuilder(); 16: for(char current = 'a'; current <= 'z'; current++) 17: alpha.append(current); 18: System.out.println(alpha); En la línea 15 , un nuevo objeto StringBuilder es instanciado . La llamada a append ( ) en la línea 17 agrega un carácter a la StringBuilder objeto cada vez a través del bucle y anexa el valor de current al final de alpha. Este código vuelve a utilizar el mismo StringBuilder sin la creación de una cadena intermedia cada vez.En esta sección , vamos a ver como crear un StringBuilder , métodos comunes , y una comparación para StringBuffer . Mutabilidad y encadenamiento Habrás notado en el ejemplo anterior que StringBuilder no es inmutable .De hecho , nos dio 27 valores diferentes en el ejemplo . El examen es probable que trate de engañarte con respecto String y StringBuilder . El encadenamiento lo hace aún más interesante . Cuando encadenados llamadas a método de String, el resultado fue una nueva cadena con la respuesta. Encadenamiento de objetos de StringBuilder no funciona de esta manera.El StringBuilder cambia su propio estado y devuelve una referencia a sí mismo!.Veamos un ejemplo para hacer esto más claro : 4: StringBuilder sb = new StringBuilder("start"); 5: sb.append("+middle"); // sb = "start+middle" 6: StringBuilder same = sb.append("+end"); // "start+middle+end" La línea 5 añade texto al final de sb . También devuelve una referencia a sb , que se ignora . La línea 6 también añade texto al final de sb y devuelve una referencia a sb . Esta vez la referencia es almacenadas en same , lo que significa que sb y same apuntan al mismo objeto e imprimiría el valor de same. El examen no siempre va a hacer el código fácil de leer poniendo tan solo un método por línea ¿Qué te parece que este ejemplo imprime ? 4: StringBuilder a = new StringBuilder("abc"); 5: StringBuilder b = a.append("de"); 6: b = b.append("f").append("g"); 7: System.out.println("a=" + a); 8: System.out.println("b=" + b); ¿Dijiste ambos imprimen " abcdefg " ? Bueno. Sólo hay un objeto StringBuilder aquí. Lo sabemos porque new StringBuilder ( ) se llama una sola vez . En la línea 5 , hay dos variables que hacen referencia a ese objeto , que tiene un valor de " abcde " . En la línea 6 , los dos variables siguen haciendo referencia a ese mismo objeto , que ahora tiene un valor de " abcdefg " .Dicho sea de paso , la asignación de nuevo a b no hace absolutamente nada . b ya está apuntando a ese StringBuilder . La creación de un StringBuilder Hay tres maneras de construir un StringBuilder : StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder("animal"); StringBuilder sb3 = new StringBuilder(10); El primero dice crear un StringBuilder que contiene una secuencia vacía de caracteres y asignar sb1 para que lo apunte . La segunda dice crear un StringBuilder que contiene un valor específico y asignar a sb2 para que lon apunte. Para las dos primeras , se dice que Java gestiona los detalles de implementación . El ejemplo final de dice que Java tiene una idea de lo grande que será el valor final y le gustaría que el StringBuilder reservara un cierto número de ranuras para carácteres . Size vs. Capacity El proceso detrás de las escenas de cómo se almacenan los objetos no se encuentra en el examen, pero algunos conocimientos de este proceso pueden ayudar a comprender mejor y recordar el Constructor String. El tamaño(size) es el número de caracteres actualmente en la secuencia , y la capacidad es el número que la secuencia de caracteres actualmente puede contener. Dado que una String es inmutable , el tamaño y la capacidad son los mismos. El número de caracteres que aparecen en un String es tanto el tamaño y la capacidad. Para StringBuilder , Java sabe que el tamaño es probable que cambie a medida que se utiliza el objeto . Cuando StringBuilder se construye , se puede comenzar en la capacidad por defecto ( que pasa a ser 16 ) o una elegida por el programador. En el ejemplo , solicitamos una capacidad de 5. En este punto , el tamaño es 0 ya que no han añadido caracteres aún, pero tenemos espacio para 5 . A continuación añadimos cuatro caracteres . En este punto , el tamaño es de 4 ya que llenamos cuatro ranuras . La la capacidad es todavía 5. A continuación, añadimos tres caracteres más . El tamaño es ahora 7 ya que hemos utilizado hasta siete ranuras . Debido a que la capacidad no era lo suficientemente grande para almacenar siete caracteres ,Java la aumenta automáticamente por nosotros. Métodos importantes de StringBuilder Al igual que con String , no vamos a cubrir cada método de la clase StringBuilder Estos son los que se pueden ver en el examen. charAt(), indexOf(), length(), and substring() Estos cuatro métodos funcionan exactamente igual que en la clase String. Asegúrese de que puede identificar la salida de este ejemplo : StringBuilder sb = new StringBuilder("animals"); String sub = sb.substring(sb.indexOf("a"), sb.indexOf("al")); int len = sb.length(); char ch = sb.charAt(6); System.out.println(sub + " " + len + " " + ch); La respuesta correcta es anim 7 s . Las llamadas al método indexOf ( ) devuelven 0 y 4 , respectivamente. substring ( ) devuelve la cadena que comienza con el índice 0 y terminando justo antes de índice de 4 . lengh ( ) devuelve 7 , ya que es el número de caracteres en StringBuilder. Por último , charAt ( ) devuelve el carácter correspondiente al índice 6. Aquí no se inicia con 0 porque nos estamos refiriendo a los índices. Si nada de esto nos suena familiar, volver atrás y leer la sección String de nuevo. Observe que substring ( ) devuelve una cadena en lugar de un StringBuilder . Por eso sb no se cambia. substring ( ) es en realidad un método que indaga acerca de dónde la subcadena sucede. append() El método append ( ) es , con mucho, el método más frecuentemente utilizado en StringBuilder . De hecho,se utiliza con tanta frecuencia que acabamos de empezar a usarlo sin comentarios. Por suerte , este método hace exactamente lo que suena : se añade el parámetro a la StringBuilder y devuelve una referencia a la StringBuilder actual. Una de las firmas de método es el siguiente : StringBuilder append(String str) Nótese que hemos dicho una de las firmas de métodos . Hay más de 10 firmas de método que parecen similares pero que tienen diferentes tipos de datos como parámetros. Todos esos métodos se proporcionan para que pueda escribir código como este : StringBuilder sb = new StringBuilder().append(1).append('c'); sb.append("-").append(true); System.out.println(sb); // 1c-true Buen método de encadenamiento , ¿no es así ? append ( ) es llamado directamente después del constructor . Por tener todas estas firmas de método , se puede llamar append ( ) sin tener que convertir su parámetro en una String en primer lugar. insert() El método insert () añade caracteres a la StringBuilder en el índice solicitado y devuelve una referencia a la StringBuilder actual. Al igual que append ( ) , hay un montón de firmas de métodos para diferentes tipos . Aquí hay uno: StringBuilder insert(int offset, String str) Prestar atención a offset en estos ejemplos . Es el índice donde queremos insertar el parámetro 3: StringBuilder sb = new StringBuilder("animals"); 4: sb.insert(7, "-"); // sb = animals5: sb.insert(0, "-"); // sb = -animals6: sb.insert(4, "-"); // sb = -ani-mals 7: System.out.println(sb); Los creadores del examen tratarán de liarte con en esto. A medida que agregas y quitas carácteres , sus índices cambian . Cuando vea una pregunta relativa a dichas operaciones , dibuja lo que está pasando para que no te confundan . delete() and deleteCharAt() El método delete ( ) es el opuesto del método insert ( ) . Se elimina caracteres de la secuencia y devuelve una referencia a la StringBuilder actual. El método deleteCharAt () es útil cuando se desea borrar un solo carácter . Las firmas de los métodos son los siguientes: StringBuilder delete(int start, int end) StringBuilder deleteCharAt(int index) El código siguiente muestra cómo utilizar estos métodos : StringBuilder sb = new StringBuilder("abcdef"); sb.delete(1, 3); // sb = adef sb.deleteCharAt(5); // throws an exception En primer lugar, eliminamos los caracteres comenzando con el índice 1 y termina justo antes índice de 3. Esto nos da adef . A continuación, preguntamos a Java para borrar el carácter en la posición 5. Sin embargo, el valor restante es de sólo cuatro caracteres de longitud , lo que arroja una StringIndexOutOfBoundsException reverse() El método reverse ( ) hace exactamente lo que dice : invierte los caracteres de las secuencias y devuelve una referencia a la actual StringBuilder . La firma del método es la siguiente: StringBuilder reverse() El código siguiente muestra cómo utilizar este método : StringBuilder sb = new StringBuilder("ABC"); sb.reverse(); System.out.println(sb); Como era de esperar , esta opción imprime CBA . toString() El último método convierte un StringBuilder en un String. La firma del método es la siguiente: String toString() El código siguiente muestra cómo utilizar este método : String s = sb.toString(); A menudo StringBuilder se utiliza internamente para fines de rendimiento , pero el resultado final tiene que ser una cadena. Por ejemplo , tal vez sea necesario pasar a otro método que espera una cadena . StringBuilder vs. StringBuffer Al escribir nuevo código que concatena una gran cantidad de objetos String juntos, usted debe utilizar StringBuilder . StringBuilder se añadió a Java en Java 5. Si se encuentra con códigos más antiguos , verá que StringBuffer s utiliza para este propósito . StringBuffer hace lo mismo pero más lentamente , ya que es la ejecución de subprocesos . Usted aprenderá acerca de los threads para el examen de OCP . En teoría, no es necesario saber acerca de StringBuffer en el examen en absoluto. Sin embargo , traemos esto de todos modos, ya que una pregunta más antígua aún podría caer en el examen.