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 }

效果截图:

好了,这样就将之前学过的泛型以及简单的分拣方法用上去了,同时也实现了面向对象编程,不过还是需要进行深入,因为真正的分拣存储(对于我这个小白)还是比较晦涩难懂的。

原文地址:https://www.cnblogs.com/weekstart/p/10775040.html