您的位置:首页 > 移动开发 > Objective-C

Objects中的方法深比较:deepEquals

2018-09-23 20:29 393 查看

Objects中的方法深比较:deepEquals
Objects于Object类似于Collections对于Collection,它有一些非常有意思的方法,值得我们看一下,这里我们看下Objects的deepEquals方法。
比较两个对象是否相等,我们一般直接比较地址(equals()默认就是比较地址),
但是有的时候,我们想比较两个数组是否相同,直接比较地址显然不合适,这时除了重写equals,我们可以选择deepEequals() 。
源码如下:

public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}

源码中,我们可以看出deepEquals() 首先还是比较两个对象的地址,这与equals方法一样,直接看第三个else中的代码块,Objects的deepEquals()是基于Arrays的deepEquals0()实现的,代码如下:

static boolean deepEquals0(Object e1, Object e2) {
assert e1 != null;
boolean eq;
if (e1 instanceof Object[] && e2 instanceof Object[])
eq = deepEquals ((Object[]) e1, (Object[]) e2);
else if (e1 instanceof byte[] && e2 instanceof byte[])
eq = equals((byte[]) e1, (byte[]) e2);
else if (e1 instanceof short[] && e2 instanceof short[])
eq = equals((short[]) e1, (short[]) e2);
else if (e1 instanceof int[] && e2 instanceof int[])
eq = equals((int[]) e1, (int[]) e2);
else if (e1 instanceof long[] && e2 instanceof long[])
eq = equals((long[]) e1, (long[]) e2);
else if (e1 instanceof char[] && e2 instanceof char[])
eq = equals((char[]) e1, (char[]) e2);
else if (e1 instanceof float[] && e2 instanceof float[])
eq = equals((float[]) e1, (float[]) e2);
else if (e1 instanceof double[] && e2 instanceof double[])
eq = equals((double[]) e1, (double[]) e2);
else if (e1 instanceof boolean[] && e2 instanceof boolean[])
eq = equals((boolean[]) e1, (boolean[]) e2);
else
eq = e1.equals(e2);
return eq;
}

源码中先判断要比较的对象是不是常见的数组类型(byte[]、short[]、int[]、long[]、char[]、float[]、double[]、boolean[]),是的话,就调用Arrays类中equals()方法,逐个对数组元素比较:

public static boolean equals(boolean[] a, boolean[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;

int length = a.length;
if (a2.length != length)
return false;

for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;

return true;
}

如果比较对象是object[],则是调用Arrays的deepEquals()方法进行比较:对象比较多了个非null判断,for里面判断对象是否相等,最终还是调用的Object的equals()方法:

public static boolean deepEquals(Object[] a1, Object[] a2) {
if (a1 == a2)
return true;
if (a1 == null || a2==null)
return false;
int length = a1.length;
if (a2.length != length)
return false;

for (int i = 0; i < length; i++) {
Object e1 = a1[i];
Object e2 = a2[i];

if (e1 == e2)
continue;
if (e1 == null)
return false;

// Figure out whether the two elements are equal
boolean eq = deepEquals0(e1, e2);

if (!eq)
return false;
}
return true;
}
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: