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

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 基本随时能用.
/**
* 实现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;
}

最新文章

  1. 触发Full GC执行的情况
  2. [ javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中 ] javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中方法演示 效果之三
  3. [CareerCup] 5.2 Binary Representation of Real Number 实数的二进制表示
  4. Spring监听器配置
  5. 判断数组中有没有某个键 isset 和 array_key_exists 的效率比较
  6. 五毛的cocos2d-x学习笔记07-计时器、数据读写、文件读写
  7. 数据市中心全省中国mysql脚本
  8. Sybase数据库截断和清空日志的方法
  9. 三分钟读懂TT猫分布式、微服务和集群之路
  10. 自定义ArrayList
  11. Pytorch系列教程-使用字符级RNN生成姓名
  12. 关于QQ屏蔽某些文件上传一些有意思的事
  13. Windows自定义运行命令
  14. 主动收入VS被动收入
  15. 使用Spring Cloud连接不同服务
  16. 从svn下载项目,并在tomcat启动
  17. 【JavaScript】获取当前页的URL与window.location.href
  18. 微信h5支付源码DEMO参考
  19. 什么是ASCII
  20. 状态管理Vuex

热门文章

  1. Bootstrap 引入文件顺序及IE兼容性js
  2. RabbitMQ基础知识详解
  3. 洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…
  4. NOIP2018滚粗记
  5. CPU性能过剩提升乏力影响未来行业发展吗?
  6. c++ 为自定义类添加stl遍历器风格的遍历方式
  7. ansible创建vmware虚拟机
  8. 如何注册CUBA Studio
  9. 前端学习 -- Html&amp;Css -- 条件Hack 和属性Hack
  10. AtCoder Grand Contest 010 D - Decrementing