我有六个字符串变量,如str11,str12,str13,str21,str21和str23。
我需要比较这些变量的组合。
我必须检查的组合是str11 - str12 - str13作为一组,str21 - str22 - str23作为其他组。我必须比较这两组。
现在我很困惑我应该用哪种方法进行比较?
我可以追加相同组的字符串并进行比较,这只是一次比较
说( str11 append str12 append str13 ) eqauls ( str21 append str22 append str23 )
或者
我应该进行个别3比较吗?
if( str11 equals str21 ) {
if( str12 equals str22 ) {
if( str13 equals str23 ) {
}
}
}
当我进行字符串比较时,由于字符串长度而导致我的性能因素是什么? 让我们假设所有字符串都是相同的(大约)长度。
答案 0 :(得分:10)
我会单独测试。
“AB”“CD”“EF”是否等于“ABC”“DE”“F”?
我不这么认为。
P.S。如果是,那么这是一个非常特殊的情况,如果你决定以这种方式编码(作为连接比较),那么就可以对它进行评论。
答案 1 :(得分:8)
将比较分成三个if语句绝对没有必要。你也可以简单地用比较做一个AND,例如
if ( str11 equals str21
&& str12 equals str22
&& str13 equals str23) ...
答案 2 :(得分:3)
您的变量名称表示主要代码气味。听起来好像不是有六个变量,而应该有两个数组,每个数组包含三个字符串。换句话说,这样的事情最初会好得多:
String[][] strs = new String[2][3];
strs[0][0] = str11;
strs[0][1] = str12;
...
根据您从中获取六个字符串的位置,您可能不需要在比较之前立即手动执行此操作,但可能会以更友好的格式传递您的参数。
如果您希望通过比较字符串对象的数组来实现此目的,并且您使用的是Java 1.5或更高版本,请记住您可以访问java.util.Arrays.equals()方法以获得数组相等性。尽可能使用库方法是避免额外工作重新发明轮子的好方法,以及可能的实现错误(例如,目前提交的实现都有错误)。
您采取的确切路线可能取决于您所写的域名 - 如果您的特定问题要求您始终比较3元组,那么编写代码以明确比较三个字符串的组将不是一个好主意,因为它可能比比较任意长度的数组的代码更容易理解。 (如果你要走这条路线,那么无论如何我们只需要一个if()条件和&&而不是嵌套if块,如Adam Bellaire所示。)
一般情况下,如果将其设置为使用任意长度的数组,您将拥有更多可重用的代码块。
答案 3 :(得分:1)
将字符串附加在一起并进行比较将不起作用。例如,字符串1和2可以为空,字符串3可以包含“gorps”,而字符串4包含“gorps”,5和6为空。附加结果的比较将返回true,尽管这将是误报。你必须提出一个分隔符,你保证不会包含在任何字符串中以使其工作,这可能会变得混乱。
我会按照你的方式进行比较。它可读且直截了当。
答案 4 :(得分:1)
对一个大的char []的迭代可能比在总长度相等的n个单独的字符串上的迭代更快。 这是因为数据非常本地化,CPU很容易预取数据。
但是,当您在Java中连接多个字符串时,您将使用StringBuilder / Buffer,然后在几种情况下将i转换回String。这将导致内存分配增加,因为SB.append()的工作方式和Java String是不可变的,这反过来可能会造成内存瓶颈并显着降低应用程序的速度。
我建议保持字符串不变并进行单独比较。由于较长的char []而导致的性能提升最有可能远远低于您可以在更高的分配率下运行的问题。
答案 5 :(得分:1)
尊重:我认为你的代码和问题不仅闻起来有点臭,而且几乎很臭(这里有大笑脸)。
1)变量名称表示实际上有字符串向量;如前所述
2)个别比较与串联比较的问题提出了如何定义字符串元组的相等性的问题;也已经提到了。
但最让我印象深刻的是:
3)对我而言,这看起来像是一个典型的“过早优化”案例,并在错误的地方计算CPU周期。
如果您真的关心表现,请忘记3次比较与单次比较的成本。相反:
创建两个连接字符串的额外开销怎么样?
(str11 + str12 + str13) = (str21 + str22 + str23)
让我们分析一下w.r.t.内存管理器和要完成的操作。在低级别上,转换为4个额外的内存分配,2个额外的strcpy,以及另外4个额外的strcat或strcpy(取决于VM如何执行;但大多数将使用另一个strcpy)操作。然后调用单个比较,它不首先使用strlen计算字符;相反,它要么事先知道大小(如果对象头也包括可能的字符数),或者它只是运行到0字节。这被称为一次与3次。要比较的实际字符数大致相同(忘记额外的0字节)。这让我们额外调用了两次strcmp(几个nS),而不是我上面描述的开销(几个美国)。如果我们将GC回收开销加起来(0分配对4),我会说你的“优化”解决方案很容易比3个strcmps慢100到1000倍!
附加通知: 从理论上讲,JITter可以对它或其中的一些进行优化,并且实际上按照Adam Bellaire的建议生成代码,但我怀疑任何JIT开发人员都在关注优化这些代码。顺便说一句,系统的字符串例程(也就是字符串操作)通常比手动编码快很多,所以不要自己开始遍历单个字符。
答案 6 :(得分:0)
我会用简单的方法
动态运行两个数组的所有数组元素。
boolean isEqual = true;
for(int n = 0;n<str1.length;++n){
isEqual &= str1[n].equals(str2[n]);
}
return isEqual;
答案 7 :(得分:0)
我会在两个数组中添加两个组,然后遍历数组以比较该数组中的各个字符串。马库斯·劳斯伯格(Markus Lausberg)给出了一个很好的例子。
我不会担心性能成本。只需用最易读的方式编写它。 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[] group1 = new String[]{"String 1", "String 2", "String 3"};
String[] group2 = new String[]{"String 1", "String 2", "String 3"};
boolean result = compareGroups(group1, group2);