set集合中可以自动去除掉重复元素也是重写了 equals和hashcode
equals的重写
//Employee 是 person 的子类
// 这个是要求姓名一致,id一致才是同一个职员,进行equals重写比较
@Override
public boolean equals(Object obj){
if(obj instanceof Employee){
Employee e=(Employee)obj;
return super.equals(obj)&&e.getId==id;
}
return false;
}
//父类使用了instanceof关键字,违反了equals的传递性原则,使用getClass进行类型判断
@Override
public boolean equals(Object obj){
if(obj!=null && obj.getClass() == this.getClass()){
Person p=(Person)obj;
if(p.getName()==null || name==null){
return false;
}else{
return name.equalsIgnoreCase(p.getName());
}
}
}
//重写了equals方法一定要重写hashCode方法
@Override
public int hashCode(){
return new HashCodeBuilder().append(name).toHashCode();
}
原因是HashMap的底层处理机制是以数组的方式保存Map条目(Map Entry)的,这其中的关键是这个数组下标的处理机制:依据传入元素hashCode方法的返回值决定其数组的下标,如果该数组位置上已经有了Map条目,且与传入的键值想的相等则不处理,若不相等则覆盖;如果数组位置没有条目,则插入,并加入到Map条目的链表中。
同理,检查键是否存在也是根据哈希码确定位置的,然后遍历查找键值的。
--(put时键值冲突而使用的链地址法 如何处理 相同的bucket值 而不同的value值,还有get如何区分)
对象元素的hashCode()的返回值:一个对象的哈希码,是由Object类的本地方法生成的,确保没个对象有一个哈希码。
//重写toString()方法
public String toString(){
return String.format("%s.name=%",this.getClass().name);
}