在Java中比较数组
最后修改:2020年10月30日
1.概述
在本教程中,我们将看看Java中比较数组的不同方式。我们将介绍传统方法,还将看到一些使用示例λ表达式。
2.比较数组
我们会在Java中比较数组,我们知道,数组是对象。因此,让我们来刷新一些基本概念:
- 对象有引用和值
- 两个相等的引用应该指向相同的值
- 两个不同的值应该有不同的引用
- 两个相等的值不一定具有相同的引用
- 原始值只对每个值进行比较
- 字符串字面值只对每个值进行比较
2.1。比较对象引用
如果有两个引用指向同一个数组,则总是会得到一个结果真正的在与的相等比较中= =操作符。
让我们来看一个例子:
String [] planes1 = new String[]{“A320”、“B738”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};String[] planes2 = planes1;
首先,我们创建了一个平面模型数组planes1。然后,我们创建planes2,引用planes1。通过这样做,我们创建两个引用到内存中相同的数组。因此,“planes1 = = planes2”表达式将返回真正的。
对于数组,equals ()方法与==操作符相同。所以,planes1.equals (planes2)返回真正的因为这两个引用引用的是同一个对象。一般来说,array1.eqauls (array2)将返回真正的当且仅当表达式”array1 = = array2”返回真正的。
让我们断言这两个引用是否相同:
为了(planes1) .isSameAs (planes2);
现在,让我们确保引用的值planes1和引用的是一样的吗planes2。因此,我们可以改变引用的数组planes2,并检查这些更改是否对所引用的数组有任何影响planes1:
planes2 [0] = " 747 ";
为了最终看到它的工作原理,让我们来做一下断言:
为了(planes1) .isSameAs (planes2);为了(planes2 [0]) .isEqualTo(“747”);为了(planes1 [0]) .isEqualTo(“747”);
通过这个单元测试,我们能够通过引用来比较两个数组。
然而,我们只是证明了这一点一个引用一旦赋值给另一个的值,就会引用相同的值。
现在我们将创建两个具有相同值的不同数组:
String [] planes1 = new String[]{“A320”、“B738”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};String [] planes2 = new String[]{“A320”、“B738”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};
因为它们是不同的物体,我们可以肯定它们是不一样的。因此,我们可以比较它们:
为了(planes1) .isNotSameAs (planes2);
总之,在本例中,内存中有两个数组,它们包含相同的内容字符串值的顺序完全相同。然而,不仅引用数组的内容不同,引用本身也不同。
2.2。比较数组长度
数组的长度都可以比较它们的元素类型,或者是否填充了它们的值。
让我们创建两个数组:
final String[] planes1 = new String[] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"};final Integer[] quantities = new Integer[] {10, 12, 34, 45, 12, 43, 5, 2};
这是两个具有不同元素类型的不同数组。在这个数据集中,我们注册,作为一个例子,每个型号的飞机在仓库中存储了多少架。现在让我们对它们运行单元测试:
为了(planes1) .hasSize (8);为了(数量).hasSize (8);
通过这个,我们证明了两个数组都有8个元素长度属性为每个数组返回正确的元素数量。
2.3。比较数组和Arrays.equals
到目前为止,我们只根据数组的对象标识进行比较。另一方面,为了检查两个数组的内容是否相等,Java提供了Arrays.equals静态方法。该方法将并行遍历数组中的每个位置,并应用==操作符,对于每一对元素。
让我们用相同的方法创建两个不同的数组字符串完全相同顺序的文字:
String [] planes1 = new String[]{“A320”、“B738”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};String [] planes2 = new String[]{“A320”、“B738”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};
现在,让我们断言它们是相等的
为了(数组。=(planes1, planes2)).isTrue();
如果我们改变第二个数组的值顺序:
String [] planes1 = new String[]{“A320”、“B738”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};String [] planes2 = new String[]{“B738”、“A320”,“架A321”、“A319”、“B77W”、“波音”、“澳大利亚”,“A332”};
我们会得到一个不同的结果:
为了(数组。=(planes1, planes2)).isFalse();
2.4。比较数组和Arrays.deepEquals
使用= =如果我们在Java中使用简单类型,操作符很容易。这些可以是原始类型或字符串字面值。数组之间的比较对象s可以更复杂。这背后的原因在我们的Arrays.deepEquals篇文章。让我们来看一个例子。
首先,我们从a开始飞机类:
public class Plane {private final String name;私有最终字符串模型;// getter和setter}
让我们来实现hashCode和=方法:
@Override public boolean = (Object o){如果(this == o)返回true;if (o == null || getClass() != o.getClass()) return false;平面平面=(平面)o;返回对象。=(name, plane.name) && Objects.equals(model, plane.model); } @Override public int hashCode() { return Objects.hash(name, model); }
其次,让我们创建以下两元素数组:
new Plane[][] planes1 = new Plane[][] {new Plane("Plane 1", "A320")}, new Plane[]{new Plane("Plane 2", "B738")}};new Plane[][] planes2 = new Plane[][] {new Plane("Plane 1", "A320")}, new Plane[]{new Plane("Plane 2", "B738")}};
现在让我们看看它们是否正确,深度相等的数组:
为了(Arrays.deepEquals (planes1 planes2) .isTrue ();
为了确保我们的比较工作如预期的那样,现在让我们改变最后一个数组的顺序:
new Plane[][] planes1 = new Plane[][] {new Plane("Plane 1", "A320")}, new Plane[]{new Plane("Plane 2", "B738")}};new Plane[][] planes2 = new Plane[][] {new Plane("Plane 2", "B738")}, new Plane[]{new Plane("Plane 1", "A320")}};
最后,让我们测试一下它们是否真的不再相等:
为了(Arrays.deepEquals (planes1 planes2) .isFalse ();
2.5。比较具有不同元素顺序的数组
为了检查数组是否相等,不管元素的顺序如何,我们需要定义什么使我们的一个实例飞机独特的。在我们的例子中,不同的名称或模型就足以确定一个平面与另一个平面不同。我们已经实现了这两个hashCode和=方法。这意味着在比较数组之前,我们应该对它们排序。为此,我们需要a比较器:
if (o1. getname ().equals(o2. getname ())) {return o2. getmodel ().compareTo(o1. getmodel ());}返回o2.getName () .compareTo (o1.getName ());};
在这个比较器在美国,我们优先考虑名字。如果名字相等,我们通过查看模型来解决歧义。参数比较字符串compareTo方法的类型字符串。
我们希望能够找到数组是否相等,而不考虑排序顺序。为了做到这一点,现在让我们对数组进行排序:
数组。sort (planes1 [0], planeComparator);数组。sort (planes2 [0], planeComparator);
最后,让我们来测试一下:
为了(Arrays.deepEquals (planes1 planes2) .isTrue ();
先将数组按相同的顺序排序,我们允许deepEquals方法来确定这两个数组是否相等。
3.结论
在本教程中,我们看到了比较数组的不同方法。其次,我们看到了比较引用和值之间的区别。此外,我们还深入研究了如何比较数组。最后,我们看到了正常比较和深度比较之间的差异=和deepEquals,分别。
与往常一样,示例的完整源代码是可用的在GitHub。