Java 比较两个数组
在比较两个数组时,我们不能使用”==”运算符,因为它将比较两个数组所指向的内存块的地址。如果我们想比较数组内的元素,我们需要想出其他的方法,而不是使用算术运算符。我们都知道,数组数据结构具有连续包含元素的特性,因此我们可以使用数组类本身的size()方法来计算两个数组的大小,如果发现两个数组的大小相同,就可以开始比较索引。
示例
// Java Program to Illustrate
// Comparison of Arrays
// Using == Operators
// Importing required classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Declaring integer arrays and
// initializing them with custom values
int arr1[] = { 1, 2, 3 };
int arr2[] = { 1, 2, 3 };
// Comparing arrays if equal or not
// using == operator
if (arr1 == arr2)
// Print statement
System.out.println("Same");
else
// Print statement
System.out.println("Not same");
}
}
输出
Not same
输出解释: 在Java中,数组是第一类对象。在上面的程序中,arr1和arr2是两个不同对象的引用。所以当我们比较arr1和arr2时,两个引用变量被比较,因此我们得到的输出是 “不一样”。
如何比较数组内容?
一个简单的方法是运行一个循环并逐一比较元素。Java提供了一个直接的方法 Arrays.equals() 来比较两个数组。实际上,在Arrays类中有一系列的equals()方法,用于不同的原始类型(int, char, …等),还有一个用于Object类型(这是Java中所有类的基础)。
例子
// Java Program to Check If Two Arrays Are Equal
// Using equals() method of Arrays class
// Importing required classes
import java.util.Arrays;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Declaring integer arrays
int arr1[] = { 1, 2, 3 };
int arr2[] = { 1, 2, 3 };
// Checking if above two arrays are equal
// using equals() method
if (Arrays.equals(arr1, arr2))
// Print statement if arrays are equal
System.out.println("Same");
else
// Print statement if arrays are equal
System.out.println("Not same");
}
}
输出
Same
输出解释: 如上所述,Arrays.equals()工作正常,并对数组内容进行比较。现在的问题是,如果数组内部包含数组或其他一些引用,这些引用指的是不同的对象,但有相同的值,怎么办?例如,请参考下面的程序,如下所示。
如何深度比较数组内容
例1-A :
// Java Program to Check If Two Arrays Are Equal
// Using equals() method of Arrays class
// Importing required classes
import java.util.Arrays;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Declaring and initializing integer arrays
// having same values
// Array 1
int inarr1[] = { 1, 2, 3 };
// // Array 2
int inarr2[] = { 1, 2, 3 };
// // Array 1 contains only one element
Object[] arr1 = { inarr1 };
// Array 2 also contains only one element
Object[] arr2 = { inarr2 };
// Checking if arrays are equal or not
// using equals() method
if (Arrays.equals(arr1, arr2))
// Print statement if arrays are same
System.out.println("Same");
else
// Print statement if arrays are not same
System.out.println("Not same");
}
}
输出
Not same
输出解释: 所以Arrays.equals()不能够进行深度比较。Java为这个Arrays.deepEquals()提供了另一个方法,可以进行深度比较。
例1-B :
// Java Program to Check If Two Arrays Are Equal
// Using deepEquals() method of Arrays class
// Importing required classes
import java.util.Arrays;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Declaring and initializing integer arrays
// having same values
// Array 1
int inarr1[] = { 1, 2, 3 };
// Array 2
int inarr2[] = { 1, 2, 3 };
// Array 1 contains only one element
Object[] arr1 = { inarr1 };
// Array 2 also contains only one element
Object[] arr2 = { inarr2 };
// Checking if arrays are equal or not
// using deepEquals() method
if (Arrays.deepEquals(arr1, arr2))
// Print statement if arrays are same
System.out.println("Same");
else
// Print statement if arrays are not same
System.out.println("Not same");
}
}
输出
Same
输出解析: 现在让我们了解 ,Arrays类的deepEquals()方法是如何在内部工作的 。 它使用两个对象可能具有的任何自定义的equals()方法进行比较(如果它们有Object.equals()以外的equals()方法实现)。如果没有,这个方法将继续逐字段比较对象,递归进行。当遇到每个字段时,如果存在的话,它将尝试使用派生的equals(),否则,它将继续进一步递归。
这个方法在像这样的循环对象图上工作。A->B->C->A。它有循环检测功能,所以任何两个对象都可以被比较,而且它不会进入无尽的循环。
例1-C :
// Java Program to Check If Two Arrays Are Equal
// Using deepEquals() method of Arrays class
// Importing required classes
import java.util.Arrays;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Declaring and initializing integer arrays
// having same values
// Array 1
int inarr1[] = { 1, 2, 3 };
// Array 2
int inarr2[] = { 1, 2, 3 };
// Array 1 contains only one element
Object[] arr1 = { inarr1 };
// Array 2 also contains only one element
Object[] arr2 = { inarr2 };
// outarr1 contains only one element
Object[] outarr1 = { arr1 };
// outarr2 also contains only one element
Object[] outarr2 = { arr2 };
// Checking if arrays are equal or not
// using deepEquals() method
if (Arrays.deepEquals(outarr1, outarr2))
// Print statement if arrays are same
System.out.println("Same");
else
// Print statement if arrays are not same
System.out.println("Not same");
}
}
输出
Same
如果你发现有什么不正确的地方,或者你想分享更多关于上面讨论的主题的信息,请写评论。