java中equals和compareTo的区别---解惑

来源:互联网 发布:java中非线程安全的类 编辑:程序博客网 时间:2024/06/01 09:19

大多转载自 百度知道,个人整理以便日后阅读。


value1.compareTo(value2) == 0
value1.equals(value2)

equals的效率高些,compareTo其实就是按照编码的数值求差值,根据差值进行比较,它能确定两个String在字典顺序上的前后性,当你只是想知道是否一致时,用equals也行,效果一样。另外,equals是Object的方法,要求涉及到比较操作的继承类要自己重写该方法,所以String重写了equals,而compareTo为String的方法。所以:value1.compareTo(value2),当value1不为String类型时,会报错。而value1.equals(value2),都会进行比较。

实现了Comparable接口的类才有compareTo方法,有了就可以用, 所有已知实现类: Authenticator.RequestorType, BigDecimal, BigInteger, Boolean, Byte, ByteBuffer, Calendar, Character, CharBuffer, Charset, ClientInfoStatus, CollationKey, Component.BaselineResizeBehavior, CompositeName, CompoundName, Date, Date, Desktop.Action,String .....很多~但是Object类 只有.equals(),没compareToObject是根类,它有的方法,其他类都可以继承,使用.所以.equals 基本随时能用.

/** * 实现Comparable接口,重写compareTo方法,返回值1,0,-1 * 覆写compareTo方法就是重建排序规则 */ public int compareTo(Object obj) { Person p = (Person) obj; if (p.score > this.score) { return 1; } else if (p.score < this.score) { return -1; } else { // 如果成绩相等则判断年龄 if (p.age > this.age) { return 1; } else if (p.age < this.age) { return -1; } else { return 0; } } }

1. ==    : 基本数据类型都用这个比较,Java里面包含8个基本数据类型,分别是:boolean、byte、char、short、int、float、double、long注意String 可不属于基本数据类型,它是个类...
2..equals() 用于引用数据类型(除了上面的8个,都是引用数据类型,包括封装类,Object子类等),  比较是否指向相同的对象, 例如 String str = "abc"; 等效于: char data[] = {'a', 'b', 'c'};  String str = new String(data); 就是str 指向了  new String(data) 这个对象. 如果再有其他变量也指向这个对象,他们比较的结果就返回true;由于此方法在Object里, 所以它有很多重写, 具体要看说明;另外``` equalsIgnoreCase()可以忽略大小写; 
Object和String的equals()实现存在区别,所以上面的例子不太友好。有demo在最后
3. compareTO可以比较两个字符串并且得到顺序.按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。


String类 equals和compareTo源码分析:

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 int compareTo(String anotherString) {  int len1 = count;  int len2 = anotherString.count;  int n = Math.min(len1, len2);  char v1[] = value;  char v2[] = anotherString.value;  int i = offset;  int j = anotherString.offset;  if (i == j) {  int k = i;  int lim = n + i;  while (k < lim) {  char c1 = v1[k];  char c2 = v2[k];  if (c1 != c2) {  return c1 - c2;  }  k++;  }  } else {  while (n-- != 0) {  char c1 = v1[i++];  char c2 = v2[j++];  if (c1 != c2) {  return c1 - c2;  }  }  }  return len1 - len2;  }


object 的默认equals实现:

public boolean equals( Object o2 ){   this == o2;}


0 0