为什么一个好的类需要覆写toString()、hashCode()、equals()方法
2018-02-27 09:56
330 查看
第一:覆写Object类中的toString方法
public class Client { public static void main(String[] args) { System.out.println(new Person("张三")); } } class Person{ private String name; public Person(String name){ this.name=name; } }输出的结果是:Person@3ce53108。如果机器不同,@后面的内容也不会相同,但是格式都是:类名+@+hashCode。
这是给机器看的,不是给我们看的,原因是我们没有覆写Object类的toString()方法,覆写之后就可以得到我们需要的输出。
第二:覆写Object类中的hashCode()、equals()方法
这种做法一般是为了增强自定义类的扩展性,尤其是当该类的对象要存入HashSet集合时,覆写这两个方法尤为重要。覆写equals方法之后,可以实现对象的自定义比较,如果不覆写此方法,默认调用Object的equals方法,等同于比较地址值。如果一个类不覆写Object中的hashCode方法,而直接调用该方法,得到的哈希值是由系统计算出的,返回值和对象属性之间没有直接联系。覆写hashCode方法,可以根据对象属性的不同,返回相应的哈希值。
具体到HashSet集合中对这两个方法的调用步骤,如下:
1)当向集合中存入一个元素时,会调用该元素的hashCode方法,得到该对象哈希值,如果集合中已有元素的哈希值和该元素的哈希值不重复,该元素被存入集合。
2)如果要存入元素的哈希值和已有元素的哈希值相同,会进一步调用equals方法,比较这两个元素是否相同,如果不同,该元素依然会被存入集合,如果相同,则认为这两个元素相同,由于集HashSet集合中不能存入相同元素,所以存储动作不会成功。
需要说明的是:覆写这两个方法并非必须。如果只是编写一个用于测试的简单类,完全没有必要一定覆写这两个方法。只是一般开发中考虑到程序的扩展性,或者该类对象有可能被存储到HashSet中,覆写这两个方法可以为以后程序的升级提供方便。当然,一个好的类,一般会覆写Object中的equals方法、hashCode方法、toString方法等。
相关文章推荐
- 【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- HashMap什么时候重写hashcode和equals方法,为什么需要重写
- object对象重写equals方法时为什么需要重写hashCode方法
- 建立一个对象模型的时候,为什么要重写hashCode与equals方法
- 重写equals方法的时候为什么需要重写hashcode
- 《问题总结》JAVA什么时候要覆盖toString()、equals()、hashCode()方法??为什么要覆盖呢? 《通俗回答》
- 覆写equals方法为什么需要覆写hashCode方法
- 重写equals方法时为什么需要重写hashCode方法
- object对象重写equals方法时为什么需要重写hashCode方法
- 【Java基础之重写equals、hashCode和compareTo方法】什么时候需要重写重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 什么时候需要重写equals方法?为什么重写equals方法,一定要重写HashCode方法?
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- 建立一个对象模型的时候,为什么要重写hashCode与equals方法
- 为什么SpringAOP使用JDK动态代理时好像没有代理Object.[equals()、hashCode()、toString()]这三个方法
- 为什么重写equals时,需要重写hashCode()方法
- HashMap将对象作为key为什么需要重写equals和hashcode方法
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- 为什么重写equals方法也要重写hashcode方法
- 为什么覆写equals()方法的时候总是要覆写hashcode()?