Búfer de cadena
En programación orientada a objetos, un búfer de cadena es una alternativa a una cadena. Tiene la propiedad de ser alterable mediante inserciones al final, mientras que una cadena normalmente es fija o inmutable.
En Java
editarTeoría
editarLa manera estándar de manipular texto en Java es usar su clase String
. Toda String
en Java es un objeto inmutable, lo que significa que su estado no puede cambiar. Una String
contiene un vector de caracteres. Toda manipulación que implique un cambio en la cadena requiere la creación de una nueva String
(lo cual, a su vez, implica crear un nuevo vector de caracteres y copiar el vector original). Esto sucede incluso si no se conserva el valor original de la String
o de String
intermedias usadas para la manipulación.
Java provee una clase alternativa para manipular cadenas, llamada StringBuffer
. Un StringBuffer
, al igual que una String
, contiene un vector para almacenar caracteres. Sin embargo, aquel es mutable (su estado puede cambiar). Su vector de caracteres no necesariamente está del todo lleno (en contraste con una String
, cuyo vector siempre tiene la longitud exacta necesaria para su contenido). Por tanto, es posible agregar caracteres, borrarlos o cambiar el estado sin tener que crear un nuevo objeto (y sin tener que crear un nuevo vector y copiar el anterior). La excepción a esto es cuando su vector ya no tiene la longitud adecuada para almacenar su contenido; en este caso, se requiere crear uno nuevo y copiar el antiguo contenido.
Por estas razones, Java manejaría una expresión como:
String nuevaString = unaString + unInt + unChar + unDouble;
así:
String nuevaString = (new StringBuffer(unaString)).append(unInt).append(unChar).append(unDouble)).toString();
Implicaciones
editarGeneralmente, un StringBuffer
es más eficiente que una String
para manipular cadenas. Sin embargo, este no es necesariamente el caso, ya que el primero requerirá recrear su vector de caracteres cuando se quede sin espacio. Teóricamente, esto puede suceder tantas veces como nuevas String
se requieran, aunque es poco probable (y el programador puede proporcionar indicaciones sobre la longitud para prevenir esto). De cualquier forma, el efecto no suele ser notable en computadoras de escritorio modernas.
Además, las limitaciones de los vectores son inherentes a los StringBuffer
. Para insertar o borrar caracteres en posiciones arbitrarias, hace falta mover secciones enteras de vectores.
El método que hace atractivo a un StringBuffer
en un entorno con bajo poder de procesamiento consiste en usar mucha memoria, la cual es probable que también escasee en un entorno tal. Este punto, sin embargo, es trivial, considerando el espacio requerido para crear muchas instancias de String
de manera de poder procesarlas. Aparte, el StringBuffer
puede optimizarse para “derrochar” tan poca memoria como sea posible.
La clase StringBuilder, introducida en J2SE 5.0, difiere de StringBuffer
en que es asíncrona. Si solo un hilo de ejecución a la vez accede al objeto, usar un StringBuilder
es más eficiente que usar un StringBuffer
.
StringBuffer
y StringBuilder
se incluyen en el paquete java.lang.
En .NET
editarLa plataforma Microsoft .NET tiene una clase StringBuilder
en su Base Class Library (Biblioteca de Clases Básica).
En otros lenguajes
editar- En C++ y Ruby, la clase de cadena estándar ya es mutable, con la posibilidad de cambiar sus contenidos e insertar cadenas al final, etc., así que no hace falta una clase separada para cadenas mutables.
- En Objective-C (plataformas Cocoa/OpenStep), la clase
NSMutableString
es la versión mutable de la claseNSString
. - En Dart, la clase
StringBuffer
funciona de forma similar a java.
Véase también
editarEnlaces externos
editar- Los JavaDocs de
StringBuffer
,StringBuilder
yString
(en inglés). - El código fuente de estas clases.
- Urban Performance Legends - un artículo que discute sobre objetos inmutables en relación al diseño orientado a objetos (en inglés).