1.==和equals的区别

a.基本数据类型使用  == 进行值的比较

b.引用类型使用 == 进行比较时,直接比较的是对象的存储地址,即两个引用是否指向了同一个对象。

c.equals方法是基类Object中的方法,该方法如果在其他类中没有被重写,则比较的还是地址,即两个引用是否指向了同一个对象,和==是一样的(其实equals方法的默认实现就是==)。该方法在一些实现类中已经被重新了,如 String和Integer等包装类,在这些类中用来比较值是否相等。

即:equals方法如果没有重写时在比较两个对象时的作用和==是一样的,都是比较两个对象是不是同一个对象。这里如果我们比较的是地址,那么最好用==,因为无论是否重写了Object的equals方法,引用类型使用==时永远比较的是地址。

2.为什么要重写equals方法?

有时候在实际使用的过程中,比如有两个对象 Address address1=new Address("甘肃”,"兰州");  Address address2=new Address("甘肃”,"兰州"); 这两个对象中的内容都是相同的,我们则认为这两个对象是相等的。但不重写equals时使用 address1.equals(address2)进行比较时结果为 false,这不能满足我们的要求,所以就需要对从基类Object中继承的该方法进行重写,以使其符合我们的要求。

3.应该如何重写equals方法?

重写equals方法时,除了最基本的要判断两个对象的类型是否相同,以及属性值是否相同之外,有很重要的一点就是需要重写其hashcode方法,因为java中规则约定:如果两个对象equals后的结果为true时,他们的hashcode值一定是相同的;如果equals的结果为false时,则应尽量使他们的hashcode值不同。

这么约定是为了避免在使用 HashMap,HashList等集合时出现冲突,因为在默认情况下每个对象的hashcode值是通过其内存地址经过计算得到的一个int型的值,所以每个对象的hashcode值是不同的。如果给HashMap中存入以下的键值对时:Map<Adress,String> map= new HashMap<Adress,String>(),即这里使用引用类型来做map集合的键,map集合中的键是不能重复的,在往map集合中存入数据时,当前的键值会跟已经存入的键值进行比较,而比较的方法正是使用hashcode.如果不重写hashcode,经我们重写equals后两个属性值相同的对象我们认为就是相同的,但他们的hashcode还是不同的,所以这里如果存入到map集合中时,map集合还认为他们依旧是两个不同的对象,依旧能够存入,这就不对了。所以一定要重写hashcode值, 让它符合java中的约定规则。这里重写的时候我们只需想办法让这个hashcode值能满足上面所说的约定即可。注意,这里的hashcode值的生成规则是我们根据自己的需求进行控制。

一般这里不需要我们自己来写,像eclipse工具可以帮我们自动生成重写的equals和hashcode方法,直接使用即可,这里贴上自动生成的代码,大家看看其实现原理

//重写的hashcode方法,使其满足约定
@Override
public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((city == null) ? 0 : city.hashCode());
  result = prime * result + ((province == null) ? 0 : province.hashCode());
  return result;
}

//重写的equals方法,用来比较两个对象是否相同
@Override
public boolean equals(Object obj) {
  if (this == obj)
    return true;
  if (obj == null)
    return false;
  if (getClass() != obj.getClass())
    return false;
  Address other = (Address) obj;
  if (city == null) {
    if (other.city != null)
      return false;
    } else if (!city.equals(other.city))
      return false;

  if (province == null) {
    if (other.province != null)
      return false;
    } else if (!province.equals(other.province))
      return false;
    return true;
}

最后,附上两篇讲的比较透彻的文章以供大家参考:Java正确的自定义比较对象----如何重写equals方法和hashcode方法Java哈希码以及equals和==的区别

最新文章

  1. Sql Servicer 复习笔记(1) 存储过程分布
  2. tomcat 5.5 动态加载类
  3. 谷歌插件Image downloader开发之 content script
  4. [转]精通JS正则表达式
  5. IOS中限制TextField中输入的类型以及长度
  6. 13test06:花朵数
  7. 实现百度地图导航Demo的语音播报功能
  8. 那些年不错的Android开源项目(转)
  9. 《第一行代码》学习笔记8-活动Activity(6)
  10. 3Sum Closest 解答
  11. mysql学习(补充)
  12. git rebase -i命令修改commit历史
  13. MSSQL的简单盲注
  14. linux入门--Linux和UNIX的关系及区别
  15. OAuth2认证和授权:AuthorizationCode认证
  16. 创建第一次C语言程序
  17. Maven - 实例-1-手工创建Maven项目
  18. a标签返回上一页,并刷新
  19. (转)C# BackgroundWorker组件的原理分析
  20. MSI failed, 不能卸载VMware

热门文章

  1. Unity基础之:UnityAPI的学习
  2. 【算法】【排序】【交换类】快速排序QuickSort
  3. Spring cloud 超时配置总结
  4. Maven多模块项目打包前的一些注意事项(打包失败)
  5. javacv——读取摄像头的图像、截取视频的画面
  6. 『深度应用』NLP机器翻译深度学习实战课程&#183;零(基础概念)
  7. C语言连接mysql,用GCC编译
  8. 【畅通工程 HDU - 1232 】【并查集模板】
  9. vue-cli报错:Class constructor FileManager cannot be invoked without &#39;new&#39;
  10. SynchronousQueue队列程序的执行结果分析