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; }阅读更多
相关文章推荐
- [Java]hashCode和equals方法的比较
- Java中两个对象的比较 equals()方法和==号的区别
- 知识点干货—关于equals方法,Hashcode方法和两个对象的比较
- java中equals方法和“==”的比较
- Integer类型数据比较大小问题:(Integer定义的是对象,养成使用equals方法的好习惯)
- String类的equals方法和==方法的比较
- 一个变量,一个常量,用equals()方法比较,让咱们,看看到底是常量放前面好啊,还是变量放前面好
- Java基础(二):==和Equals方法的比较
- String使用equals方法和==分别比较的是什么?
- 判断比较两个对象是否是一个对象(equals方法)
- ==与equals()方法比较
- 【读后感】hashcode和equals方法。 以及捎带提提String使用equals方法和==分别比较的是什么?
- Java中Arrays类的两个方法:deepEquals和equals
- 比较两个对象的内容是否相等 重写object 的equals方法
- 包装类对象之间值的比较,全部使用 equals 方法比较
- equals()方法 和 ==的比较
- 编写一个比较完美的equals方法的建议(java)
- java中equals方法和“==”的比较
- java中equals方法和“==”的比较
- Java学习笔记33. 比较两个数组是否相等 Arrays.equals(A,B)方法