前言

首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类):

equals:是否同一个对象实例。注意,是“实例”。比如String s = new String("test");  s.equals(s), 这就是同一个对象实例的比较;

等号(==):对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例;又可以说是判断对象实例是否物理相等;

Hashcode:我觉得可以这样理解:并不是对象的内存地址,而是利用hash算法,对对象实例的一种描述符(或者说对象存储位置的hash算法映射)——对象实例的哈希码。

 

按照约定,equals要满足以下规则:
自反性:  x.equals(x) 一定是true

对null:  x.equals(null) 一定是false

对称性:  x.equals(y)  和  y.equals(x)结果一致

传递性:  a 和 b equals , b 和 c  equals,那么 a 和 c也一定equals。

一致性:  在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。

一、== 和 equals的区别:

==主要是两个变量值的比较,返回值为true 或者是false。对于普通变量,如:int a=10; int  b= 10; a==b,返回为 true。

而对于下面情况:

String  a=new String("abc");

String  b=new String("abc");

String  c=a

String d="abc";

String f="abc";

a==b; 返回的则是一个false。这是因为,对于对象的比较是对对象引用的比较,对于a和b ,他们在内存中对应的地址是不一样的

c==a 返回的值是一个true,c引用了a,内存地址一样的

d==f  返回的值是一个ture,因为 d,f 在编译期放进了字符串常量池中,d,f都引用了字符串池的“abc”

a==f 返回的值是一个false,a和f引用的内存地址不一样

==操作符并不涉及对象内容的比较。若要对对象内容进行比较,则用equals. 如果 在本例中,a.equals(b)则返回是一个true值。

总而言之:==是对对象地址的比较,而equals是对对象内容的比较。对于基本数据类型,一般用==,而对于字符串的比较,一般用equals

二、对于compareTo(), 在API中,Java.lang包下面的基本数据类型的封装类都提供了该方法,如 Integer,Float,Byte,Short,Character 等

compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序)
1、如果字符串相等返回值0
2、如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值前字符串的值小于后字符串,正值前字符串大于后字符串)
3、如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度. 
例: 
String s1 = "abc"; 
String s2 = "abcd"; 
String s3 = "abcdfg"; 
String s4 = "1bcdfg"; 
String s5 = "cdfg"; 
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1) 
System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3) 
System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48) 
System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)

最新文章

  1. iOS 为什么app都是异步编程
  2. DEV控件中GridView中的复选框与CheckBox实现联动的全选功能
  3. Spring整合log4j
  4. spring mvc 重定向加传参
  5. 剑指Offer44 扑克牌的顺子
  6. Akka的Actor模型及使用实例
  7. Python进阶(面向对象编程基础)(四)
  8. 【GO】【环境配置】
  9. jQuery 获取url中的参数
  10. 【python010-数组】
  11. divinglaravel.com
  12. 10-03 Java 包的概述和讲解
  13. P4289 [HAOI2008]移动玩具(bfs)
  14. Golang 并发Groutine详解
  15. 赵雅智_ListView_ArrayAdapter
  16. LA 3401
  17. Java.lang包的接口解读
  18. Ajax之404,200等查询
  19. locust性能测试(无 web ui 模式)
  20. gcd-模板+最小公倍数

热门文章

  1. 一站式学习Wireshark(转载)
  2. 用户输入URL后发生了什么,以及优化问题
  3. Silverlight:telerik RadControls中RadGridView的一个Bug及解决办法(转载)
  4. Subversion和TortoiseSVN安装与配置(转)
  5. 编辑HTML代码,批量制作博文清单
  6. 用C#实现XML和实体类之间序列化和反序列化相互转换
  7. C++语言基础(1)-命名空间
  8. Nginx HttpSubModule sub_filter模块的过滤功能
  9. java - day09 - summerize
  10. python C example:encode mp3 code