Hash实现相同Key赋值不会覆盖以及重写equals和hasCode()方法的原因和代码

本文探讨了如何在使用HashMap时避免键值对覆盖的问题。针对已重写equals和hashCode方法的类,可以通过创建子类并重写put方法实现。而对于未重写相关方法的自定义类,需要同时重写equals和hashCode方法,确保对象内容相等时返回true,并生成相同的哈希码。通过这种方式,可以确保相同键插入不同值时,值会以特定方式组合而非被覆盖。
摘要由CSDN通过智能技术生成

Hash实现相同key赋值不会覆盖
1.针对像String这样已经重写了equals和hashCode()方法的类
主要方法就是写一个自己的HashMap类继承HashMap类,并重写它的put(方法

public class MyHashMap<K> extens HashMap<K,String>@override
public void put(K key,String value){
       NewValue = value;
       if(**containsKey**(key))
       {
           String OldValue  = super.get(key);
           NewValue  = OldValue+"-"+NewValue;
       }
       super.put(key,NewValue);
}public static void main(String args[]){
MyHashMap<String> map = new MyHashMap<String>();
map.put("aa","asdads");
map.put("aa","asdadsadsas");
}

2.对于没有重新equals()和hasCode()方法的自定义类就必须重写equals()和hasCode()方法
重写equals()方法的情况:
因为原始的equals()只能判断俩个引用类型的变量是不是指向同一个地址,如果指向同一个地址,自然返回true,但也存在俩个引用类型的变量不是指向同一个地址,但俩个地址存储的数据是相同的,这时我们也需要来返回true,所以需要重写equals()方法

public class Student (
       String name;
       int age;
       String number;
    public boolean equals(Object o){
       if(o==this)
         {
         return true;
         }
        if(!(o instanceof Student))
        {
        return false; 
        //instanceof  已经判断了o为null的情况,还可以用于判断是不是接口的实现类,是不是子类,以及间接子类(Person m1 = new Man()其中person是man的父类,m1.instanceof(new Man())也会返回true)
        }
        Studenet s = (Student) o;
        第一种写法:
        return     this.name.equals(o.name)&&this.age==o.age&&this.number.equals(o.number);
//调用String类型的equals方法以及基本数据类型的“==”来判断内容是否相等。    
 或者可以利用 
   第二种写法:      Objects.equals(o.name,this.name)&&Objects.equals(o.number,this.number)&&o.age==this,age;

}  

重写hasCode()方法的情况:
当向Set中写入值(s1和s2,他们的各种属性值都相等)时,Set中会出现俩个元素,因为Set底层也是靠HashMap实现的,俩个引用对象的地址不同所以哈希码不同,就会存在不同的位置,为了避免这种情况,所以需要重写hasCode()方法

public int hasCode(){
第一种写法
 int  result = name.hasCode();
 reuslt = 17*result+number.hasCode();
第二种写法
 return  Objects.hasCode(name,number);
 第三种写法
 return Objects.hash(name.number);

}

}
针对自己重写equals()和hasCode()方法的类重复key,插入值不会覆盖的运用:

MyHashMap<Student>  map = new MyHashMap<Student>();
Student s1 = new Student("liuhao","24","5645645");
map.put(s1,"暴富");
map.put(s1,”身体健康“);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值