Arrays中的euqals()和Object中的euqals()方法的区别(是否逐个遍历元素的值)
Arrays中的euqals()和Object中的euqals()方法的区别(思考其是否逐个遍历的问题)
如果我们得到了两个数组,int arr1[]和int arr2[],如果我们想要比较这两个数组是否里面的元素都是相等的,那么比较的思路应该是取出两个数组中的元素然后逐个进行比较才对,那么如果直接使用arr1.equals(arr2)能否实现这个过程:
-
public class TestArrayEquals {
-
static int arr1[] = { 1, 2, 3, 4, 5 };
-
static int arr2[] = { 1, 2, 3, 4, 5 };
-
-
public static boolean compare(int a[], int b[]) {
-
Boolean result = a.equals(b);
-
return result;
-
}
-
-
public static void main(String[] args) {
-
System.out.println(TestArrayEquals.compare(arr1, arr2));
-
}
-
-
}
测试的结果:
我们看下其实定义的两个数组是两个对象,其实这调用的是object的equals()方法,在源码中:
-
public boolean equals(Object obj) {
-
return (this == obj);
-
}
Object类,它是所有类的超类,两个对象进行比较,如果是基本数据类型,那么比较的是两个数的值是否相等,而对象比较的是地址值,如果没有重写equals方法,那么默认使用父类Object的equals方法,这个方法内部默认使用==进行对象的比较,对象是引用类型,而引用类型比较的是地址值,如果是两个不同的对象的话就会返回false。而这里就是调用了object的equals()方法,由于这两个数组是不同的对象,所以进行底层地址值比较的时候就会返回false。
如果我们将上面的代码修改一下:
-
import java.util.Arrays;
-
-
public class TestArrayEquals {
-
static int arr1[] = { 1, 2, 3, 4, 5 };
-
static int arr2[] = { 1, 2, 3, 4, 5 };
-
-
public static boolean compare(int a[], int b[]) {
-
Boolean result = a.equals(b);
-
return result;
-
}
-
-
public static void main(String[] args) {
-
System.out.println(Arrays.equals(arr1, arr2));
-
}
-
-
}
我们直接调用的是Arrays工具类里面的equals方法,来比较我们上面的两个数组的话,就会得到下面的执行结果:
Arrays工具类里面的equals方法是将传入的两个数组便利其中的元素,然后逐个比较其值是否相等:
-
public static boolean equals(int[] a, int[] 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;
-
}