java-HashMap默认机制
HashMap:键值对(key-value):
通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.
默认是1:1关系:
存在则覆盖,当key已经存在,则利用新的value覆盖原有的value;
示例:
1 package com.etc; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class Test { 7 8 public static void main(String[] args) { 9 Map map=new HashMap(); 10 map.put(1, "java"); 11 map.put(2, "python"); 12 map.put(1, "c++"); 13 System.out.println(map.get(1)+" "+map.get(2)); 14 15 } 16 }
运行效果截图:
很明显可以看出来,key1对应的value值被后面put进去的value值覆盖了,那么问题来了,如果我想要一个key去存放多个value值,以便观察其value值的变化趋势该怎么办呢?
分拣存储(分组归类):
what? : 以快递公司分拣包裹为例,首先包裹可以来自不同的地方(北京上海深圳广东...)然而快递选择的方式似乎就那么几种,什么顺丰,京东,韵达,邮政等,我们需要确定包裹选择怎样的快递,然后把它们分开,对每一种快递方式对应的包裹进行不一样的操作,这就是分拣的一种场景,然后我要存放这些相同快递的包裹,就得有个容器,这就开始奔向了java的HashMap的特殊机制了。
示例1:
1 package com.etc; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.Map; 6 import java.util.Set; 7 8 /* 9 统计单词出现的次数 10 思路: 11 1.分割字符串 12 2.分拣存储 1:N 13 3.按要求查看单词出现的次数 14 */ 15 public class MapDemo1 { 16 public static void main(String[] args) { 17 String str="i just want to study hard and i feel so happy"; 18 //根据空格分割字符串 19 String[] arr=str.split(" "); 20 //利用泛型存放 单词-次数 21 Map <String,Integer> map=new HashMap<String,Integer>(); 22 for(String key :arr) { 23 //将每个单词打印出来 24 System.out.print(key+"--"); 25 //若单词不存在相同的 26 if(!map.containsKey(key)) { 27 //将value值也就是次数设为1 28 map.put(key, 1); 29 //若存在相同的,则每出现一次将value值+1 30 }else { 31 map.put(key, map.get(key)+1); 32 } 33 } 34 System.out.println(); 35 //查看每个单词的次数 36 Set<String> set=map.keySet(); 37 Iterator<String> it=set.iterator(); 38 while(it.hasNext()) { 39 String key=it.next(); 40 Integer value=map.get(key); 41 //打印出单词及其出现的次数 42 System.out.println(key+"-->"+value); 43 } 44 } 45 }
效果截图:
示例2:(面向对象实现分拣存储)
我们模拟一个场景,有多个班级的学生同时进行考试后将个人信息录入,我们需要得到每个班的总分和平均分并将其记录下来。
代码实现:
1.新建两个实体类,用于创建对象记录信息
(1)Student.java
1 package com.etc; 2 3 public class Student { 4 //学生的姓名,编号,所属班级名,分数 5 private String name; 6 private int id; 7 private String className; 8 private double score; 9 10 public Student() { 11 12 } 13 public Student(String name, int id, String className, double score) { 14 super(); 15 this.name = name; 16 this.id = id; 17 this.className = className; 18 this.score = score; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public int getId() { 27 return id; 28 } 29 public void setId(int id) { 30 this.id = id; 31 } 32 public String getClassName() { 33 return className; 34 } 35 public void setClassName(String className) { 36 this.className = className; 37 } 38 public double getScore() { 39 return score; 40 } 41 public void setScore(double score) { 42 this.score = score; 43 } 44 45 }
(2)ClassRoom.java
1 package com.etc; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ClassRoom { 7 private String className;//班级名称 8 private List<Student> list;//list存放学生信息 9 private double sum;//总分 10 11 public ClassRoom() { 12 list=new ArrayList<Student>(); 13 } 14 public ClassRoom(String className) { 15 this(); 16 this.className=className; 17 } 18 public ClassRoom(String className, List<Student> list, double sum) { 19 super(); 20 this.className = className; 21 this.list = list; 22 this.sum = sum; 23 } 24 public String getClassName() { 25 return className; 26 } 27 public void setClassName(String className) { 28 this.className = className; 29 } 30 public List<Student> getList() { 31 return list; 32 } 33 public void setList(List<Student> list) { 34 this.list = list; 35 } 36 public double getSum() { 37 return sum; 38 } 39 public void setSum(double sum) { 40 this.sum = sum; 41 } 42 43 }
2.测试类,进行场景模拟及方法实现
1 package com.etc; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Set; 9 10 public class MapDemo2 { 11 12 public static void main(String[] args) { 13 //考试信息录入 14 List<Student> list=Examing(); 15 //根据传过来的学生考试信息求每个班级的总分 16 Map<String,ClassRoom> map=getSum(list); 17 //将班级信息,总分,平均分,班级名称打印出来 18 getInfo(map); 19 } 20 21 //获取班级的信息,包括班级名称,总分,平均分 22 public static void getInfo(Map<String,ClassRoom> map) { 23 Set<String> key=map.keySet(); 24 //构造迭代器 25 Iterator<String> it=key.iterator(); 26 //获取记录 27 while(it.hasNext()) { 28 String cno=it.next(); 29 ClassRoom cr=map.get(cno); 30 //查看总分,计算平均分 31 double total=cr.getSum(); 32 //计算平均分:总分/该班级下的学生数 33 double avg=total/cr.getList().size(); 34 System.out.println(" 班级名称:"+cno+" 总分:"+total+" 平均分:"+avg); 35 } 36 } 37 38 //统计信息,每个班的平均成绩 39 public static Map<String,ClassRoom> getSum(List<Student> list){ 40 //定义一个map集合用于存放班级名(String) 41 Map<String,ClassRoom> map=new HashMap<String,ClassRoom>(); 42 //遍历list 43 for(Student stu :list) { 44 String cno=stu.getClassName();//班级编号 45 double sco=stu.getScore();//学生成绩 46 //查看是否有该班级 47 ClassRoom cr=map.get(cno); 48 if(cr==null) { 49 //不存在则创建班级 50 cr=new ClassRoom(cno); 51 map.put(cno, cr); 52 } 53 //存在则放入学生 54 cr.getList().add(stu);//放入学生 55 cr.setSum(cr.getSum()+sco);//计算该班级的总分 56 } 57 return map; 58 } 59 60 //场景模拟,学生考试成绩信息录入 61 public static List<Student> Examing(){ 62 List<Student>list=new ArrayList<Student>(); 63 list.add(new Student("张三",1,"软件一班",85)); 64 list.add(new Student("李四",2,"软件一班",87)); 65 list.add(new Student("王五",3,"软件二班",86)); 66 list.add(new Student("朱六",4,"软件二班",85)); 67 list.add(new Student("关羽",4,"软件二班",88)); 68 return list; 69 } 70 71 }
效果截图:
好了,这样就将之前学过的泛型以及简单的分拣方法用上去了,同时也实现了面向对象编程,不过还是需要进行深入,因为真正的分拣存储(对于我这个小白)还是比较晦涩难懂的。