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