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

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(),没compareTo
Object是根类,它有的方法,其他类都可以继承,使用.所以.equals 基本随时能用.

  1. /**  
  2. * 实现Comparable接口,重写compareTo方法,返回值1,0,-1  
  3. * 覆写compareTo方法就是重建排序规则  
  4. */   
  5. public int compareTo(Object obj) {   
  6. Person p = (Person) obj;   
  7. if (p.score > this.score) {   
  8. return 1;   
  9. else if (p.score < this.score) {   
  10. return -1;   
  11. else {   
  12. // 如果成绩相等则判断年龄   
  13. if (p.age > this.age) {   
  14. return 1;   
  15. else if (p.age < this.age) {   
  16. return -1;   
  17. else {   
  18. return 0;   
  19. }   
  20. }   
  21. }  

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源码分析:

  1. public boolean equals(Object anObject) {  
  2.   if (this == anObject) {  
  3.   return true;  
  4.   }  
  5.   if (anObject instanceof String) {  
  6.   String anotherString = (String)anObject;  
  7.   int n = count;  
  8.   if (n == anotherString.count) {  
  9.   char v1[] = value;  
  10.   char v2[] = anotherString.value;  
  11.   int i = offset;  
  12.   int j = anotherString.offset;  
  13.   while (n-- != 0) {  
  14.   if (v1[i++] != v2[j++])  
  15.   return false;  
  16.   }  
  17.   return true;  
  18.   }  
  19.   }  
  20.   return false;  
  21.   }  
  22.   
  23.   public int compareTo(String anotherString) {  
  24.   int len1 = count;  
  25.   int len2 = anotherString.count;  
  26.   int n = Math.min(len1, len2);  
  27.   char v1[] = value;  
  28.   char v2[] = anotherString.value;  
  29.   int i = offset;  
  30.   int j = anotherString.offset;  
  31.   
  32.   if (i == j) {  
  33.   int k = i;  
  34.   int lim = n + i;  
  35.   while (k < lim) {  
  36.   char c1 = v1[k];  
  37.   char c2 = v2[k];  
  38.   if (c1 != c2) {  
  39.   return c1 - c2;  
  40.   }  
  41.   k++;  
  42.   }  
  43.   } else {  
  44.   while (n-- != 0) {  
  45.   char c1 = v1[i++];  
  46.   char c2 = v2[j++];  
  47.   if (c1 != c2) {  
  48.   return c1 - c2;  
  49.   }  
  50.   }  
  51.   }  
  52.   return len1 - len2;  
  53.   }  


object 的默认equals实现:

  1. public boolean equals( Object o2 )  
  2. {  
  3.    this == o2;  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值