quarta-feira, 23 de fevereiro de 2011

Comparando String, StringBuilder e StringBuffer

As três classes String, StringBuilder e StringBuffer são usadas para armazenar uma sequência de caracteres, mas por tráz existem algumas diferenças. As classes StringBuilder e StringBuffer vieram para solucionar e/ou dar uma alternativa para alguns aspectos da classe String (como imutabilidade).

String

Em Java strings são objetos.
Exitem varias formas de criar um objeto String e atribuir uma string ao objeto como:

String s = "abc";

String s = new String("abc");

String s = new String();
s = "abc";

Aparentemente objetos do tipo String são como qualquer outro objeto, mas eles são imultaveis! O que significa isso? Apartir do momento em que você atribui um valor ao objeto, este valor nunca mais poderá ser modificado, isso mesmo, nunca mais!! Isto é valido para o valor do objeto e não para a referência da variável, assim a variável de referência poderá referenciar a outro objeto String a qualquer momento.

  • Exemplo 1:
String x = "Codigo";
x.concat("Unico");
System.out.println("x = " + x); //resultado: x = Codigo

O resultado esperado seria: x igual a CodigoUnico, mas como Strings são imutaveis o objeto referênciado por x não modificou o seu valor!

  • Exemplo 2:
String x = "Codigo";
x = x.concat("Unico");
System.out.println("x = " + x); //resultado: x = CodigoUnico

Como assim!? o objeto String modificou o seu valor!? NÃO! ele é imutavel! O que aconteceu foi que ao dizer x = x.concat("Unico"); um novo objeto String com o valor “CodigoUnico” foi criado na memória(heap) concatenando o valor "Codigo" com “Unico”. Depois desse novo objeto ser criado ele foi atribuido a variavel de referencia x, então quando pedimos para vizualizar x estamos vizualizando o valor do novo objeto String que foi criado.

O que aconteceu com o outro objeto String com o valor “Codigo”? Ele foi para um local especial da memória chamado “String constant pool”. Sempre que vamos criar uma string o compilador checa no “String constant pool” para ver se já existe um objeto String idêntico. Se existir, a variavel de referência vai referenciar diretamente para este objeto String já existente e não será criado um novo objeto na memória contendo a string. (A String existente passará simplismente a ter mais referencias a ela, isso é normal.)

StringBuilder e StringBuffer

Como vimos acima objetos String são imutaveis. Se você pretende fazer muitas modificações a um objeto String você acabará com vários objetos String abandonados no “String constant pool”. O StringBuilder e StringBuffer veio para solucionar esse problema! Eles podem ser modificados quantas vezes quizer e não será criado um novo objeto, e sim o valor do objeto será realmente modificado.

  • Exemplo 3:
StringBuffer x = "Codigo";
x.append("Unico");
System.out.println("x = " + x); //resultado: x = CodigoUnico

Neste exemplo o valor do objeto foi realmente modificado sem a necessidade de atribuir o resultado a variavel de referencia x. A unica diferença entre StringBuilder e StringBuffer é que os métodos do StringBuilder não são sincronizados ou seja não são confiáveis se estiverem usando thread. A Sun recomenda usar o StringBuilder sempre que possével ao inves do StringBuffer. Alem disso as duas classes são identicas.

Nenhum comentário:

Postar um comentário