Operador ==

10 respostas
E

boa tarde

estava fazendo um simulado de certificação e me deparei com as seguintes questões:

1º What all gets printed when the following gets compiled and run. Select the two correct answers.

public class test {

public static void main(String args[]) {

String s1 = abc;

String s2 = abc;

if(s1 == s2)

System.out.println(1);

else

System.out.println(2);

if(s1.equals(s2))

System.out.println(3);

else

System.out.println(4);

}

}

a) () 1
b) (X) 2
c) (X) 3
d) () 4

mas ao ver o gabarito esta que as resopostas corretas são “a” e “c” então pergunto:
o operador == não verifica a referencia dos objetos???

2º What all gets printed when the following gets compiled and run. Select the two correct answers.

public class test {

public static void main(String args[]) {

String s1 = abc;

String s2 = new String(abc);
if(s1 == s2)
    System.out.println(1);
else
    System.out.println(2);
if(s1.equals(s2))
    System.out.println(3);
else
    System.out.println(4);
}

}

a) () 1
b) (X) 2
c) (X) 3
d) () 4

acertei mas pergunto:
String s2 = “abc”; não é a mesma coisa que
String s2 = new String (“abc”);

obrigado a todos

10 Respostas

acopiara

Quando é criado a string nessa forma:
String s = valor;

Desse jeito vai ser pesquisado no pool de objetos, como ja foi criado uma igual, ele so aponta para o objeto ja criado.
Por isso q o == funciona nesse caso. Mas se pelo menos uma dessa tivesse sido crada
com o new String("abc); o == iria retornar falso.

J

String s2 = “abc”; não é a mesma coisa que
String s2 = new String (“abc”);

Não. Na realidade, existe um mecanismo de otimização da JVM chamado “Pool de Strings”, o objetivo é economizar memória com objetos String’s repetidos na aplicação, inves de criar vários objetos iguais, é criado apenas 1, e todas as String’s literais iguais referenciarão o mesmo objeto no Pool, então:

String s1 = "abc"; //cria um novo objeto e adiciona ao Pool String s2 = "abc"; //usa o objeto já criado no Pool

E quando você faz new String(“abc”), é criada uma nova instância de String, pois sempre é criada uma nova instância ao chamar new.

Só não sei se na certificação é considerado isso não viu, pois na especificação diz que, como objetos String são imutaveis, eles podem ser “cacheados”, não diz, eles serão com certeza cacheados. Acho que seria o mesmo caso do System.gc(), mas não tenho certeza, pesquise pra saber…

acopiara

Para SCJP é considerado sim!

J

:wink:

E

Não sabia dessa otimização na JVM

Obrigado pela ajuda

gbmesso

Só para ver se entendemos:

String variavel1 = “ABC”;
String variavel2 = “ABC”;

if (variavel1 == variavel2)

{

aqui da true pois usa o mesmo apontamento (cache)

}

String variavel1 = new String(“ABC”);
String variavel2 = “ABC”;

if (variavel1 == variavel2)

{

aqui da false pois estamos instanciando um novo objeto String, ou seja, dois lugares distintos na memórica

}

É isso ??? :roll:

B

isso isso isso
:wink:

aproveitando o topico sobre referencia de objetos, alguem de vcs conhecem ou tem o ObjectTools ???
num curso que fiz consegui esta ferramenta, mas acabei perdendo, gostaria muito de adquiri-la novamente pois é super legal o jeito que trata a referencia na memoria de objetos!

abraçoss!!
Se alguem tiver o ObjectTools, me mande uma PM, ok ??

gbmesso

Voltando a este assunto:
Estava pensando aqui… é melhor usar Equals do que == pois o mesmo garante a validação das strings ???

T

Bingo! É isso mesmo.

Para comparar duas strings: use equals.
Para comparar duas strings, ignorando a diferença entre minúsculas e maiúsculas: use equalsIgnoreCase.
Para comparar duas strings, ignorando acentos: veja a classe Collator. Ela tem um método de comparação de strings que permite a você ignorar acentos e a diferença entre minúsculas e maiúsculas.
Dependendo do seu locale, ele até diz que “Strasse” e “straße”, ou “Bündchen” e “buendchen” são a mesma coisa.

LPJava

bom to estudando tb para certificação… mais plo q entendi no seu primeiro exemplo… vc ja tem um objeto s1 e s2 porem com a mesma referencia por isso q as resposta eh a e c ja na segunda vc criou um new objeto string com uma referencia semelhante a do primeiro objeto, por isso que o resultado eh diferente entenda o seguinte quando vc deu new criou um novo objeto… e na primeira questao ele nao dar new… a pegada foi essa…

Criado 15 de janeiro de 2007
Ultima resposta 24 de jan. de 2007
Respostas 10
Participantes 7