比较Java中字符串的最快方法是什么?

在Java中比较两个字符串最快的是什么?

有比平等更快的东西吗?

编辑:我无法帮助澄清问题。

我有两个字符串,按字母顺序排序,完全相同的大小

例如:abbcee和abcdee

字符串最长可达30个字符

我不认为Sun Oracle尚未将标准String#equals()优化到最大值。 所以,我希望它已经是最快捷的方式了。 如果你想了解它们是如何实现的,请在它的源代码中查看一下。 这是一个摘录:

 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; } 

使用哈希码比较相同长度的字符串:

 public static boolean equals(final String s1, final String s2) { return s1 != null && s2 != null && s1.hashCode() == s2.hashCode() && s1.equals(s2); } 

你可以测试它,我的结果是4000000比较操作,包括相同,相同和不同的字符串:

 String.equals(String): 177081939 equals(String, String): 44153608 

注意:计算新字符串对象的hashCode需要一些计算时间,然后hashCode存储在对象中。 因此,如果重用字符串对象,我建议的改进只会比默认比较快。 在我的应用程序中,我使用String常量并在集合中存储字符串。 使用我的方法对字符串进行多次比较对我来说实际上更快,但它可能不是一般的。

如果该方法始终与新字符串一起使用,例如compare("a", "b") ,则不会有任何改进。

因此,比较字符串的最快方法取决于:

  • 是否重用字符串对象(如从集合中重用)或始终是新的(如输入流)
  • 你的琴弦是否有不同的长度
  • 字符串的开头或结尾是否有不同的字符串
  • 您的编程风格,使用了多少常量
  • 你使用String.intern()

忽略这些事实,大多数程序都可以使用String.equals()。

我尝试了不同的字符串比较组合( 代码在这里 ):

 1. s1.equals(s2) 2. s1.length() == s2.length() && s1.hashCode() == s2.hashCode() && s1.equals(s2) 3. s1.hashCode() == s2.hashCode() && s1.equals(s2); 4. s1.length() == s2.length() && s1.equals(s2); 

我使用40个字符长度的字符串,在10000000000L迭代中,在任何迭代之前我重新初始化字符串。

为了平等的叮咬,我得到了:

 equal: 2873 milis ??? equal: 21386 milis equal: 7181 milis equal: 2710 milis ??? 

对于相同大小的字符串但最后的字符不同我得到:

 different: 3011 milis different: 23415 milis different: 6924 milis different: 2791 milis 

对于不同的大小,几乎相同的字符串,但最后为s2添加了一个字符:

 different size: 3167 milis different size: 5188 milis different size: 6902 milis different size: 2951 milis 

在我看来,最好先使用equals()之前的string.length()比较。

但这几乎没关系,因为这就是我有10 ^ 10个字符串比较40个字符长度的情况,对我来说奇怪的是,对于相同的字符串,当我比较字符串长度时,我有更好的速度。

这取决于你的需要。 我认为equals()确实是优化的,但也许你需要比equals()更快的东西。 看看这篇文章 。

如果你能certificate它是一个重要的瓶颈,这会让我感到惊讶,你可以试试

 s1.hashCode() == s2.hashCode() && s1.equals(s2) 

它可能会快一点。 它可能不会。

简单的回答

String.equals(Object)

我很确定( 这个答案有一些参考 )并且很可能JIT将具有String#equals的内在函数,这意味着它可以用针对JVM当前架构的特制机器代码替换调用继续前进。

与往常一样,您需要针对您的应用程序/环境进行基准测试。 除非你已经将这个作为性能瓶颈进行了概括和认识,否则它可能并不重要(“过早优化是所有邪恶的根源”)。

话说回来:

a.equals(b)对于Strings来说真的很快 。 它可能是Java平台中最紧密优化的代码之一。 如果你能找到任何比较两个任意字符串的更快方法,我会感到非常惊讶。

在某些特殊情况下 ,您可以安全地作弊和使用(a == b) ,例如,如果您知道两个字符串都被实习 (因此价值身份意味着对象身份)。 在这种情况下,它可能比a.equals(b)略快 – 但这又取决于编译器/ JVM的实现。 如果你不知道自己在做什么,那就很容易在脚下射击…..