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,”身体健康“);
)