1. 概述

在Java中,StringBuilder 类允许我们创建一个可以修改的字符序列对象。这使得每次更新对象时无需每次都从头开始构建,如使用标准的 String 类那样。本教程将探讨如何在 Java 11 发布前后比较两个 StringBuilder 对象。

2. Java 11 之前

在 Java 11 之前,StringBuilder 没有内置的比较方法。 因此,我们需要自定义一个。首先,我们需要检查比较的对象长度是否相同。如果不等,我们可以立即断定它们不匹配。

一旦我们知道它们长度相等,我们可以利用 StringBuilder 实现了 CharSequence 接口的事实,来调用 charAt() 方法逐个比较字符。我们将这两个步骤组合成一个可重用的方法:

```java
private boolean compareStringBuilder(StringBuilder sb1, StringBuilder sb2) {
    if (sb1.length() != sb2.length()) {
        return false;
    }
    for (int i = 0; i < sb1.length(); i++) {
        if (sb1.charAt(i) != sb2.charAt(i)) {
            return false;
        }
    }
    return true;
}

现在我们可以用这个方法测试一些案例。看它是否能确认两个 StringBuilder 是否相同:

```java
StringBuilder sameValue = new StringBuilder("Hello, world!");
StringBuilder sameValueCopy = new StringBuilder("Hello, world!");

System.out.println(compareStringBuilder(sameValue, sameValueCopy)); // 输出:true

为了完成检查,让我们看看它能否检测到不同的 StringBuilder

```java
StringBuilder differentValue = new StringBuilder("Hello, world!");
StringBuilder reversedValue = new StringBuilder("!dlrow ,olleH");

System.out.println(compareStringBuilder(differentValue, reversedValue)); // 输出:false

第二个测试案例中的例子长度相同,所以我们会使用 charAt() 比较。

3. Java 11 之后

随着 Java 11 的发布,StringBuilder 现在实现了 Comparable 接口。这使我们能够使用 compareTo() 方法,该方法返回一个 int 值。 如果匹配,返回值为零;如果 StringBuilder 不同,则返回非零值。让我们用两个具有相同值的 StringBuilder 来演示:

```java
StringBuilder sameValue = new StringBuilder("Hello, world!");
System.out.println(sameValue.compareTo(sameValue)); // 输出:0

接下来,我们尝试使用两个不同值的 StringBuilder

```java
StringBuilder differentValue = new StringBuilder("Hello, world!");
StringBuilder reversedValue = new StringBuilder("!dlrow ,olleH");

System.out.println(differentValue.compareTo(reversedValue)); // 输出:-1 或者 1(取决于字典顺序)

在 Java 11 之后,这比以前简单得多。返回的整数告诉我们两个比较对象在字典顺序上是否不同。我们还能知道差异是正还是负,这在某些应用中可能会有用。

4. 总结

在这篇文章中,我们探讨了两种比较 StringBuilder 对象的方式。我们了解到,对于 Java 11 之前的版本,我们需要编写自己的比较方法。然而,从 Java 11 开始,我们有了方便的 compareTo() 方法,可以达到同样的效果。

如往常一样,所有示例的完整代码可以在 GitHub 上找到。