HashMap:键值对(key-value):

通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.

默认是1:1关系:

存在则覆盖,当key已经存在,则利用新的value覆盖原有的value;

示例:

 package com.etc;

 import java.util.HashMap;
import java.util.Map; public class Test { public static void main(String[] args) {
Map map=new HashMap();
map.put(1, "java");
map.put(2, "python");
map.put(1, "c++");
System.out.println(map.get(1)+" "+map.get(2)); }
}

运行效果截图:

很明显可以看出来,key1对应的value值被后面put进去的value值覆盖了,那么问题来了,如果我想要一个key去存放多个value值,以便观察其value值的变化趋势该怎么办呢?

分拣存储(分组归类):

  what? : 以快递公司分拣包裹为例,首先包裹可以来自不同的地方(北京上海深圳广东...)然而快递选择的方式似乎就那么几种,什么顺丰,京东,韵达,邮政等,我们需要确定包裹选择怎样的快递,然后把它们分开,对每一种快递方式对应的包裹进行不一样的操作,这就是分拣的一种场景,然后我要存放这些相同快递的包裹,就得有个容器,这就开始奔向了java的HashMap的特殊机制了。

示例1:

 package com.etc;

 import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; /*
统计单词出现的次数
思路:
1.分割字符串
2.分拣存储 1:N
3.按要求查看单词出现的次数
*/
public class MapDemo1 {
public static void main(String[] args) {
String str="i just want to study hard and i feel so happy";
//根据空格分割字符串
String[] arr=str.split(" ");
//利用泛型存放 单词-次数
Map <String,Integer> map=new HashMap<String,Integer>();
for(String key :arr) {
//将每个单词打印出来
System.out.print(key+"--");
//若单词不存在相同的
if(!map.containsKey(key)) {
//将value值也就是次数设为1
map.put(key, 1);
//若存在相同的,则每出现一次将value值+1
}else {
map.put(key, map.get(key)+1);
}
}
System.out.println();
//查看每个单词的次数
Set<String> set=map.keySet();
Iterator<String> it=set.iterator();
while(it.hasNext()) {
String key=it.next();
Integer value=map.get(key);
//打印出单词及其出现的次数
System.out.println(key+"-->"+value);
}
}
}

效果截图:

示例2:(面向对象实现分拣存储)

  我们模拟一个场景,有多个班级的学生同时进行考试后将个人信息录入,我们需要得到每个班的总分和平均分并将其记录下来。

代码实现:

1.新建两个实体类,用于创建对象记录信息

(1)Student.java

 package com.etc;

 public class Student {
//学生的姓名,编号,所属班级名,分数
private String name;
private int id;
private String className;
private double score; public Student() { }
public Student(String name, int id, String className, double score) {
super();
this.name = name;
this.id = id;
this.className = className;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
} }

(2)ClassRoom.java

 package com.etc;

 import java.util.ArrayList;
import java.util.List; public class ClassRoom {
private String className;//班级名称
private List<Student> list;//list存放学生信息
private double sum;//总分 public ClassRoom() {
list=new ArrayList<Student>();
}
public ClassRoom(String className) {
this();
this.className=className;
}
public ClassRoom(String className, List<Student> list, double sum) {
super();
this.className = className;
this.list = list;
this.sum = sum;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public List<Student> getList() {
return list;
}
public void setList(List<Student> list) {
this.list = list;
}
public double getSum() {
return sum;
}
public void setSum(double sum) {
this.sum = sum;
} }

2.测试类,进行场景模拟及方法实现

 package com.etc;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set; public class MapDemo2 { public static void main(String[] args) {
//考试信息录入
List<Student> list=Examing();
//根据传过来的学生考试信息求每个班级的总分
Map<String,ClassRoom> map=getSum(list);
//将班级信息,总分,平均分,班级名称打印出来
getInfo(map);
} //获取班级的信息,包括班级名称,总分,平均分
public static void getInfo(Map<String,ClassRoom> map) {
Set<String> key=map.keySet();
//构造迭代器
Iterator<String> it=key.iterator();
//获取记录
while(it.hasNext()) {
String cno=it.next();
ClassRoom cr=map.get(cno);
//查看总分,计算平均分
double total=cr.getSum();
//计算平均分:总分/该班级下的学生数
double avg=total/cr.getList().size();
System.out.println(" 班级名称:"+cno+" 总分:"+total+" 平均分:"+avg);
}
} //统计信息,每个班的平均成绩
public static Map<String,ClassRoom> getSum(List<Student> list){
//定义一个map集合用于存放班级名(String)
Map<String,ClassRoom> map=new HashMap<String,ClassRoom>();
//遍历list
for(Student stu :list) {
String cno=stu.getClassName();//班级编号
double sco=stu.getScore();//学生成绩
//查看是否有该班级
ClassRoom cr=map.get(cno);
if(cr==null) {
//不存在则创建班级
cr=new ClassRoom(cno);
map.put(cno, cr);
}
//存在则放入学生
cr.getList().add(stu);//放入学生
cr.setSum(cr.getSum()+sco);//计算该班级的总分
}
return map;
} //场景模拟,学生考试成绩信息录入
public static List<Student> Examing(){
List<Student>list=new ArrayList<Student>();
list.add(new Student("张三",1,"软件一班",85));
list.add(new Student("李四",2,"软件一班",87));
list.add(new Student("王五",3,"软件二班",86));
list.add(new Student("朱六",4,"软件二班",85));
list.add(new Student("关羽",4,"软件二班",88));
return list;
} }

效果截图:

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

java-HashMap默认机制的更多相关文章

  1. Java HashMap 默认排序

    先看一段Java代码. package com.m58.test; import java.text.ParseException; import java.text.SimpleDateFormat ...

  2. java源码--HashMap扩容机制学习

    待完成 Java中hash算法细述 https://blog.csdn.net/majinggogogo/article/details/80260400 java HashMap源码分析(JDK8) ...

  3. [翻译]Java HashMap工作原理

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...

  4. 【转】Java HashMap工作原理(好文章)

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...

  5. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  6. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

  7. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  8. Java 日志缓存机制的实现--转载

    概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...

  9. 自学Java HashMap源码

    自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...

  10. Java实现心跳机制

    一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...

随机推荐

  1. unittest测试套件

    测试套件就是测试集,测试集是测试用例的集合. a.按用例顺序执行(addtest) 当addtest与unittest的测试规则冲突时,仍然按照ASCII码的顺序执行. import unittest ...

  2. PostgreSQL+PostGIS 的使用

    一.PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Features”类型,同时在此基础上扩展了对3DZ.3DM.4D坐标的支持. 1. OGC的WKB和WKT格式 OG ...

  3. #Java学习之路——基础阶段(第十篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  4. vue-cli的跨域设置

    概述 今天打算快速使用vue-cli建立一个小应用用于测试,使用axios发送http请求,但是遇到了跨域问题,总结了一下,供以后开发时参考,相信对其他人也有用. vue-cli的跨域设置 在vue. ...

  5. [Swift]LeetCode383. 赎金信 | Ransom Note

    Given an arbitrary ransom note string and another string containing letters from all the magazines, ...

  6. [Swift]LeetCode598. 范围求和 II | Range Addition II

    Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...

  7. 想成为Python全栈开发工程师必须掌握的技能

    什么是Python全栈工程师? 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念 也分很多种类 真正的全栈工程师涵盖了we ...

  8. Python时间和时间戳互相转换

    # 将时间变成时间戳 def tranftimestamp(stringtime): try: return time.mktime(time.strptime(stringtime, "% ...

  9. Git中用vim打开、修改、保存文件(转)

    一.vim 有两种工作模式: 1.命令模式:接受.执行 vim操作命令的模式,打开文件后的默认模式: 2.编辑模式:对打开的文件内容进行 增.删.改 操作的模式: 3.在编辑模式下按下ESC键,回退到 ...

  10. .net core使用EasyNetQ做EventBus

    随着SOA.微服务.CQRS的盛行,EventBus越来越流行,上GitHub搜了一下,还是有蛮多的这类实现,老牌的有NServiceBus(收费).MassTransit,最近的有CAP(国人写的, ...