先看一下源码
因为map集合时通过key的hash值来查找的值的,而当修改自定义类型属性后,hash也随之改变,存储位置也就发生了改变。所以当程序在运行时,拿着原来得hash值去寻找现在的hash,是找不到滴。
比如:小明把qq号给了我,我加上他后,小明因为某些原因,这个qq号不用了,那我在通过小明原来得qq号联系他还能联系到吗?联系不到
这里我对小明来说可以看成hashmap集合,小明就是键,qq号就是值。小明因为某些原因,这个qq号不用了,这属于键修改了键中属性,所以当我再去找小明时,就找不到了了,是他不用qq了吗,并不是,他只是换了一个qq没告诉我而已。
显而易见,怎么样才能既修改自定义类中属性,又不耽误找到value呢?
很简单,小明换qq的时候告诉我,我在加上他,就ok了,那么运行到代码里怎么实现呢
我在put进去就可以了呗
上代码:
public class Car {
String brand; //品牌
int price;
public Car(String brand, int price) {
this.brand = brand;
this.price = price;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return price == car.price &&
Objects.equals(brand, car.brand);
}
@Override
public int hashCode() {
return Objects.hash(brand, price);
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
/**
* HashMap集合中的键是自定义类型
*/
public class Test01 {
public static void main(String[] args) {
//定义HashMap存储<Car小汽车, 车主姓名>
HashMap<Car, String > hashMap = new HashMap<>();
Car car = new Car("Benz", 160);
hashMap.put(car, "wang");
hashMap.put(new Car("Nissan", 80), "zhang");
hashMap.put(new Car("Das", 28), "du");
hashMap.put(new Car("Changan", 18), "guo");
hashMap.put(new Car("Sihao", 10), "cui");
for (Map.Entry<Car, String> entry : hashMap.entrySet()) {
System.out.println(entry);
}
System.out.println(hashMap.containsKey(car)); //true
System.out.println( hashMap.get(car)); //wang
car.price = 198;
System.out.println("---------修改Benz的价格后-------------");
for (Map.Entry<Car, String> entry : hashMap.entrySet()) {
System.out.println(entry);
}
System.out.println( hashMap.containsKey(car));//false
}
hashMap.put(car,"wang");
System.out.println("---------再次添加Benz的价格,进入集合后-------------");
for (Map.Entry<Car, String> entry : hashMap.entrySet()) {
System.out.println(entry);
}
System.out.println( hashMap.containsKey(car));//true
}