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");
}
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");
}
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”.
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";
}
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 “,”
?!?!?!?
Por que são expressões regulares 
. = qualquer caracter
Putz, eu nunca vou conseguir fazer um replace num ponto então? Que triste…
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 ("."), ",");
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;
}
Shoes,
Por curiosidade onde posso obter mais informações sobre “pool de Strings”
(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…
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
Com tanto que essas digressões continuem sendo proveitosas 
Espero um dia poder faze-las tambem
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
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!