Java学习篇之自定义类的相关重写方法

来源:互联网 发布:淘宝买家退款率计算 编辑:程序博客网 时间:2024/06/06 01:15

  上篇博客(Java学习篇之Map集合的遍历方法集锦 )中有一段自定义的Student类的代码,期间涉及到了好多重写方法,下面就根据一个新的案例对部分重写方法进行总结,部分说明文字还是体现在了代码注释中:

  自定义Person类:

package hashCode;public class Person {private String name;private int age;//空参构造,使得用户可以直接实例化一个空参的//对象,再利用对象的set方法进行赋值或者利用//get方法进行取值(相关方法的写法见本类代码最下方)public Person() {super();}//有参构造,便于用户在实例化的同时进行进行赋值和方法的调用public Person(String name, int age) {super();this.name = name;this.age = age;}@Override//重写toString方法,不然打印出的是地址public String toString() {return name+".."+age;}//重写的父类equals方法,保证唯一性public boolean equals(Object obj){if(this==obj){return true;}if (obj==null){return false;}if (obj instanceof Person){Person p=(Person)obj;return name.equals(p.name) && age==p.age;}return false;}@Override//也可以自己重写,保证唯一性public int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}//get和set方法,私有变量,对外提供访问接口public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

  测试类:

package hashCode;/* * 实现存储内容的去重 */import java.util.HashSet;//打印出的结果:[bb..11, aa..11, Aa..11, BB..11]public class HashCodeTest {public static void main(String[] args) {HashSet<Person> setPerson=new HashSet<Person>();setPerson.add(new Person("aa",11));setPerson.add(new Person("aa",11));setPerson.add(new Person("bb",11));setPerson.add(new Person("BB",11));setPerson.add(new Person("Aa",11));setPerson.add(new Person("aa",11));setPerson.add(new Person("aa",11));System.out.println(setPerson);}}

  上述重写的方法有很多,特地说明下重写hashcode(),equals()方法的原因:自定义的类的hashcode()和equals()继承于Object类,其hashcode码为默认的内存地址,这样的话即使含义相同的两个对象,比较也是不相等的,如果不重写hashcode()方法的话。重写hashcode(),equals()方法是为了保证二者的同步关系。

  该案例是比较自定义的Persona类对象,所以需要重写两个方法,该实例就是为了达到去重的目的,所以测试类中用的是set接口下的实现类HashSet类,我尝试将测试类代码中的HashSet那句话换成了如下:  

List<Person> setPerson=new ArrayList<Person>();

  得到的结果就不是去重的了,而是原样打印出来,所以说,set接口的特性(不存储重复元素)的原因也许就在于这里,度娘的意思貌似是和hash有关的自定义类都会用到这两个方法进行重写比较,而且给出了结论:对于equals()相等的两个对象,其hashCode()返回的值一定相等。

  要是对以上内容还是模糊,就记住下面的话吧!比较两个对象是否相等的时候,先看哈希值(利用hashCode()方法),哈希值相同再比较内容(利用equals()方法),双重限定


1 0
原创粉丝点击