Java 字符串比较:单个比较与附加字符串比较

Java 字符串比较:单个比较与附加字符串比较,java,string,comparison,Java,String,Comparison,我有六个字符串变量,比如str11、str12、str13、str21、str21和str23 我需要比较这些变量的组合 我要检查的组合是str11--str12--str13作为一个组,str21--str22--str23作为另一个组。我必须比较这两组 现在我不知道该用哪种方法来比较 我是否可以附加同一组的字符串并进行比较,这只是一个比较 说(str11追加str12追加str13)eqauls(str21追加str22追加str23) 或 我应该进行单独的3次比较吗 if( str11 e

我有六个字符串变量,比如str11、str12、str13、str21、str21和str23

我需要比较这些变量的组合

我要检查的组合是str11--str12--str13作为一个组,str21--str22--str23作为另一个组。我必须比较这两组

现在我不知道该用哪种方法来比较

我是否可以附加同一组的字符串并进行比较,这只是一个比较 说
(str11追加str12追加str13)eqauls(str21追加str22追加str23)

我应该进行单独的3次比较吗

if( str11 equals str21 ) {

    if( str12 equals str22 ) {

        if( str13 equals str23 ) {

        }

    }

}
当我进行字符串比较时,由于字符串长度而使我付出代价的性能因素是什么?
让我们假设所有字符串都具有相同(近似)长度。

如果肯定不需要使用if语句,则将比较拆分为三个。你也可以简单地用你的比较做一个AND,例如

if (  str11 equals str21
   && str12 equals str22
   && str13 equals str23) ...

将字符串追加在一起并进行比较将不起作用。例如,字符串1和2可以为空,字符串3可以包含“gorps”,而字符串4包含“gorps”,5和6为空。对附加结果的比较将返回true,尽管这将是假阳性。你必须想出一个你保证不会包含在任何字符串中的分隔符来让它工作,这可能会变得混乱


我会像你那样做比较。它可读性强,简单易懂。

我会用简单的方法

动态运行两个数组的所有数组元素

            boolean isEqual = true;
            for(int n = 0;n<str1.length;++n){
                isEqual &= str1[n].equals(str2[n]);
            }

            return isEqual;
布尔isEqual=true;

对于(int n=0;n我会单独测试

“AB”“CD”“EF”等于“ABC”“DE”“F”吗

我不这么认为


如果是,那么这是一个非常特殊的情况,如果你决定用这种方式编码(作为串联比较),那么就把它注释掉。

在一个大字符[]上的迭代可能比在总长度相等的n个单独字符串上的迭代快。 这是因为数据是非常本地的,CPU很容易预取数据

但是,当您在Java中连接多个字符串时,您将使用StringBuilder/Buffer,然后在几种情况下将i转换回字符串。由于SB.append()的工作方式和Java字符串的不可变性,这将导致内存分配增加,这反过来会造成内存瓶颈并显著降低应用程序的速度


我建议保持字符串的原样并进行单独的比较。由于较长的字符[],性能有所提高最有可能的问题是,分配率越高,遇到的问题就越少。

我会将两个组添加到两个数组中,然后在数组上循环以比较该数组中的单个字符串。Markus Lausberg给出的ansewers中已经有一个很好的例子

我不会担心性能成本。只需以尽可能可读的方式编写即可。Java编译器在性能优化方面非常出色

示例方法:

    public boolean compareGroups(String[] group1, String[] group2){
    if (group1.length != group2.length ){
        return false;
    }

    for (int i = 0; i < group1.length; i++) {
        if (!group1[i].equals(group2[i])){
            return false;
        }
    }

    return true;
}

您的变量名表示一种主要的代码味道。听起来,您应该有两个数组,每个数组包含三个字符串,而不是六个变量。换句话说,类似这样的东西最初会更好:

String[][]strs=新字符串[2][3];
strs[0][0]=str11;
strs[0][1]=str12;
…

可能的情况是,根据您从何处获得这六个字符串,您不需要在比较之前立即手动执行此操作,但可能会以更友好的格式传入参数

如果您确实希望通过比较字符串对象的数组来实现这一点,并且您正在使用Java 1.5或更高版本,请记住您可以访问Java.util.arrays.equals()方法来实现数组相等。尽可能多地使用库方法是避免重新设计轮子和可能出现的实现错误的好方法(例如,迄今为止提交的两个实现都有bug)

您采取的确切路线可能取决于您编写的域-如果您的特定问题要求您始终比较3元组,那么编写代码以明确地比较三个字符串的组并不是一个好主意,因为它可能比比较任意元组数组的代码更容易理解(如果你要走这条路,那么一定要使用带有&&的单个If()条件块,而不是像Adam Bellaire演示的那样嵌套If块)


不过,一般来说,如果您将代码块设置为使用任意长度的数组,您将拥有一个更易于重用的代码块。

恕我直言:我认为您的代码和问题不仅有点臭,而且几乎臭(这里是一个大大的笑脸)

1) 变量名表示实际周围有字符串向量;如前所述
2) 单个比较与串联比较的问题提出了如何定义字符串元组相等的问题;也已经提到了

但最让我印象深刻的是:

3) 在我看来,这似乎是一个典型的“过早优化”和在错误的位置计算CPU周期的案例

如果你真的很在意性能,那就不要考虑3次单独比较与一次比较的成本。相反:

创建两个串联字符串的额外开销如何

  (str11 + str12 + str13) = (str21 + str22 + str23)
让我们向内存管理器分析该w.r.t.以及要执行的操作。在较低的级别上,转换为4个额外的内存分配、2个额外的strcpy,以及另外4个额外的strcat或strcpy(取决于VM如何执行;但大多数将使用另一个strcpy)操作。然后调用单个比较,该比较不首先使用strlen对字符进行计数;相反,它要么预先知道大小(如果对象头还包括字符数,这很可能),要么
String[][] strs = new String[2][3];
strs[0][0] = str11;
strs[0][1] = str12;
...
  (str11 + str12 + str13) = (str21 + str22 + str23)