public class MapTest {
/**
* 每一个学生都有对应的归属地 学生Student,地址:String
* 学生属性:姓名和年龄
* 注意:姓名和年龄相同的视为同一个学生 保证学生的唯一性
*
* 1,描述学生 2,定义map容器,将学生作为键,地址做为仁政,存入 3,获取map集合中的元素
*/
public static void main(String[] args) {
Map<Student,String> map=new HashMap<Student,String>();
map.put(new Student("scg",25), "吉安");
map.put(new Student("scg",28), "梅县");
map.put(new Student("ldm",21), "吉林长春");
map.put(new Student("zdf",16), "合肥");
map.put(new Student("lmp",24), "长化");
map.put(new Student("zdf",24), "长化");
map.put(new Student("zdf",16), "长化");
map.put(new Student("scf",22), "太原");
//第一种取出方式
//得到所有的key的集合
Set<Student> keys=map.keySet();
Iterator<Student> ite=keys.iterator();
while(ite.hasNext()){
//返回迭代到的元素
Student s=ite.next();
//得到key所对应的value
String values=map.get(s);
System.out.println("第一种取出方式:"+"姓名:"+s.getName()+"..."+"..年龄:"+s.getAge()+"..地址:"+values);
}
//第二种取出方式
//取出集合中的元素
//得到所有key和vlaue映射的集合
Set<Map.Entry<Student,String>> sets=map.entrySet();
//获取迭代器
Iterator<Map.Entry<Student,String>> itea=sets.iterator();
while(itea.hasNext()){
Map.Entry<Student, String> mapInfo=itea.next();
Student s=mapInfo.getKey();
String sv=mapInfo.getValue();
System.out.println("第二种取出方式:学生:姓名:"+s.getName()+"...年龄:"+s.getAge()+"...地址:"+sv);
}
}
}
// hash中判断唯一性是根据的是对象的equals和hashcode方法
class Student { // 保证学生的唯一性
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 先判断hashcode值再判断equals
@Override
public int hashCode() {
//我们使用对象的姓名的hashcode+年龄+27/或39都是可以的
//使用这个来保证对象的唯一性
return this.name.hashCode()+this.age*37;
}
//根据内容来判断
//当姓名和年龄都相等的时候它们是同一个人
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Student))
return false;
Student s=(Student)obj;
return s.name.equals(s.name)&&this.age==s.age;
}
}