[quote=Raff]Pessoal to com uma dúvida cruel sobre o pool de String… segue o código abaixo…
String s = new String ( "JUST" ) ;
String str = s . toUpperCase() ;
String str2 = "JUST";
System.out.println(s == str);
System.out.println(s == str2);
Pessoal o Primeiro System.out.println() o resultado é true…
Agora o Segundo é false… :roll: Boie alguem ai tem alguma opinião sobre o assunto ???[/quote]
Amigo, posso estar enganado, mas aí vai uma justificativa.
Em str vc colocar a referência a “s” em caixa alta.
Em str2, você cria uma nova referência de memória para outra variável. Dessa forma, a melhor maneira de se comparar as Strings seria com os métodos equals ou equalsIgnoreCase, da classe String.
Até onde eu sei, não se pode comparar dois objetos String com o operador “=” e sim com os esses métodos que te passei.
No primeiro caso, o método toUpperCase() verifica se há caracteres que precisam ser modificados na String, como ela já está toda em maiuscula, o método retorna a mesma String.
No segundo caso, criar uma String através do construtor, força a criação de uma cópia da instância do objeto String passado como parâmetro, o que a torna diferente de uma criação literal.
Importante salientar que com o operador == para comparação de objetos, você está comparando as referências e não o valor dos objetos(que deve ser feito com o método equals()). Sendo assim, como o método toUpperCase retorna o mesmo objeto, então as referências estão apontando para um só, logo, o retorno é ‘true’, e na segunda comparação como o construtor cria uma nova instância do objeto, as referências não estão apontando para o mesmo objeto, logo, o resultado é false.
Eu digo que essa questão foi mal-escrita (é claro que deve ser um mock que você pegou na Internet) e que se baseia em um detalhe de implementação do método toUpperCase. É que esse método, na implementação da Sun, faz o seguinte (e isso não está documentado no Javadoc) :
Primeiro passa todos os caracteres para maiúscula.
Se nenhum dos caracteres foi alterado, retorna a própria string, senão retorna uma nova string, cujos caracteres foram alterados para maiúsculas.
Isso não cai com esse grau de detalhes desse jeito na prova de certificação.
Eu achei que as duas respostas deveriam ser false, mas devido a esse detalhe de implementação, deu true e false.
vc está criando 2 objetos… um no pool de Strings com o valor “JUST” e outro (new) referenciando esse valor no pool.
2 - qdo vc faz
vc não está criando nenhum objeto, já que o resultado de s.toUpperCase(); já existe no pool, então str apenas receberá o valor de endereço que s, tendo como consequência dos 2 apontando para o mesmo lugar no pool.
3 - qdo vc faz
da mesma forma, nenhum objeto é criado já que vc nao usa new e “JUST” já existe no pool. Neste caso, dá false com 1 porque str2 tem um endereço de memória apontando para “JUST” e s tem outro endereço de memória apontando para “JUST”.
Para inserir uma string no pool de strings, só existem duas maneiras:
a) Usar o método “intern”;
ou
b) Usar uma constante string.
Quando você cria uma nova string (com new String(“JUST”), por exemplo), ela não está no pool ainda; ela só será “internada” se você pedir. Leia com atenção o javadoc de String.intern.
poder pode… desde que eles se referencie para o mesmo objeto.
s referencia para um objeto o qual tem um valor JUST
str recebe uma string literal com o valor JUST mais nao aponta para o mesmo objeto que o s. agora se fosse com o equals() seria true, true a resposta.
[quote]Eu digo que essa questão foi mal-escrita (é claro que deve ser um mock que você pegou na Internet) e que se baseia em um detalhe de implementação do método toUpperCase. É que esse método, na implementação da Sun, faz o seguinte (e isso não está documentado no Javadoc) :
Primeiro passa todos os caracteres para maiúscula.
Se nenhum dos caracteres foi alterado, retorna a própria string, senão retorna uma nova string, cujos caracteres foram alterados para maiúsculas.
Isso não cai com esse grau de detalhes desse jeito na prova de certificação.
Eu achei que as duas respostas deveriam ser false, mas devido a esse detalhe de implementação, deu true e false. [/quote]
Eu peguei essa questão no javaRanch. Mas ela é muito confusa mesmo cara.
Pessoal por que a variavel str2 não aponta para o mesmo Objeto que o s está apontando como fez o mesmo quando chamo o metodo toUpperCase() ???
Como vocês explicaram: tipo no primeiro caso retorna verdadeiro por que o metodo toUpperCase() verificou que não tinha como alterar a String já que a mesma estava já em maiusculo. Então o str aponta para onde o s aponta já que temos uma String no Pool…(é isso ???).
Mas no segundo caso teria que acontecer a mesma coisa (PENSO EU) por que a String “JUST” já está no pool então porque o str2 não aponto para s ?? :roll:
na verdade quando executou new String() para s, a variável nao foi para o pool, conforme o thingol explicou, pelo contrário, forçamos a criacao de um novo objeto da classe String() na heap. Como str recebe diretamente o valor de s, as 2 apontam para o mesmo lugar… str2 é diferente… o objeto foi criado no pool (sem new), como ainda nao tinha JUST no pool, entao str2 é o unico cara que aponta para JUST do pool. Enquanto isso s e str apontam para um JUST que está na heap.
é isso cadu, vai arrebentar amanha q to ligado… so para completar o que ele falou e facilitar quando ele faz isso:
String s = new String ( "JUST" ) ;
//ele = (aponta) para um new objeto que tem o valor ("JUST");
String str2 = "JUST";
//= (aponta) recebe a string literal e poe ela no pool
//aonde tem esse JUST no pool? lugar nenhum temos
//lá um objeto criado por s,q tem o valor, mais == nao testa valor e se referencias
veja isso:
class Integ{
public static void main(String args[]){
Integer it = new Integer(10);
Integer it2 = 10;
System.out.println(it==it2);
}
}
/* vc acha q vai imprimir true? Segundo o que ja
discutimos aqui?*/
A resposta da pergunta do Cadu e do Camilo é as duas é false…
Do camilo acontece que cria um Objeto Integer 10 e a outra é colocada no pooll…
a do Cadu ultrapassa o limite que é de 127 cria-se dois objetos diferentes (Achu que é isso …)
[quote=Raff]A resposta da pergunta do Cadu e do Camilo é as duas é false…
Do camilo acontece que cria um Objeto Integer 10 e a outra é colocada no pooll…
a do Cadu ultrapassa o limite que é de 127 cria-se dois objetos diferentes (Achu que é isso …)[/quote]
é isso ai galera… realmente tb usei o termo “aponta” mais… to ciente que tenho q falar “referencia” so para facilitar o entendimento… hehe cadu… quero ver amanha vc postando aqui PASS - SCJP!!
quero fazer daqui a 2 semana falta eu tomar coragem e marcar a prova… algo que nao tive ainda… hehe. .sempre dar o frio na barriga… e medo de ver fail la de novo como aconteceu em abril! :?
bora ver ne hehe valeu pela força! e no dia que eu fizer… o resultado… o primeiro a saber vai ser a galera do guj com as dicas quentes da prova… por a kbeça ainda vai estar fresquinha com as questoes
[quote=LPJava]é isso ai galera… realmente tb usei o termo “aponta” mais… to ciente que tenho q falar “referencia” so para facilitar o entendimento… hehe cadu… quero ver amanha vc postando aqui PASS - SCJP!!
flw!![/quote]
valeu hehe… faço questao de memorizar algumas questoes e colocar aki como dica