Uso de la clase StringBuilder

Anuncio
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.
Descargar