Win a copy of The Java Performance Companion this week in the Performance forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Why is this happening?

 
Derek Mason
Greenhorn
Posts: 13
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I passed scjp exam long back but I still have a question!
How can this return true???
new Float(Float.NaN).equals(new FLoat(Float.NaN))
I thought comparison with NaNs always return false!
thanks.
Derek.
 
Douggie Fox
Greenhorn
Posts: 19
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Derek,
It's because Double objects are immutable and as a result Java just puts 1 object into memory rather than 2. The comparison you're making is on object references not values.

HTH
Paul
 
Derek Mason
Greenhorn
Posts: 13
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
If that were the case:
System.out.println(new Float(Float.NaN)==new Float(Float.NaN));
Would print true but it does not!
 
Denis Anoykin
Greenhorn
Posts: 8
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
The object of Float class contains member with primitive type 'float'
Thus I think in case:
new Float(Float.NaN).equals(new FLoat(Float.NaN))
Java compares float primitives into the Float objects
And in this case:
System.out.println(new Float(Float.NaN)==new Float(Float.NaN));
Java compares refernces to Float objects. And there are different references.
 
Thomas Paul
mister krabs
Ranch Hand
Posts: 13974
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
When in doubt, check the API:
for f1.equals(f2)
If f1 and f2 both represent Float.NaN, then the equals method returns true, even though Float.NaN==Float.NaN has the value false.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic