HashSet内部是用HashMap存放数据的,其中对象的hashCode是键,对象是值。而Set是不能有重复元素的,那它是怎样判断两个元素是不是重复(同一个)呢,就是调用添加的元素的hashCode方法取得hash值,然后在已有列表里面找,如果找到hash相同的元素,再调用添加的元素的equals方法和找到的元素判断是否相等。
在HashSet中就是列表中已有的元素。
因为Object默认hashCode方法,对象不同hash就不同,字符串的hashCode方法是基于内容的,只要内容相同,hash就相同的,Person类重写的hashCode方法返回return this.name.hashCode() * this.age,这样只要名字和年龄是一样的,得到的hash值就是一样的了。也就是说,不重写的话,两个new Person("王五",32)的hash是不同的,因为对象不同,但是重写后获取的hash就相同了。
当调用HashSet的add方法时,首先确定的是添加的是引用类型,而且有重复的元素,所以肯定要重写hashcode和equals方法。每调用hashset中的一个方法都会涉及到哈希值。而添加的重复元素就会调用到equals方法。
Object A需要先判断在向下转型,不然可能有异常吧。
这句就是通过name和age的地址产生一个哈希码。比如第一个person的name的hashcode为30,age的hashcode为40。第二个person的name的hashcode为40,age的hashcode为30,那根据你写的这句话就会有异常了,所以最好在age后面乘上一个100,随便乘,这样安全点,虽然那种情况的几率几乎没有。