热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java-HashMap默认机制

HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va

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  map=new HashMap();
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 set=map.keySet();
37         Iterator 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 list;//list存放学生信息
 9     private double sum;//总分
10 
11     public ClassRoom() {
12         list=new ArrayList();
13     }
14     public ClassRoom(String className) {
15         this();
16         this.className=className;
17     }
18     public ClassRoom(String className, List 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 getList() {
31         return list;
32     }
33     public void setList(List 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 list=Examing();
15         //根据传过来的学生考试信息求每个班级的总分
16         Map map=getSum(list);
17         //将班级信息,总分,平均分,班级名称打印出来
18         getInfo(map);
19     }
20 
21     //获取班级的信息,包括班级名称,总分,平均分
22     public static void getInfo(Map map) {
23         Set key=map.keySet();
24         //构造迭代器
25         Iterator 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 getSum(List list){
40         //定义一个map集合用于存放班级名(String)
41         Map map=new HashMap();
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 Examing(){
62         Listlist=new ArrayList();
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 }

效果截图:

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

 ps:文章待完善,之后会进行相应的更改。


推荐阅读
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 一、HashSet1.虑重功能特性(HashMap实现)2.put(key)如果重复返回false***Add ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
author-avatar
Eliza
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有