行业资讯 2025年08月6日
0 收藏 0 点赞 525 浏览 3081 个字
摘要 :

文章目录 1.概述 2.比较数组是否相等的不同方法 2.1 使用Array.equals比较数组 2.2 使用 Arrays.deepEquals 比较数组 2.3 按字典顺序比较数组 3.结论 1.概述 在本教……




  • 1.概述
  • 2.比较数组是否相等的不同方法
    • 2.1 使用Array.equals比较数组
    • 2.2 使用 Arrays.deepEquals 比较数组
    • 2.3 按字典顺序比较数组
  • 3.结论

1.概述

在本教程中,我们将结合示例讲解在Java中比较数组是否相等的不同方法。

2.比较数组是否相等的不同方法

2.1 使用Array.equals比较数组

为了检查两个数组在内容上是否相等,Java提供了Arrays.equals静态方法。此方法将并行遍历数组中的每个位置,并对每对元素应用==运算符。

让我们用完全相同的顺序创建两个具有相同字符串文字的不同数组:

String[] planes1 = new String[] { \"A320\", \"B738\", \"A321\", \"A319\", \"B77W\", \"B737\", \"A333\", \"A332\" };
String[] planes2 = new String[] { \"A320\", \"B738\", \"A321\", \"A319\", \"B77W\", \"B737\", \"A333\", \"A332\" };

现在,让我们断言它们是相等的:

assertThat(Arrays.equals(planes1, planes2)).isTrue();

如果我们改变第二个数组值的顺序:

String[] planes1 = new String[] { \"A320\", \"B738\", \"A321\", \"A319\", \"B77W\", \"B737\", \"A333\", \"A332\" };
String[] planes2 = new String[] { \"B738\", \"A320\", \"A321\", \"A319\", \"B77W\", \"B737\", \"A333\", \"A332\" };

我们将得到不同的结果,发现两个数组不再相等:

assertThat(Arrays.equals(planes1, planes2)).isFalse();

2.2 使用 Arrays.deepEquals 比较数组

如果我们在Java中使用简单类型,那么使用==运算符很容易。这些类型可以是基本类型或字符串文字。对象数组之间的比较可能更复杂。在我们的Arrays.deepEquals文章中完整解释了背后的原因。让我们看一个例子。

首先,让我们从一个Plane类开始:

public class Plane {
    private final String name;
    private final String model;

    // getters 和 setters
}

然后,让我们实现 hashCode 和 equals 方法:

@Override
public boolean equals(Object o) {
    if (this == o)
        return true;
    if (o == null || getClass() != o.getClass())
        return false;
    Plane plane = (Plane) o;
    return Objects.equals(name, plane.name) && Objects.equals(model, plane.model);
}

@Override
public int hashCode() {
    return Objects.hash(name, model);
}

其次,让我们创建以下两个元素数组:

Plane[][] planes1 
  = new Plane[][] { new Plane[]{new Plane(\"Plane 1\", \"A320\")}, new Plane[]{new Plane(\"Plane 2\", \"B738\") }};
Plane[][] planes2 
  = new Plane[][] { new Plane[]{new Plane(\"Plane 1\", \"A320\")}, new Plane[]{new Plane(\"Plane 2\", \"B738\") }};

现在让我们看看它们是否是真正完全相同的数组,发现是相同的数组:

assertThat(Arrays.deepEquals(planes1, planes2)).isTrue();

为了确保我们的比较工作如预期进行,让我们现在更改最后一个数组的顺序:

Plane[][] planes1 
  = new Plane[][] { new Plane[]{new Plane(\"Plane 1\", \"A320\")}, new Plane[]{new Plane(\"Plane 2\", \"B738\") }};
Plane[][] planes2 
  = new Plane[][] { new Plane[]{new Plane(\"Plane 2\", \"B738\")}, new Plane[]{new Plane(\"Plane 1\", \"A320\") }};

最后,让我们测试它们是否确实不再相等:

assertThat(Arrays.deepEquals(planes1, planes2)).isFalse();

2.3 按字典顺序比较数组

Java 9 在 Arrays 工具类中引入了一个全新的方法,称为 compare()。顾名思义,此方法允许我们按字典顺序比较两个数组。

简而言之,按字典顺序进行比较是逐个元素进行的,并且是指元素的自然顺序,例如数字的数值顺序或字符串的字母顺序。

通常情况下,如果两个数组具有相同的长度,则比较是分别在各自数组中相同索引处的每对元素之间的比较的结果。

因此,让我们看一下它的作用:

@Test
void givenSameContents_whenCompare_thenCorrect() {
    String[] array1 = new String[] { \"A\", \"B\", \"C\" };
    String[] array2 = new String[] { \"A\", \"B\", \"C\" };

    assertThat(Arrays.compare(array1, array2)).isEqualTo(0);
}

如上所示,当给定的两个数组在字典顺序上相等时,compare()返回0。

另一方面,如果两个数组具有不同的长度,则该方法比较两个数组的长度并返回结果:

@Test
void givenDifferentContents_whenCompare_thenDifferent() {
    String[] array1 = new String[] { \"A\", \"B\", \"C\" };
    String[] array2 = new String[] { \"A\", \"C\", \"B\", \"D\" };

     assertThat(Arrays.compare(array1, array2)).isLessThan(0);
     assertThat(Arrays.compare(array2, array1)).isGreaterThan(0);
     assertThat(Arrays.compare(array1, null)).isGreaterThan(0);
}

正如我们所看到的,当第一个给定的数组在字典顺序上大于第二个时,该方法返回大于零的值。否则,它返回小于零的值。

此外,一个null总是比一个非null数组在字典顺序上小。

请注意,Arrays类提供了几个重载的compare()版本,用于比较包含boolean值、byte、char和整型等原始数据的数组。

3.结论

在本教程中,我们看到了比较数组的不同方法。其次,我们看到了比较引用和值之间的区别。此外,我们研究了如何深入比较数组。最后,我们分别看到了使用 equals 和 deepEquals 进行普通比较和深度比较之间的区别。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9637.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号