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)); } }
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.
== 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.
Java long compareTo() with examplescompareTo() is a built-in method in java that compares two Long objects numerically.
Yes, that's fine. The int will be implicitly converted to a long , which can always be done without any loss of information.
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
You could also get the primitive value out of the Long object using:
str.longValue()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With