Búfer de cadena
# 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

### Teoría

La 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:

así:

### Implicaciones

Generalmente, 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

La plataforma Microsoft .NET tiene una clase StringBuilder en su Base Class Library (Biblioteca de Clases Básica).

## En otros lenguajes

* 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 clase NSString.
* En Dart, la clase StringBuffer funciona de forma similar a java.
