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;
}
}