Map存储对象
对象类的代码(已经重写equals方法和tostring方法,hashcode方法!):
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override//继承自object类,覆盖重写此方法。
public String toString() {
return "我叫:"+name+",年龄为:"+age;
}
//equals比较两个地址值没有意义,所以覆盖重写一下。
/* @Override
public boolean equals(Object obj) {
//为了提高效率
*//*1.传递的参数是自己*//*
if (obj==this)
return true;
//2.传递的参数是空
if (obj==null)
return false;
//if语句防止类型转换错误。
if (obj instanceof Person)
{
Person p=(Person)obj;
boolean b=this.name.equals(p.name)&&this.age==p.age;
return b;
}
//向下转型可以调用到子方法。
return false;
}*/
//等效于上面的自定义的equals重写。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;//使用反射技术,判断o是否是person类 等效于obj instanceof person。getclass()相当于获取类名称,如Getclass()获取当前类的名称。
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
对象作为key值传入
注意点:
key值唯一(为了保证key唯一,必须重写hashcode方法和equals方法),value值不固定
private static void demo02() {
HashMap<Person,String> map=new HashMap<>();
map.put(new Person("迪丽热巴1",18),"上海");
map.put(new Person("迪丽热巴2",19),"北京");
map.put(new Person("迪丽热巴3",20),"广州");
map.put(new Person("迪丽热巴1",18),"北京");
Set<Map.Entry<Person, String>> entries = map.entrySet();
for (Map.Entry<Person, String> entry:entries
) {
Person person = entry.getKey();
String value = entry.getValue();
System.out.println(value+"------>"+person);
}
}
显示效果
北京------>我叫:迪丽热巴1,年龄为:18
北京------>我叫:迪丽热巴2,年龄为:19
广州------>我叫:迪丽热巴3,年龄为:20
对象作为value传入
private static void demo01() {
HashMap<String,Person> map=new HashMap<>();
map.put("上海",new Person("迪丽热巴1",18));
map.put("北京",new Person("迪丽热巴2",19));
map.put("广州",new Person("迪丽热巴3",20));
map.put("北京",new Person("迪丽热巴4",21));
for (String str:map.keySet()
) {
Person p = map.get(str);
System.out.println(str+"------>"+p);
}
}
显示效果
上海------>我叫:迪丽热巴1,年龄为:18
广州------>我叫:迪丽热巴3,年龄为:20
北京------>我叫:迪丽热巴4,年龄为:21