如何在 Java 中比较两个数组?
预测后续 Java 程序的输出。
class Test
{
public static void main (String[] args)
{
int arr1[] = {1, 2, 3};
int arr2[] = {1, 2, 3};
if (arr1 == arr2) // Same as arr1.equals(arr2)
System.out.println("Same");
else
System.out.println("Not same");
}
}
输出:
Not Same
在 Java 中,数组是第一类对象。在上面的程序中,arr1 和 arr2 是对两个不同对象的两个引用。因此,当我们比较 arr1 和 arr2 时,会比较两个参考变量,因此我们得到的输出为“不相同”(更多示例参见本)。
如何比较数组内容? 一个简单的方法是运行一个循环,逐个比较元素。Java 提供了一个直接的方法 Arrays.equals() 来比较两个数组。实际上,对于不同的基元类型(int、char,..一个用于对象类型(它是 Java 中所有类的基础)。
// we need to import java.util.Arrays to use Arrays.equals().
import java.util.Arrays;
class Test
{
public static void main (String[] args)
{
int arr1[] = {1, 2, 3};
int arr2[] = {1, 2, 3};
if (Arrays.equals(arr1, arr2))
System.out.println("Same");
else
System.out.println("Not same");
}
}
输出:
Same
如何深度比较数组内容? 如上所述,Arrays.equals()工作正常,可以比较数组内容。现在的问题是,如果数组内部包含数组或者引用不同对象但具有相同值的其他引用,该怎么办。例如,请参见以下程序。
import java.util.Arrays;
class Test
{
public static void main (String[] args)
{
// inarr1 and inarr2 have same values
int inarr1[] = {1, 2, 3};
int inarr2[] = {1, 2, 3};
Object[] arr1 = {inarr1}; // arr1 contains only one element
Object[] arr2 = {inarr2}; // arr2 also contains only one element
if (Arrays.equals(arr1, arr2))
System.out.println("Same");
else
System.out.println("Not same");
}
}
输出:
Not Same
所以 Arrays.equals() 是不能做深度比较的。Java 为这个 Arrays.deepEquals()提供了另一种方法,可以进行深度比较。
import java.util.Arrays;
class Test
{
public static void main (String[] args)
{
int inarr1[] = {1, 2, 3};
int inarr2[] = {1, 2, 3};
Object[] arr1 = {inarr1}; // arr1 contains only one element
Object[] arr2 = {inarr2}; // arr2 also contains only one element
if (Arrays.deepEquals(arr1, arr2))
System.out.println("Same");
else
System.out.println("Not same");
}
}
输出:
Same
【Arrays.deepEquals()是如何工作的? 它使用两个对象可能有的任何自定义 equals()方法来比较这两个对象(如果它们实现了一个 equals()方法而不是 Object.equals())。如果没有,这个方法将继续逐字段递归地比较对象。当遇到每个字段时,它将尝试使用派生的 equals()如果它存在的话,否则它将继续进一步递归。 这个方法在这样一个循环 Object 图上工作:A- > B- > C- > A .它有循环检测,所以任意两个对象都可以比较,永远不会进入一个无休止的循环(来源:https://code.google.com/p/deep-equals/)。
练习:预测以下程序的输出
import java.util.Arrays;
class Test
{
public static void main (String[] args)
{
int inarr1[] = {1, 2, 3};
int inarr2[] = {1, 2, 3};
Object[] arr1 = {inarr1}; // arr1 contains only one element
Object[] arr2 = {inarr2}; // arr2 also contains only one element
Object[] outarr1 = {arr1}; // outarr1 contains only one element
Object[] outarr2 = {arr2}; // outarr2 also contains only one element
if (Arrays.deepEquals(outarr1, outarr2))
System.out.println("Same");
else
System.out.println("Not same");
}
}
如果您发现任何不正确的地方,或者您想分享更多关于上面讨论的主题的信息,请写评论
版权属于:月萌API www.moonapi.com,转载请注明出处