预测以下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
在爪哇, 数组是第一类对象 .在上述程序中,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
如何深入比较数组内容? 如上图所示,数组。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
所以 数组。等于 无法进行深入的比较。Java为这种数组提供了另一种方法。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
阵列是如何工作的。你有工作吗? 它使用两个对象可能拥有的任何自定义equals()方法(如果它们实现的equals()方法不是Object)来比较两个对象。等于()。如果没有,该方法将继续递归地逐字段比较对象。当遇到每个字段时,它将尝试使用派生的equals()(如果存在),否则它将继续递归。 这种方法适用于循环对象图,如: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" ); } } |
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论