JAVA面试大全〖五〗 JAVA基础

转自此处

别的就不闲扯了,武汉加油

一. equals()方法和hashCode()方法是什么?

  • 1. equals()和hashCode()都是是Java中万物之源Object类中的方法
  • 2. equals方法用于比较两个对象是否相同,Object类中equals方法的实现是比较引用地址来判断的对象是否是同一个对象,通过覆盖该方法可以实现自定义的判断规则;
  • 3. hashCode是jdk根据对象的地址或者字符串或者数字计算该对象的哈希码值的方法。

二. 为什么要重写equals()方法?

  • Object类中equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个地址是相等的,否则这两个对象就不想等。
  • 如果有两个对象,他们的属性是相同的,但是地址不同,这样使用equals()比较得出的结果是不相等的,而我们需要的是这两个对象相等,因此默认的equals()方法是不符合我们的要求的,这个时候我们就需要对equals()方法进行重写以满足我们的预期结果。
  • 在java的集合框架中需要用到equals()方法进行查找对象,如果集合中存放的是自定义类型,并且没有重写equals()方法,则会调用Object父类中的equals()方法按照地址比较,往往会出现错误的结果,此时我们应该根据业务需求重写equals()方法。

三. 为什么要重写hashCode()方法?

  • hashCode()方法用于散列数据的快速存储,HashSet/HashMap/Hashtable类存储数据时都是根据存储对象的hashcode值来进行分类存储的,一般先根据hashcode值在集合中进行分类,在根据equals()方法判断对象是否相同。
  • HashMap对象是根据其Key的hashCode来获取对应的Value。
    生成一个好的hashCode值能提高HashSet查找的性能,差的hashCode值不但不能提高性能,甚至可能造成错误。比如hashCode方法中返回常量,会让,HashSet的查找效率退化为List集合的查找效率;hashCode方法中返回随机数,会让查找结果变的不可预测。
  • 好的hashCode生成方式是让对象中的关键属性与质数相乘,并将积相加获取。

四. 为什么java中在重写equals()方法后必须对hashCode()方法进行重写?

  • 为了维护hashCode()方法的equals协定,该协定指出:如果根据 equals()方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果;而两个hashCode()返回的结果相等,两个对象的equals()方法不一定相等。
  • HashMap对象是根据其Key的hashCode来获取对应的Value。
    在重写父类的equals()方法时,也重写hashcode()方法,使相等的两个对象获取的HashCode值也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。

五. .编写一个完美equals()的几点建议

  • 显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量(参数名命名,强制转换请参考建议5);
  • 检测this与otherObject是否引用同一个对象 :if(this == otherObject) return true;(存储地址相同,肯定是同个对象,直接返回true);
  • 检测otherObject是否为null ,如果为null,返回false.if(otherObject == null) return false;
  • 比较this与otherObject是否属于同一个类 (视需求而选择)如果equals的语义在每个子类中有所改变,就使用getClass检测 :if(getClass()!=otherObject.getClass()) return false; (参考前面分析的第6点);如果所有的子类都拥有统一的语义,就使用instanceof检测 :if(!(otherObject instanceof ClassName)) return false;(即前面我们所分析的父类car与子类bigCar混合比,我们统一了批次相同即相等);
  • 将otherObject转换为相应的类类型变量:ClassName other = (ClassName) otherObject;
  • 现在开始对所有需要比较的域进行比较 。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则就返回flase。如果在子类中重新定义equals,就要在其中包含调用super.equals(other);当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明 相等对象必须具有相等的哈希码 。
发布了69 篇原创文章 · 获赞 54 · 访问量 9564

猜你喜欢

转载自blog.csdn.net/kingtok/article/details/104139519