HashMap存储自定义类型键值
Map集合保证key是唯一的
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一。
第一种情况
HashMap存储自定义类型键值
key:String类型
String类重写hashCode方法和equals方法,可以保证key唯一
value:Person类型
value可以重复(同名,同年龄)
private static void show01() {
HashMap<String,Person> map = new HashMap<>();
//添加元素
map.put("wuhan",new Person("Clearlove",18));
map.put("pingxiang",new Person("knight",19));
map.put("pingxiang",new Person("yagao",17));
//keySet和增强for遍历
Set<String> set = map.keySet();
for(String key:set){
System.out.println("key-->"+map.get(key));
}
}
因为String已经重写了hashCode方法和equals方法,所以相同的字符串内容被认定为一个,故没有输出相同的key以及value
第二种情况
HashMap存储自定义类型键值
key:Person类型
必须重写hashCode方法和equals方法,保证key唯一
value:String类型
可以重复
Person中重写hashCode方法和equals方法,
以此来判定同名并且同年龄的人是同一个人
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
private static void show02() {
HashMap<Person,String> map = new HashMap<>();
map.put(new Person("Clearlove",17),"EDG");
map.put(new Person("Uzi",18),"RNG");
map.put(new Person("Bin",18),"SN");
map.put(new Person("Clearlove",17),"EDG");
//使用entrySet和增强for遍历
Set<Map.Entry<Person,String>> entry = map.entrySet();
for(Map.Entry<Person,String> set:entry){
System.out.println(set.getKey()+"="+set.getValue());
}
}
可以看到,同名并且同年龄的人被认定为一个人,只输出了一次!