Questão SCJP!

17 respostas
Fabricio_Cozer_Marti

Aê pessoas!
Não sei se esse tipo de questão cai na prova, mas tava no mock…

public static void main(String[] args) { Integer i1 = new Integer(1); Double d1 = new Double(1); System.out.println((i1.toString()==i1.toString())+", " + (d1.toString()==d1.toString())); }

Compila? Runtime Exception ? Imprime o q?

17 Respostas

ranophoenix

Acho que imprimiria: true,false

andre_a_s

Testei aqui e deu isso mesmo… mas pq a segunda opção deu false???
Um objeto.toString() é sempre igual a ele mesmo.toString() nao é??? :?

thadeurc

Eu testei utilizando java i.5 e deu false, false.

Acho que dá false pelo fato de que ele cria as Strings quando chamamos o toString e elas não estão no pool de String. Ele utiliza (provavelmente) new String() creio eu. :slight_smile:

Rafael_Nunes

Testei com a 1.4.2 e deu true, false.

Não entendi por que o segundo é false. Se ambos serão Strings “1.0”.

J

testei com 1.4.1 e deu false, false

danieldestro

Realmente não entendí pq o primeiro dá true e o segundo dá false (JDK 1.4.2).

thadeurc

O fato de ele dar true ou false no primeiro não está relacionado com a comparação feita utilizando “==” para objetos comparar o endereço de memória??? é uma resposta não confiável vendo que estamos querendo comparar conteúdos. Se não me engano no Core java (ou no Deitel, nao me lembro ao certo) eh feito um alerta que quando utilizamos “==” para comparar Strings pode dar “problema”. Sei que ele retorna true se as Strings estiverem sido criadas sem o uso do new String. POis elas estarao no Pool certo??

andre_a_s

Mas ele criou os objetos do mesmo jeito!
Como pode funcionar pra um e nao para o outro???

Integer i1 = new Integer(1); Double d1 = new Double(1); :?

Pau da JVM mesmo??? :x

Sami_Koivu

Dando uma olhada no código fonte do java.lang.Integer que eu tô usando talvez ajuda um pouco:

public static String toString(int i) {
        switch(i) {
            case Integer.MIN_VALUE: return "-[telefone removido]";
            case -3: return "-3";
            case -2: return "-2";
            case -1: return "-1";
            case 0: return "0";
            case 1: return "1";
            case 2: return "2";
            case 3: return "3";
            case 4: return "4";
            case 5: return "5";
            case 6: return "6";
            case 7: return "7";
            case 8: return "8";
            case 9: return "9";
            case 10: return "10";
        }
        char[] buf = (char[])(perThreadBuffer.get());
        int charPos = getChars(i, buf);
        return new String(buf, charPos, 12 - charPos);
    }

Ele retorna Strings não criados com new String(…) em alguns casos mais comuns(de -3 até 10 e tambem -[telefone removido]). E assim retorna true, false com meu java pelo razões ditas pelo thadeurc.

Depende da implementação do Integer.toString(). Se ele sempre retorna o mesmo objecto String para o número 1 ou não.

E o classe Double aparentemente sempre cria um novo objeto String

Muito interessante, isso, Fabrício.

-Sami

Sami_Koivu

andre_a_s:

Mas ele criou os objetos do mesmo jeito!
Como pode funcionar pra um e nao para o outro???

Integer i1 = new Integer(1); Double d1 = new Double(1); :?

Pau da JVM mesmo??? :x

Os objetos Integer e Double são criados mais ou menos do mesmo jeito, mas a comparação é entre os objetos String. Que são criados(ou não) nos metodos Integer.toString() e Double.toString().

Ou seja: Ambos seriam false se não fosse pelo código do Integer.toString() que sempre retorna o mesmo String “1” em alguns versões do java.

danieldestro

Muito tosco isso.

thadeurc

Concordo em com o daniel… muito tosco… tomara que questões como esta não caiam em provas pois deve dar dor de cabeça :wink:

danieldestro

Isso nem deveria cair na prova. Foge dos objetivos do SCJP.

Sami_Koivu

Ah, com certeza não vai cair na prova real, não.

-Sami

Fabricio_Cozer_Marti

Acho bizarro isso mesmo … sem lógica alguma!

Mas tomare que essa não caia na minha!!!

Canhoto!! olhando aqui na lista de Objetivos da prova:
na Section 8: Fundamental Classes in the java.lang Package

… , and writing code using the follwing methods of the wrapper classes (e.g Integer, Double, etc.):
[list]doubleValue[/list]
[list]floatValue[/list]
[list]intValue[/list]
[list]parseXxx[/list]
[list]getXxx[/list]
[list]toString[/list]
[list]toHexString[/list]

Eu testei utilizando java i.5 e deu false, false.

Aí sim concordo …

danieldestro

Mas saber da implementação do toString() para cada wrapper diferente, seria impossível.

Fabricio_Cozer_Marti

impossível não seria, mas que ia dar um trabalhão pra saber pra cada wrapper diferente e pra cada versao da jvm da 1.4, como o toString e os outros métodos são implementados, ia !!!

Ao meu ponto de ver, acho q eles deveriam retornar a String que está no pool! assim seria padrão o toString() para as wrappers, só chamaria o método intern(), e no final … mas de qualquer forma isso sendo tosco, ou interessante, acho q é bom saber.

Criado 4 de abril de 2005
Ultima resposta 4 de abr. de 2005
Respostas 17
Participantes 8