进阶day04-Map集合存储自定义对象(要重写hashCode&equals)
This commit is contained in:
33
javaSE-day04/src/com/inmind/map01/MapDemo04.java
Normal file
33
javaSE-day04/src/com/inmind/map01/MapDemo04.java
Normal file
@@ -0,0 +1,33 @@
|
||||
package com.inmind.map01;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
|
||||
/*
|
||||
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。
|
||||
学生作为键, 家庭住址作为值。
|
||||
注意:学生姓名相同并且年龄相同视为同一名学生。
|
||||
|
||||
|
||||
总结:
|
||||
1.hashMap存储自定义对象时,要实现去重,必须在自定义类中重写hashcode和equals
|
||||
2.HashMap:底层是哈希表,它要实现去重,它跟hashcode和equals有关
|
||||
3.HashSet底层就是HashMap.(查看源码),就是将Set中的数据作为map的键,而值永远是同一个常量
|
||||
*/
|
||||
public class MapDemo04 {
|
||||
public static void main(String[] args) {
|
||||
//定义出一个键为Student,值为String的双列集合
|
||||
HashMap<Student, String> map = new HashMap<>();
|
||||
|
||||
map.put(new Student("张三", 18), "苏州");
|
||||
map.put(new Student("李四", 19), "无锡");
|
||||
map.put(new Student("王五", 20), "常州");
|
||||
//业务上,我希望是王五从常州搬到了上海
|
||||
map.put(new Student("王五", 20), "上海");
|
||||
|
||||
System.out.println(map);
|
||||
|
||||
HashSet<String> sets = new HashSet<>();
|
||||
sets.add("1123");
|
||||
}
|
||||
}
|
||||
38
javaSE-day04/src/com/inmind/map01/Student.java
Normal file
38
javaSE-day04/src/com/inmind/map01/Student.java
Normal file
@@ -0,0 +1,38 @@
|
||||
package com.inmind.map01;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class Student {
|
||||
String name;
|
||||
int age;
|
||||
|
||||
public Student(String name, int age) {
|
||||
this.name = name;
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Student{" +
|
||||
"name='" + name + '\'' +
|
||||
", age=" + age +
|
||||
'}';
|
||||
}
|
||||
|
||||
//重写equals的目的:为了让2个内容相同的对象,看作是同一个
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Student student = (Student) o;
|
||||
return age == student.age && Objects.equals(name, student.name);
|
||||
}
|
||||
|
||||
//重写hashCode的目的:为了让相同内容的对象,特征码(对象的哈希值)相同
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Objects.hashCode(name);
|
||||
result = 31 * result + age;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user