Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java Long datatype comparison

Why does the code below return false for long3 == long2 comparison even though it's literal.

public class Strings {      public static void main(String[] args) {         Long long1 = 256L + 256L;         Long long2 = 512L;         Long long3 = 512L;         System.out.println(long3 == long2);         System.out.println(long1.equals(long2));     } } 
like image 209
Manu Avatar asked Jan 23 '12 07:01

Manu


People also ask

How do you compare long in Java?

equals() is a built-in function in java that compares this object to the specified object. The result is true if and only if the argument is not null and is a Long object that contains the same long value as this object. It returns false if both the objects are not same.

Does == work for long in Java?

== compares references, . equals() compares values. These two Longs are objects, therefore object references are compared when using == operator. However, note that in Long id1 = 123L; literal value 123L will be auto-boxed into a Long object using Long.

Can we compare long and long in Java?

Java long compareTo() with examplescompareTo() is a built-in method in java that compares two Long objects numerically.

Can you compare long int?

Yes, that's fine. The int will be implicitly converted to a long , which can always be done without any loss of information.


2 Answers

Long is an object, not a primitive. By using == you're comparing the reference values.

You need to do:

if(str.equals(str2)) 

As you do in your second comparison.

Edit: I get it ... you are thinking that other objects act like String literals. They don't*. And even then, you never want to use == with String literals either.

(*Autobox types do implement the flyweight pattern, but only for values -128 -> 127. If you made your Long equal to 50 you would indeed have two references to the same flyweight object. And again, never use == to compare them. )

Edit to add: This is specifically stated in the Java Language Specification, Section 5.1.7:

If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

Note that long is not specifically mentioned but the current Oracle and OpenJDK implementations do so (1.6 and 1.7), which is yet another reason to never use ==

Long l = 5L; Long l2 = 5L; System.out.println(l == l2); l = 5000L; l2 = 5000L; System.out.println(l == l2); 

Outputs:

true
false

like image 105
Brian Roach Avatar answered Sep 19 '22 20:09

Brian Roach


You could also get the primitive value out of the Long object using:

str.longValue() 
like image 44
Mr_CRivera Avatar answered Sep 21 '22 20:09

Mr_CRivera