String imutavel vs Heap

13 respostas
passos

Se a classe String e imutavel existe diferenca (para o heap) entre:

String s = null;
		
for (int i = 1; i <= 10; i++) {
	s = new String("Teste");
}

e

for (int i = 1; i <= 10; i++) {
	String s = new String("Teste");
}

13 Respostas

T

passos:
Diferença entre:

String s = null;
		
for (int i = 1; i <= 10; i++) {
	s = new String("Teste");
}

e

for (int i = 1; i <= 10; i++) { String s = new String("Teste"); }

Os dois códigos são quase equivalentes em termos de bytecodes gerados e criação de objetos, (a menos do “s = null”).
O problema é que em Java a palavra-chave “new” SEMPRE aloca memória para um objeto - a menos que não haja memória; nesse caso ocorre um OutOfMemoryError.
(Diferentemente do C++, onde é possível interceptar a função de alocação de memória para algumas classes e transformar “new” em uma “fábrica de objetos”, permitindo a reutilização de objetos, em vez de um alocador simples.)
No seu caso, o construtor String(String) que foi chamado faz uma cópia dos caracteres da string “Teste” para uma nova string, sempre. A imutabilidade de um objeto não tem nada a ver com a alocação de memória feita por “new”.

pcalcado

Complementando o que o thingol disse, ser imutavel não significa único.

Imutável quer dizer que o objeto não pode ser seu estado alterado, para ter apenas uma instância você precisa de um Singleton.

A propósito, a menos que você saiba porque esta fazendo isso, nunca faça new String(“blbalbal”), semrpe use apenas a String entre aspas para reutilizar o objeto no pool de Strings.

String s = null;
 		
 for (int i = 1; i <= 10; i++) {
 	s = "Teste";
 }
 


 for (int i = 1; i <= 10; i++) {
 	String s = "Teste";
 }
Rafael_Nunes

Deixa eu aproveita o tópico pra tirar uma dúvida bizarra.

Suponha que eu tenho uma String “1234,56”.Por que quando eu faço:

string.replaceAll("," , ".")

Ele retorna “1234.56”

Mas se eu tiver 1234.56 e fizer:

string.replaceAll(".", ",")

Ele retorna “,”

?!?!?!?

pcalcado

Por que são expressões regulares :wink:

. = qualquer caracter

Rafael_Nunes

Putz, eu nunca vou conseguir fazer um replace num ponto então? Que triste…

T

Dá sim, é só fazer uma de duas coisas:

String trocado = original.replaceAll ("\.", ",");

ou

// atenção, só no Java 5.0 em diante
String trocado = original.replaceAll (Pattern.quote ("."), ",");
saoj

Construtores privados não resolvem isso de forma elegante?

private User(String username) { this.username = username; }

public static User getInstance(String username) {
    if (cache.get(username) != null) return (User) cache.get(username);
    User u = new User(username);
    cache.put(username, u);
    return u;
}
passos

Shoes,

Por curiosidade onde posso obter mais informações sobre “pool de Strings”

pcalcado

Aqui
e aqui

:wink:

T

saoj:
Thingol:

(Diferentemente do C++, onde é possível interceptar a função de alocação de memória para algumas classes e transformar “new” em uma “fábrica de objetos”, permitindo a reutilização de objetos, em vez de um alocador simples.)

Construtores privados não resolvem isso de forma elegante?

private User(String username) { this.username = username; }

public static User getInstance(String username) {
    if (cache.get(username) != null) return (User) cache.get(username);
    User u = new User(username);
    cache.put(username, u);
    return u;
}

É claro que sim.

Uma vez eu li um artigo “new considered harmful” ( http://www.ddj.com/documents/s=7027/ddj0204a/0204a.htm ) e isso me levou a este: Why Lots of Things are Considered Harmful http://www.manageability.org/blog/archive/20021120%23why_lots_of_things_are

Para o Passos: não fique confuso com todos estes artigos, é que a gente aqui do GUJ gosta de fazer digressões mesmo…

Ironlynx

passos, eu escrevi algo sobre esse assunto aqui:
http://www.guj.com.br/posts/list/19722.java

e o cv sobre pool de strings aqui(beeem claro):
http://www.guj.com.br/posts/list/6684.java

passos

Com tanto que essas digressões continuem sendo proveitosas :stuck_out_tongue:

Espero um dia poder faze-las tambem

passos

Ironlynx:
passos, eu escrevi algo sobre esse assunto aqui:
http://www.guj.com.br/posts/list/19722.java

Ainda nao tive tempo de ler todo mas realmente deveria ter virado um artigo publicado

Ironlynx:
e o cv sobre pool de strings aqui(beeem claro):
http://www.guj.com.br/posts/list/6684.java

Po… bem simples e foi altamente proveitoso. Obrigado!

Criado 6 de julho de 2005
Ultima resposta 7 de jul. de 2005
Respostas 13
Participantes 6