See also instanceof, interning, equals(...)
■ To test if an object belongs to a class
(or to one of its superclasses), to an interface, or whether it is an Array,
use instanceof. i.e.
String
s = "S";
if
( s instanceof Object ) is true.
if ( s instanceof String ) is true.
■ To test if two object references point to the same object or if an object reference is null, use == (double equals).
For object references, != means does not point to the same object. i.e.
String
s1 = "S";
String
s2 = "T";
if
( s1 == s2 ) is false.
. . . .
String
s1 = "S";
String
s2 = "T";
if
( s1 != s2 ) is true.
. . . .
String
s1 = null;
if
( s1 == null ) is true.
■ Remember that the toString( ) method always creates a new object. i.e.
if ( samething.toString( ) == samething.toString( ) ) will always be false because they’re always different objects.
■ The == operator doesn’t differentiate between floating point's primitive positive zero, normal zero, or negative zero. i.e.
if
( –0.0 == +0.0 ) is true. So are any
other ==
comparisons between 0.0. +0.0, and -0.0.
■ For objects only, use object.equals( anotherobject ) to see if the actual contents of two objects match.
■ You cannot use == to compare objects of different types, as a compile error will result. i.e.
String
s1 = "S";
Character
c1 = new Character( 'S' );
if
( s1 == c1 ) System.out.print(
"True" ); will
not compile.
■ To test if two objects are of the same class type (or supertype) use Object’s getClass( ) method with == . The getClass( ) method returns a Class object. i.e.
if (object1.getClass( ) == object2.getClass( )) then do something.
■ Compare objects. equals(...) does a byte-by-byte comparison on contents, ignoring the object's location. It is the opposite of == , which ignores contents and compares location pointers.
■ Unless you override the equals(...) method in an object's class, equals(...) is the same as == , which compares just pointers, not contents. Without an override you will default to using the equals(...) method from Object, which does just a == comparison. The wrappers and collections classes, plus String, all override equals(...) so they provide actual content comparisons.
■ You cannot use equals(...) for primitives or literals. i.e.
Double
D = new Double( 5 );
if
( D.equals( 5 ) ) will not
compile due to the literal 5.
Double
D = new Double( 5 );
int
d = 5;
if ( D.equals( d ) ) will not compile due to the presence of the primitive d.
■ You cannot get true results on objects of different types using equals(...). It is only for objects of the same type. i.e.
Character
C = new Character( 'A' );
Object
O = new StringBuffer( "A" );
String S = "A";
if ( C.equals( O ) ) is false
if ( S.equals( C ) ) is false
if ( S.equals( O ) ) is false
■ You cannot use equals(...) between different wrapper types as it will always returns a false. i.e.
Double
D = new Double ( 2.0 );
Float
F = new Float( 2.0 );
if (D.equals( F) ) is false due to different object types
■ You cannot use equals(...) for
StringBuffer,
as StringBuffer does
not provide an override. i.e.
StringBuffer
s1 = new StringBuffer( "ABC" );
StringBuffer
s2 = new StringBuffer( "ABC" );
if
( s1.equals(s2) ) is
false
However...
String
s1 = new String( "ABC" );
String
s2 = new String( "ABC" );
if ( s1.equals( s2 ) ) is true
■
You cannot ever check an object for null with equals(...).
That’s because with null there's no actual null
object to which to compare.
You must say if (obj == null)
instead. i.e.
if ( object.equals( null ) ) runs and it returns false if the object is real.
But it gives a NullPointerException if the object in question was actually null.
■ Unlike the == operator, the equals(...) method treats two wrapper NaNs as equal. i.e.
Float
F1 = new Float( Float.NaN );
Float
F2 = new Float( Float.NaN );
if
( F1.equals( F2 ) ) returns
true
if ( F1 == F2 ) ) returns false
■ Unlike the == operator, which treats all manners of floating point zeroes as unequal, equals(...) treats wrapper contents of floating point +0.0 as equal to 0.0. i.e.
In wrappers:
|
= = returns |
equals(...)
returns |
|
+0.0 to 0.0 |
unequal |
equal |
|
+0.0 to -0.0 |
unequal |
unequal |
|
0.0 to -0.0 |
unequal |
unequal |