[Java][练习][HashMap]学生户籍管理练习-增强For与Iterator
要求:
设计学生类:具有姓名和年龄
设计键值对:键为学生类对象,值是字符串对象且为户籍
案例:张三 18岁 长沙
练习查漏补缺:
1.在使用Iterator迭代时,while循环里面的it.next();不可多次重复使用,每增加一行it.next();都会导致在本循环中让第三方变量的遍历推进一次,导致结果异常
解决方案:仅仅使用一个it.next();将获取的键用Student stu来储存 然后用stu来代替这个键进行操作,比如map.get()获取值,比如stu.getAge();获得年龄,避免it.next();的多次复用。
拓展思考:这种创建新变量接收第三方变量的思维在加强for中依然有效,是一种重要的编程思想,需要记忆并且应用在今后的工作中
2.当使用一个Map数据结构时,要注意。输入的时候是使用map.put();获取值的时候是使用map.get();其中键是独一无二的,但是值是多样的
鉴于Map没有顺序,不可重复,无法排序。我们将其的键抽象到set中,借助set的不可重复,没有索引,可以排序的优点进行键的排列。从而获取值的结果
import java.util.*;
import java.util.function.Consumer;
public class Main{
public static void main(String[] args){
//对于一个map集合来说:
/*
1.无序 2.不重复 3.无索引
HashMap和HashSet的底层逻辑都是HashTable
计算键的哈希值 然后在数组中去找到这个索引
如果键是重复的,那么就覆盖 如果键不是重复的 那么就会添加新的entry对象
但是在JDK8以前会让原数据下来 然后挂载新元素上
JDK8以后 会直接在旧数据基础上构成一个树结构
总结而言:
1.HashMap底层是哈希表结构的
2.依赖于Hashcode以及equals方法来保证键的唯一
3.如果键存储的是自定义对象 需要重写hashcode和equals方法
4.如果键存的是自定义对象 不需要重写hashcode和equals方法
*/
Student s1 = new Student("xyc",18);
Student s2 = new Student("www",19);
HashMap<Student,String> map = new HashMap<>();
map.put(s1,"湘潭");
map.put(s2,"长沙");
Set<Student> Hset = map.keySet();
Iterator<Student> it =Hset.iterator();
while(it.hasNext()){
Student stu = it.next();
String city = map.get(stu);
String name = stu.getName();
int age = stu.getAge();
System.out.println(city+name+age);//it.next();调用存在一个问题 每次调用其实就是往后推了一次
}
System.out.println("——————————————————————————————");
for (Student student : Hset) {
Student stu = student;
String city = map.get(stu);
int age = stu.getAge();
String name=stu.getName();
System.out.println(city+age+name);
}
}
}