我使用的是SparseIntArray
,我对这种行为感到困惑:
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());
}
}
输出:
11-06 14:53:15.011: V/fileName(6709): first {0=99, 1=988, 2=636} != second {0=99, 1=988, 2=636}
我知道在两个对象之间使用==会比较对象地址,在这种情况下是不同的,但在这里我使用SparseIntArray.equals(Object other)
并且预期的结果并不意外。
我确信我可以推出自己的比较方法,但听起来有些愚蠢。如果我们不能依赖它,那么有一个基类Object.equals(Object other)
方法有什么意义呢?
有人可以指出任何错误吗?
答案 0 :(得分:3)
我刚刚搜索了SparseIntArray
的代码。如果您引用android.util.SparseIntArray,则它不会覆盖equals
,这意味着它使用Object
类的默认实现,它会比较引用。
如果我们不能依赖它,那么有一个基类Object.equals(Object other)方法有什么意义呢?
实际上,您不能依赖基类Object.equals,因为它确实是您不想做的事情:
public boolean equals(Object obj)
{
return (this == obj);
}
由任何类的作者决定是否覆盖equals
并提供不同的实现。
答案 1 :(得分:1)
@Eran是对的,Object.equals(Object)不会删除它。
我制作了一个简单的静态方法来比较两个实例
public static boolean compareSame( SparseIntArray first, SparseIntArray second )
{
// compare null
if( first == null )
{
return (second == null);
}
if( second == null )
{
return false;
}
// compare count
int count = first.size();
if( second.size() != count )
{
return false;
}
// for each pair
for( int index = 0; index < count; ++index )
{
// compare key
int key = first.keyAt(index);
if( key != second.keyAt(index))
{
return false;
}
// compare value
int value = first.valueAt(index);
if( second.valueAt(index) != value)
{
return false;
}
}
return true;
}
我可能最终会得到我自己的SparseIntArray版本并覆盖equals方法,我认为这样更干净。
[编辑]以下是实现等于
的子类的代码import android.util.SparseIntArray;
public class SparseIntArrayComparable extends SparseIntArray {
@Override
public boolean equals( Object obj ) {
if( obj instanceof SparseIntArray ) {
SparseIntArray other = (SparseIntArray)obj;
// compare count
int count = size();
if( count != other.size() )
return false;
// for each pair
for( int index = 0; index < count; ++index ) {
if( keyAt(index) != other.keyAt(index))
return false;
if( valueAt(index) != other.valueAt(index) )
return false;
}
return true;
}
else
return false;
}
}