1、==

==是关系操作符,对于基本类型(byte,short,char,int,long,float,double,boolean),比较的是值是否相等;对于对象,比较的是对象的引用(也即栈内存中的存放地址)是否相等。

2、equals

equals是Object类中的方法,默认比较引用,和==处理对象的结果一样,不适用于基本类型。Object中的equals方法如下:

public boolean equals(Object obj){
return (this==obj);
}

如果要用equals来比较对象的内容是否相等,需要覆盖equals方法;其实大多数java类库(String、Integer和Date等)都覆盖实现了自己的equals方法。

正确的equals需满足以下5点:

  • 自反性。对任意x,x.equals(x)必须返回true;
  • 对称性。对于任意x和y,如果y.equals(x)返回true,x.equals(y)必须返回true;
  • 传递性。对于任意x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也必须返回true;
  • 一致性。对于任意x和y,如果对象中用于比较的信息没有改变,多次调用该x.equals(y),返回结果要么一直是true,要么一直是false;
  • 对于任何非null的x,x.equals(null)一定返回false。

3、hashCode

hashCode返回对象的散列码,返回值是int类型,对象的散列码是为了更好的支持基于哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet 等。Object中的hashCode方法如下:

public native int hashCode();

关于hashCode方法需要注意以下几点:

  • 重写了equals方法的对象必须同时重写hashCode()方法;
  • equals相等的两个对象,hashCode也要相等;
  • equals不等的两个对象,hashCode允许相同。

为什么equals相等的两个对象,其hashCode返回的值一定相等?

对于集合类HashSet、HashMap等和hash有关的类(以HashSet为例),是通过hash算法来散列对象的。对HashSet而言,存入对象的流程为:根据对象的hash码,经过hash算法,找到对象应该存放的位置,如果该位置为空,则将对象存入该位置;如果该位置不为空,则使用equals()比较该位置的对象和将要入的对象,如果两个相等,则不再插入,如果不相等,根据hash冲突解决算法将对象插入其他位置。

而java规定对于HashSet判断是不是重复对象就是通过equals() 方法来完成,这就需要在两个对象equals()方法相等的时候,hash码一定相等(即hashCode()返回的值相等)。假设两个对象equals()方法相等的时候,hash码不相等,会出现equals()相等的两个对象都插入了HashSet中,这是不允许的。

最新文章

  1. Gamma校正与线性工作流
  2. 【leetcode】Interleaving String
  3. iOS 第三方自定义Alertview项目MBProcessHud中的重要代码分析
  4. POJ 2342 Anniversary party (树dp)
  5. 利用HibernateTools从数据库表生成带注解的POJO
  6. vijosP1903学姐的实习工资
  7. 深入了解一下PYTHON中关于SOCKETSERVER的模块-A
  8. GDB+GDBServer调试Linux应用程序
  9. mx51的三个framebuffer,mxc_ipuv3_fb.c分析
  10. JS 实现banner图的滚动和选择效果
  11. ES6入门2
  12. Http get方式url参数长度以及大小
  13. Linux iptables 配置规则
  14. HTTP 内容编码,也就这 2 点需要知道 | 实用 HTTP
  15. svn + nginx unit + python3自动化发布web服务方法
  16. 2018-2019-2 网络对抗技术 20165326 Exp3 免杀原理与实践
  17. [转]NSIS 制作安装包无法创建桌面快捷方式或无法删除开始菜单项
  18. html js获取URL传参
  19. 【转载】最强NLP预训练模型!谷歌BERT横扫11项NLP任务记录
  20. Selenium Web 自动化 - 项目实战(一)

热门文章

  1. 剑指Offer 9. 变态跳台阶 (递归)
  2. 周强201771010141《面向对象程序设计(java)》第一周学习总结
  3. Bootstrap如何禁止响应式布局 不适配
  4. mysql建表规范及注意事项
  5. Linux 分支那么多,这里可以帮你缩小选择范围
  6. 手撕RPC框架
  7. Oracle数据库-sqlplus命令下出现SP2-0640: Not connected
  8. Windows7 密码修改
  9. SSL&TLS渗透测试
  10. .NET平台