bom, apenas esclarecendo, nunca poderiam ser apagadas, as strings, da forma como ficou a figura que postei, por definição, o coletor de lixu, so apaga Objetos impossiveis de serem alcançados pelo programa, e qualquer string no pool, pode ser alcançada usando-se o método intern() … portanto não há como apagar as Strings do pool, visto que suas referencias não morreram para o programa…
A duvida é realmente só essa… se o Objeto String, é criado e reside no Pool, não exitindo assim no Heap, ou se ele é criado no Heap, assim como todos, e o pool só é uma referencia a ele… a forma de só existir no Heap a mim parece algo mais logico…
…
Para vc ficar um pouco mais intrigados, o String esta no pool ? e não no heap ?? então onde esta o objetos char[] da propriedade value dentro do String ?? esta no Heap ou no Pool ?? como metade do objeto poderia estar em um lugar e metade em outro ?? pq eu posso guardar referencia do char[] fora do pool, ve esse exemplo a seguir
Invasão de Privacidade[code]import java.lang.reflect.Field;
import java.util.Arrays;
public class InvasaoDePrivacidade {
public static void main(String[] args) {
String str = "guj";
//supostamente str é imutavel e seu conteúdo é "guj" e esta no pool
ViolacaoDePrivacidade vdp = new ViolacaoDePrivacidade("guj");
//Strings antes da alteração
System.out.println("guj"); //imprimindo um literal "guj"
System.out.println(vdp); //imprimindo o conteúdo de vpd
System.out.println(str); //imprimindo o conteudo da str
System.out.println();
System.out.println("'Alterando o pool de Strings' => setCharAt(0, 'H')");
vdp.setCharAt(0, 'H');
System.out.println(vdp); //imprimindo o conteúdo alterado de vdp
System.out.println("guj"); //como um literal "guj" pode imprimir "Huj"?
System.out.println(str); //imprimindo o conteudo da str
System.out.println("guj" == "Huj"); //obviamente false
System.out.println("guj".equals("Huj")); //estranhamento true
//Como posso alterar o pool de strings e conectar o objeto
//char[] = {'g','u','j'} a outro objeto que esta no heap?
//e depois aterar seu valor no pool e no heap ?
//Por isso acredito que todos os objetos estão no Heap!
}
}
class ViolacaoDePrivacidade {
private char[] source;
private static final Field charField = getField();
private static Field getField() {
Field stringCharField = null;
try {
stringCharField = String.class.getDeclaredField("value");
stringCharField.setAccessible(true);
} catch (Exception ex) {}
return stringCharField;
}
public ViolacaoDePrivacidade(String source) {
this.source = getChars(source);
}
private char[] getChars(String source) {
char[] result = null;
try { result = (char[])charField.get(source); }
catch (Exception ex) {}
return result;
}
public void setCharAt(int index, char c) {
this.source[index] = c;
}
public @Override String toString() {
return Arrays.toString(source);
}
}[/code]
roda esse aplicativo que vc verá que o resultado é esse
[code]guj
[g, u, j]
guj
‘Alterando o pool de Strings’ => setCharAt(0, ‘H’)
[H, u, j]
Huj
Huj
false
true[/code]
“Como posso alterar o pool de strings e conectar o objeto char[] = {‘g’,‘u’,‘j’} a outro objeto que esta no heap ?”
‘e depois aterar seu valor no pool e no heap ?’
‘Por isso acredito que todos os objetos estão no Heap!’
…
Se alguem souber de uma forma pratica, de verificar se um objeto esta no Heap… tentei demonstrar que um Objeto, ViolacaoDePrivacidade, que tenho certeza estar no Heap, com seu objeto interno source que é um char[] que tb acredito estar no Heap, e que por invasão da privacidade de String, é a mesma array de char que da String “guj” …
alterei o array do objeto ViolacaoDePrivacidade, que mostrou o mesmo reflexo na string literal, pois os 2 referenciam a mesma array de chars, e assim “guj” passou a ser “Huj” …
posso estar engando, mas acredito que os objetos Strings ficam no Heap, e o que temos no pool, é apenas referencia a ele…
…
se vc inserir ao final do programa acima, apos a linha 24 System.out.println((new String(new char[] {'g','u','j'})).intern() == "guj");
System.out.println((new String(new char[] {'g','u','j'})).intern().equals("guj"));
System.out.println(new String(new char[] {'g','u','j'}));
vai obter a saida… false
false
guj