String

16 respostas
D

Quando eu faço assim:

Sao criados dois objetos?

Um que seria o new String(…) e o outro “Marcelo” que vai no construtor?

16 Respostas

Josenir

Dota:
Quando eu faço assim:

Sao criados dois objetos?

Um que seria o new String(…) e o outro “Marcelo” que vai no construtor?

Não. Não são criados dois objetos. String nome apenas declara uma variável do tipo String sem alocar memória.
Quando se chama new String(“Marcelo”) apenas se está criando um objeto do tipo String já com o conteúdo “Marcelo”.

Se fisesse da seguinte forma:

String nome = ""; nome = "Marcelo";

Aí neste caso a primeira linha estaria criando um objeto do tipo String com conteúdo igual a String em branco. E na segunda linha estaria criando um novo objeto em um novo endereço de memória (que seria atribuído à variável nome) com a String “Marcelo”. Mas mesmo neste último caso ainda existiria apenas um objeto, o último com a Strin “Marcelo”. O primeiro seria desalocado da memória.

Mas atenção: esta é uma particularidade dos objetos do tipo String. É o conceito de imutabilidade da classe String. Não acontece com tipos primitivos ou outros objetos.

edu_fernandes

Ao declarar

Você esta dizendo para o SO ajustar um espaço em memória para um objeto String (classe) que logo mais poderá ser instanciado.

Ao instancia-lo

Você atribui valor a ela.

É o mesmo efeito de quando você cria sua classe e instancia um objeto do mesmo tipo.

Mas é um único objeto e não dois.

Entendeu?
Não sei se consegui ser muito claro na explicação.

evertonsilvagomesjav

Acho que a duvida do amigo esta respondida né? Se sim edit e coloca resolvido ai.

D

E nesse caso, são quantas Strings então?

String g = "neto"; g.concat("lopes"); System.out.println(g);

Gustavo_Santos

Acho que a dúvida dele é referênte ao pool String.

No livro da Keity ela diz que isso:

String a = new String("abc");

O objeto String “abc” é criando no pool quando a classe é carregada -
Depois a cópia desse array de char “abc” é passada ao construtor String
em runTime, e um novo objeto é criando, dessa vez no heap.

2 objetos.

Gustavo_Santos

Aqui são criados 3 objetos.
Quando a classe é carrega se cria os objetos “neto” e “lopes”.
Em Runtime é criando o objeto “netolopes” que pelo fato de não ser referenciando
está elegível ao GC, assim com o objeto lopes.

D

Entao essa sintaxe é criado dois objetos mesmo ??

ViniGodoy

[quote=Dota]Entao essa sintaxe é criado dois objetos mesmo ??

Sim, são dois objetos. O objeto “Marcelo” e o que é criado após o new, com o conteúdo idêntico.

D

[quote=ViniGodoy]

Dota:
Entao essa sintaxe é criado dois objetos mesmo ??

Sim, são dois objetos. O objeto “Marcelo” e o que é criado após o new, com o conteúdo idêntico.

Outra duvida que tenho quando faço:

“Marcelo” além de ir para o pool de strings ele vai pro heap tb? Ocorre algo como new String(“Marcelo”) implicitamente? Ou não o objeto so reside no pool.

Quando faço:

Acontece um autoboxing e é feito implicitamente new Integer(5) que vai para o Heap e tb para um cache? Ou so no cache?

ViniGodoy

Quando você faz

Somente 1 string é criada. Ela vai para o pool e a referência dela também é guardada na sua variável. Nada fica no heap.

Quando você faz:

O compilador transforma em:

Se o número estiver no intervalor que cabe em um byte (de -126 até 127), é retornado o objeto do Pool.
Caso contrário, o valueOf cria um novo objeto.

Note que não é dado um new. Isso aqui:

Sempre cria um novo objeto no heap.

O “5” literal também não cria nada. O Pool com os Integers é criado assim que a VM é carregada.
De brinde, você já tem 255 objetos do tipo Integer lá dentro.

D

Então, se eu fizer isso por exemplo:

Isso mesmo?

ViniGodoy

Sim, isso mesmo.

No java 7 o pool de objetos Integer será configurável. Mas até então, está certo o que vc falou.

E tem essa situação também:

String x = new String("Marcelo"); String y = new String("Marcelo");

Aqui são criados 3 objetos. 2 Strings com o new, e 1 no pool. O do pool é reaproveitado na linha 2.

D

Obrigado amigo.

evertonsilvagomesjav

Vini como vai ser o pool dos Integers no java 7?

ViniGodoy

Igualzinho, só vai ter um parâmetro na inicialização da VM para dizer quantos inteiros você quer lá. A sintaxe exata eu não lembro, mas já vi o Entanglement, o Thingol e acho que o Bezier Curve postando por aí (eu nem me ligo tanto nas novidades do próximo Java assim, prefiro deixar pra estudar depois que ele existir).

evertonsilvagomesjav

Igualzinho, só vai ter um parâmetro na inicialização da VM para dizer quantos inteiros você quer lá. A sintaxe exata eu não lembro, mas já vi o Entanglement, o Thingol e acho que o Bezier Curve postando por aí (eu nem me ligo tanto nas novidades do próximo Java assim, prefiro deixar pra estudar depois que ele existir).

Bacana de mais!!! Eu andei lendo por ai algumas coisas tb sobre o 7, mas nao vi nada á respeito disso eheh. Vlw Vini.

Criado 20 de setembro de 2010
Ultima resposta 21 de set. de 2010
Respostas 16
Participantes 6