Search code examples
javaandroidequalssparse-array

Why is SparseIntArray.equals(Object) not working?


I am using a SparseIntArray and I am puzzled by this behavior:

public static SparseIntArray getArray()
{
    SparseIntArray result = new SparseIntArray();
    result.append(0, 99);
    result.append(1, 988);
    result.append(2, 636);

    return result;
}

public static void testArray()
{
    SparseIntArray first = getArray();
    SparseIntArray second = getArray();
    if( first.equals(second) )
    {
        Log.v(TAG,"first "+first.toString()+" == second "+second.toString());           
    }
    else
    {
        Log.v(TAG,"first "+first.toString()+" != second "+second.toString());
    }
}

Output:

11-06 14:53:15.011: V/fileName(6709): first {0=99, 1=988, 2=636} != second {0=99, 1=988, 2=636}

I know that using == between two objects will compare the object addresses, which in this case are different, but here I am using SparseIntArray.equals(Object other) and the intended result is not unexpected.

I am sure I can roll my own compare method, but it sounds kind of silly. What is the point of having a base class Object.equals(Object other) method if we cant rely on it?

Can someone point to any mistake?


Solution

  • I just searched for the code of SparseIntArray. If you are referring to android.util.SparseIntArray, it doesn't override equals, which means it uses the default implementation of Object class, which compares the references.

    What is the point for having a base class Object.equals(Object other) method if we cant rely on it?

    Actually, you can't rely of the base class Object.equals, since it does precisely what you don't want to do:

    public boolean equals(Object obj) 
    {
        return (this == obj);
    }
    

    It's up to the writers of any class to decide whether to override equals and give a different implementation.