Java 比较两个数组

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

如果你发现有什么不正确的地方,或者你想分享更多关于上面讨论的主题的信息,请写评论。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程