parseBoolean() VS valueOf()

Qual é a diferença entre os métodos parseBoolean(String s) e valueOf(String s) da classe Boolean?

Eu estava vendo na documentação, e ambos fazem exatamente a mesma coisa. Ambos pegam a String s e verificam se ela não é null e se é, ignorando case, igual a “true”. Se for, então o método retorna true. Senão, retorna false.

Se elas fazem exatamente a mesma coisa, porque existem dois métodos? Tem que haver alguma diferença…

O mesmo ocorre com os pares Float.parseFloat()/Float.valueOf(), Double.parseDouble()/Double.valueOf() … Qual a diferença entre eles?

Obrigado. :wink:

Posso estar enganado mas penso que a única diferença é que um retorna um boolean primitivo enquanto que o outro retorna um Boolean em forma de objecto.

É exatamente o que o colega falou. O parseBoolean retorna um boolean e o valueOf retorna um Boolean (de valor Boolean.TRUE ou Boolean.FALSE).

No caso dos outros, o parse irá retornar o número num tipo primitivo (double, float, etc.) e o valueOf irá fazer o seguinte:
Retornar um objeto já pré-criado e armazenado, caso o número varie de -127 até 128.
Retonar um novo objeto, caso o número esteja fora desse intervalor.

Portanto:

Float.valueOf(10) == Float.valueOf(10) mas Float.valueOf(1000) != Float.valueOf(1000)

[quote=ViniGodoy]É exatamente o que o colega falou. O parseBoolean retorna um boolean e o valueOf retorna um Boolean (de valor Boolean.TRUE ou Boolean.FALSE).

No caso dos outros, o parse irá retornar o número num tipo primitivo (double, float, etc.) e o parse irá fazer o seguinte:
Retornar um objeto já pré-criado e armazenado, caso o número varie de -127 até 128.
Retonar um novo objeto, caso o número esteja fora desse intervalor.

Portanto:

Float.valueOf(10) == Float.valueOf(10) mas Float.valueOf(1000) != Float.valueOf(1000)[/quote]

Nossa, essa implementação do valueOf é doida mesmo… :shock: ViniGodoy, tem alguma explicação para ser assim?

Segundo eles é uma otimização. É muito comum usar essa faixa de valores para índices básicos, que podem estar presentes num map. Portanto, não tem porque criar esses objetos múltiplas vezes.

Obviamente, mesmo que
Float.valueOf(1000) != Float.valueOf(1000)

Também observa-se que:
Float.valueOf(1000).floatValue() == Float.valueOf(1000).floatValue() e
Float.valueOf(1000).equals(Float.valueOf(1000));

Lembre-se == com objetos só compara se os dois referem-se à mesma posição de memória.