Java字符串:的compareTo()与equals()方法(Java Strings: comp

2019-07-22 02:01发布

当平等的测试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:

其中主要的区别是:

  1. equals将采取任何对象作为参数,但compareTo只需要字符串。
  2. 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:

  1. equals可以采取任何对象作为参数,但compareTo只能采取字符串。

  2. 当COMETO空, compareTo将抛出一个异常

  3. 当你想知道哪里有差异发生,你可以使用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:

  • equals :需要检查平等,限制重复。 Java库中的很多类使用的情况下,他们想找到重复。 如HashSet.add(ob1)如果不存在只会增加。 所以,如果你正在扩展一些这样的课程,然后重写equals()

  • compareTo :需要的元素进行排序。 再次稳定排序您需要平等的,所以返回0。



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工程实现“可比”界面否则会抛出一个类NullPointerExceptionString类实现可比的界面,同时StringBuffer并不因此你可以使用"foo".compareTo("doo")String对象,但不是StringBuffer对象。



文章来源: Java Strings: compareTo() vs. equals()