当平等的测试String
在Java中的我一直使用equals()
,因为对我来说这似乎是它最自然的方法。 毕竟,它的名字已经表示它是什么打算这样做。 然而,我的一个同事最近告诉我已经被教导使用compareTo() == 0
而不是equals()
。 这感觉不自然(如compareTo()
是为了提供一个排序,而不是比较平等),甚至有点危险(因为compareTo() == 0
并不一定意味着在所有情况下的平等,即使我知道它为String
“ S)给我。
他不知道他为什么被教导使用compareTo()
而不是equals()
用于String
的,我也找不到任何理由。 这是真正的个人品味的问题,或者是有两种方法任何真正的原因是什么?
Answer 1:
的区别在于"foo".equals((String)null)
而返回false "foo".compareTo((String)null) == 0
抛出一个NullPointerException。 因此,他们并不总是甚至弦乐互换。
Answer 2:
当平等的比较,你应该使用equals()
,因为它表达了一个明确的方式你的意图。
compareTo()
有额外的缺点,它只能在实现了对象Comparable
接口。
这适用于一般情况下,不仅为字符串。
Answer 3:
其中主要的区别是:
-
equals
将采取任何对象作为参数,但compareTo
只需要字符串。 -
equals
只告诉你他们是否是等于或没有,但compareTo
给出的字符串如何比较字典序信息。
我看了一下String类的代码 ,并在在的compareTo算法和等于外观基本相同。 我相信他的意见只是口味的问题,我同意你的观点-如果你需要知道的是弦乐的哪一个至上字典顺序的平等,而不是,然后我会用equals
。
Answer 4:
compareTo
有做做更多的工作,如果字符串的长度不同。 equals
可以只返回false,而compareTo
必须审视足够的字符找到排序顺序。
Answer 5:
对于字符串情形:
的compareTo:按字母顺序比较两个字符串。
等于:比较此字符串与指定的对象。
的compareTo可以通过字符两个字符串相比较(在相同的索引),并相应地返回一个整数(正或负)。
String s1 = "ab";
String s2 = "ab";
String s3 = "qb";
s1.compareTo(s2); // is 0
s1.compareTo(s3); // is -16
s3.compareTo(s1); // is 16
Answer 6:
compareTo()
不仅适用于字符串,而且任何其他对象,因为compareTo<T>
采用一个通用的参数T
。 字符串是已实施的类之一compareTo()
由实施该方法Comparable
接口。 所以任何一类是自由地实现Comparable接口。
但是compareTo()
给出对象的排序 ,在升序排序对象或降序排列,而通常使用equals()
将只谈平等 ,说他们是否相等。
Answer 7:
equals()方法可以更有效地然后的compareTo()。
的compareTo之间一个非常重要的差等于:
"myString".compareTo(null); //Throws java.lang.NullPointerException
"myString".equals(null); //Returns false
等于()检查如果两个对象是相同的或不并返回一个布尔值。
的compareTo()(从接口可比)返回一个整数。 它检查该两个对象是“小于”,“等于”或其他“大于”。 并不是所有的对象都可以在逻辑上有序的,所以的compareTo()方法并不总是有意义。
需要注意的是等于()没有定义对象之间的排序,它的compareTo()一样。
现在,我建议你检查这两种方法的源代码,以得出结论,等于结束的compareTo涉及一些数学计算优选。
Answer 8:
看来,这两种方法几乎做同样的事情,但的compareTo()方法接受一个字符串,而不是一个对象,并增加了对正常平等的顶部()方法的一些额外的功能。 如果所有你关心的是平等,那么equals()方法是最好的选择,只是因为它更有意义的下一个程序员是需要看看你的代码。 两种不同功能之间的时间差不应该的问题,除非你遍历一些大项目的数量。 的的compareTo()是真正有用的,当你需要知道的字符串集合中的顺序,或当你需要知道,有相同的字符序列开头的字符串之间的长度差。
来源: http://java.sun.com/javase/6/docs/api/java/lang/String.html
Answer 9:
equals()
应选择在OP的情况下该方法。
综观实施equals()
和compareTo()
在java.lang.String中的grepcode ,我们不难看出,等于是更好,如果我们只是关心两个字符串的平等:
equals()
:
1012 public boolean equals(Object anObject) {
1013 if (this == anObject) {
1014 return true;
1015 }
1016 if (anObject instanceof String) {
1017 String anotherString = (String)anObject;
1018 int n = count;
1019 if (n == anotherString.count) {
1020 char v1[] = value;
1021 char v2[] = anotherString.value;
1022 int i = offset;
1023 int j = anotherString.offset;
1024 while (n-- != 0) {
1025 if (v1[i++] != v2[j++])
1026 return false;
1027 }
1028 return true;
1029 }
1030 }
1031 return false;
1032 }
和compareTo()
1174 public int compareTo(String anotherString) {
1175 int len1 = count;
1176 int len2 = anotherString.count;
1177 int n = Math.min(len1, len2);
1178 char v1[] = value;
1179 char v2[] = anotherString.value;
1180 int i = offset;
1181 int j = anotherString.offset;
1183 if (i == j) {
1184 int k = i;
1185 int lim = n + i;
1186 while (k < lim) {
1187 char c1 = v1[k];
1188 char c2 = v2[k];
1189 if (c1 != c2) {
1190 return c1 - c2;
1191 }
1192 k++;
1193 }
1194 } else {
1195 while (n-- != 0) {
1196 char c1 = v1[i++];
1197 char c2 = v2[j++];
1198 if (c1 != c2) {
1199 return c1 - c2;
1200 }
1201 }
1202 }
1203 return len1 - len2;
1204 }
当字符串中的一个是另一个的前缀,表现compareTo()
是更糟,因为它仍然需要确定所述词典式排序,而equals()
不会担心了,并立即返回false。
在我看来,我们应该用这两个作为他们的目的:
-
equals()
来检查平等, -
compareTo()
找到词汇顺序。
Answer 10:
还有,你需要牢记而在Java中的compareTo如覆盖的compareTo必须与equals和减法一致不应该被用于比较整数字段,因为它们可能会溢出一些事情。 检查的事情要记住,而在Java中覆盖比较了解详情。
Answer 11:
等于可以更有效的compareTo然后。
如果字符序列的字符串长度不匹配是没有办法的字符串是相等,从而抑制速度会更快。
此外,如果它是同一个对象(身份平等而不是逻辑相等),这也将是更加高效。
如果他们还实施的hashCode缓存它可能是更快拒绝的情况下,它们的hashCode的不匹配不等于。
Answer 12:
String.equals()
需要调用instanceof
运算符同时compareTo()
需要不。 我的同事注意到造成数量过多大的性能下拉instanceof
在调用equals()
方法,但我的测试已经证明compareTo()
只稍快可以。
我使用,然而,Java 1.6。 在其它版本上(或其他JDK供应商)的差异可能会更大。
测试比较每个对每个在1000个元件阵列串,重复10次。
Answer 13:
equals
可以采取任何对象作为参数,但compareTo
只能采取字符串。
当COMETO空, compareTo
将抛出一个异常
当你想知道哪里有差异发生,你可以使用compareTo
。
Answer 14:
这是巫术实验:-)
大多数的答案比较性能和API差异。 他们错过了根本的一点是,两个操作只是有不同的语义。
你的直觉是正确的。 x.equals(y)为不与则x.compareTo(Y)== 0,可互换的第一身份进行比较,而其它比较“尺寸”的概念。 的确,在许多情况下,尤其是与原始类型,这两个共同对齐。
一般情况下是这样的:
如果x和y是相同的,它们共享相同的 '尺寸':如果x.equals(y)为真=>则x.compareTo(y)为0。
但是,如果X和Y具有相同的大小,但这并不意味着它们是相同的。
如果,则x.compareTo(y)为0并不意味着x.equals(y)为真。
其中身份从尺寸不同一个引人注目的实施例将是复数。 假设比较是由它们的绝对值来完成。 因此,考虑两个复数:Z1 = A1 + B1 * i和Z2 = A2 + B2 *我:
Z1.equals(Z2)返回true当且仅当A1 = A2和B1 = B2。
然而Z1.compareTo(Z2)返回0为(A1,B1)和无限数量和(A2,B2)对,只要它们满足条件A1 ^ 2 + B1 ^ 2 == A2 ^ 2 + B2 ^ 2。
Answer 15:
Answer 16:
等于()检查两个字符串是否等于或not.It给出布尔值。 的compareTo()检查字符串对象是否等于,大于或小于其他字符串object.It给出结果为:1,如果字符串对象是大于0,如果两者相等-1,如果字符串是比其它字符串小
EQ:
String a = "Amit";
String b = "Sumit";
String c = new String("Amit");
System.out.println(a.equals(c));//true
System.out.println(a.compareTo(c)); //0
System.out.println(a.compareTo(b)); //1
Answer 17:
等于 -
1-覆盖GetHashCode方法,以允许一类型在哈希表中正常工作。
2 - 不要在执行抛出异常的equals方法。 相反,一个null参数返回false。
3-
x.Equals(x) returns true.
x.Equals(y) returns the same value as y.Equals(x).
(x.Equals(y) && y.Equals(z)) returns true if and only if x.Equals(z) returns true.
的x.Equals(y)的连续调用只要x和y所引用的对象不被修改返回相同的值。
x.Equals(null) returns false.
4-对于某些类型的对象,这是希望具有的Equals测试值相等,而不是参考平等。 的Equals的这种实现返回true,如果两个对象具有相同的价值,即使它们不是同一个实例。
例如 -
Object obj1 = new Object();
Object obj2 = new Object();
Console.WriteLine(obj1.Equals(obj2));
obj1 = obj2;
Console.WriteLine(obj1.Equals(obj2));
输出: -
False
True
同时的compareTo -
用相同类型的另一个目的比较当前实例并返回一个整数,指示当前实例是否之前,如下,或发生在排序顺序与其他对象的相同位置。
它返回 -
小于零 - 此实例之前的obj在排序顺序。 零 - 此实例发生在排列顺序与obj相同的位置。 大于零 - 此实例如下OBJ的排序顺序。
它可以抛出ArgumentException的,如果对象是不一样的类型实例。
例如,您可以点击这里查看。
因此,我建议最好使用的Equals到位的compareTo的。
Answer 18:
“等于”比较对象,并返回真或假,“比较”,如果是真或数[> 0]或[<0]如果是假这里的示例返回0:
<!-- language: lang-java -->
//Objects Integer
Integer num1 = 1;
Integer num2 = 1;
//equal
System.out.println(num1.equals(num2));
System.out.println(num1.compareTo(num2));
//New Value
num2 = 3;//set value
//diferent
System.out.println(num1.equals(num2));
System.out.println(num1.compareTo(num2));
结果:
num1.equals(num2) =true
num1.compareTo(num2) =0
num1.equals(num2) =false
num1.compareTo(num2) =-1
文档对比: https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
文档等于: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
Answer 19:
这里有一两件事是重要的,而使用compareTo()
以上equals()
是compareTo
工程实现“可比”界面否则会抛出一个类NullPointerException
。 String
类实现可比的界面,同时StringBuffer
并不因此你可以使用"foo".compareTo("doo")
中String
对象,但不是StringBuffer
对象。
文章来源: Java Strings: compareTo() vs. equals()