Is it safe to compare two `Integer` values with `==` in Java?
No, it's not the right way to compare the Integer
objects. You should use Integer.equals()
or Integer.compareTo()
method.
By default JVM will cache the Integer
values from [-128, 127] range (see java.lang.Integer.IntegerCache.high
property) but other values won't be cached:
Integer x = 5000;
Integer y = 5000;
System.out.println(x == y); // false
Unboxing to int
or calling Integer.intValue()
will create an int
primitive that can be safely compared with ==
operator. However unboxing a null
will result in NullPointerException
.
How do I compare two Integers?
This is what the equals method does:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
As you can see, there's no hash code calculation, but there are a few other operations taking place there. Although x.intValue() == y.intValue()
might be slightly faster, you're getting into micro-optimization territory there. Plus the compiler might optimize the equals()
call anyway, though I don't know that for certain.
I generally would use the primitive int
, but if I had to use Integer
, I would stick with equals()
.
How do I compare two Integers?
This is what the equals method does:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
As you can see, there's no hash code calculation, but there are a few other operations taking place there. Although x.intValue() == y.intValue()
might be slightly faster, you're getting into micro-optimization territory there. Plus the compiler might optimize the equals()
call anyway, though I don't know that for certain.
I generally would use the primitive int
, but if I had to use Integer
, I would stick with equals()
.
Java Compare 2 integers with equals or ==?
int
is a primitive. You can use the wrapper Integer
like
Integer first_int = 1;
Integer second_int = 1;
if(first_int.equals(second_int)){ // <-- Integer is a wrapper.
or you can compare by value (since it is a primitive type) like
int first_int = 1;
int second_int = 1;
if(first_int == second_int){ // <-- int is a primitive.
JLS-4.1. The Kinds of Types and Values says (in part)
There are two kinds of types in the Java programming language: primitive types (§4.2) and reference types (§4.3). There are, correspondingly, two kinds of data values that can be stored in variables, passed as arguments, returned by methods, and operated on: primitive values (§4.2) and reference values (§4.3).
Comparing two Integer Wrapper classes
Using the new
keyword always creates two different instances. So the following is always true:
new Integer(10) != new Integer(10)
hence the first line printing "false".
Then:
i++;
hides the unboxing and boxing. It is equivalent to:
i = Integer.valueOf(i.intValue() + 1);
As described in the Javadoc of Integer.valueOf
, values from -128 to 127 (at least) are cached: you are getting back the cached instance of Integer.valueOf(11)
for both i++
and i1++
, hence the second line printing "true".
Comparing Integer objects
For reference types, ==
checks whether the references are equal, i.e. whether they point to the same object.
For primitive types, ==
checks whether the values are equal.
java.lang.Integer
is a reference type. int
is a primitive type.
Edit: If one operand is of primitive type, and the other of a reference type that unboxes to a suitable primitive type, ==
will compare values, not references.
Related Topics
Read/Write String From/To a File in Android
How to Set a Custom Font For Entire of Application
Android 6.0 Multiple Permissions
Launching Google Maps Directions Via an Intent on Android
Java Processbuilder: Resultant Process Hangs
Will System.Currenttimemillis Always Return a Value ≫= Previous Calls
Do Line Endings Differ Between Windows and Linux
After Google Play Service Update to Version 13 I Got an Error
How to Return a Boolean from Asynctask
Android: How to Use Alarmmanager
Execution Failed For Task :App:Compiledebugjavawithjavac in Android Studio
Set Imageview Width and Height Programmatically
Difference Between Jsonobject and Jsonarray
Working Post Multipart Request With Volley and Without Httpentity