Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
那么在调用集合的添加方法时,必然会对元素进行比较,如果重复就不存入,如果不重复就存入。
而这个比较的过程为:1、先比较hashCode值,如果不同,则将对象存入集合中;
2、如果hashCode值相同,则调用equals方法判断两个对象是否相同,如果相同不存入,如果不同则存入集合中。
如果没有重写hashCode方法,就会可能出现两个元素的hashCode值不同,但元素内容是一样的,此时就会重复添加元素。
如果没有重写equals方法,那么当两个元素不一样,hashCode值不同,但AbstractSet类的的equals方法判断两个元素相同,就会少添加元素。
以楼主的代码为例:
al.add(new Person("a1",11));
al.add(new Person("a2",12));
al.add(new Person("a2",12)); //如果没有重写hashCode方法,因为每次new Person对象都会给一个不同的hashCode值,故会将此对象存入集合,出现重复元素的情况
al.add(new Person("a3",13));
al.add(new Person("a3",12)); //如果没有重写equals方法,有可能底层的equals方法判断new Person("a3",12)和new Person("a3",13)这两个对象一样,则不存入集合
//则少添加元素
al.add(new Person("a4",12));
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。因此,需要重写hashcode和equals方法。 |