java-HashMap默认机制
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默认机制的更多相关文章
- Java HashMap 默认排序
先看一段Java代码. package com.m58.test; import java.text.ParseException; import java.text.SimpleDateFormat ...
- java源码--HashMap扩容机制学习
待完成 Java中hash算法细述 https://blog.csdn.net/majinggogogo/article/details/80260400 java HashMap源码分析(JDK8) ...
- [翻译]Java HashMap工作原理
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
- 【转】Java HashMap工作原理(好文章)
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- Java 日志缓存机制的实现--转载
概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...
- 自学Java HashMap源码
自学Java HashMap源码 参考:http://zhangshixi.iteye.com/blog/672697 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提 ...
- Java实现心跳机制
一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...
随机推荐
- 深入解析Java反射-invoke方法
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...
- C# 数组结构
数组结构: Array :在内存上是连续分配的,而且元素类型是一致的: 特点:是读取快 可以坐标访问 但是增删慢,长度不能变 比如 int[] intArray=new int[20]; intArr ...
- 基于docker搭建开源扫描器——伏羲
基于docker搭建开源扫描器——伏羲 1.简介 项目地址 伏羲是一款开源的安全检测工具,适用于中小型企业对企业内部进行安全检测和资产统计. 功能一览: 基于插件的漏洞扫描功能(类似于巡风) 漏洞管理 ...
- [Swift]LeetCode56. 合并区间 | Merge Intervals
Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...
- [Swift]LeetCode875. 爱吃香蕉的珂珂 | Koko Eating Bananas
Koko loves to eat bananas. There are N piles of bananas, the i-th pile has piles[i]bananas. The gu ...
- Python面试真题第二节
26.字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳" 27.filter方法求 ...
- Jmeter-常用线程组设置及场景运行时间计算
Jmeter中通过线程组来模拟大用户并发场景,今天主要介绍三个常用的线程组,帮助我们设计更加完善的测试场景,另外介绍下场景执行时间如何计算. 一.Thread Group 取样器错误后要执行的动作 ...
- 【转】Kali更新源
1.切换到root用户(如果已经是root用户就直接看第二步) dnt@Kali:~$ su 2.用vim打开sources.list,手动添加下面的更新源 root@Kali:~# vim /etc ...
- Jquery.ajax dataType参数
dataType 类型:String 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 ...
- Linux基础知识第四讲,文件内容命令
目录 一丶常用命令 1.cat命令演示以及常用选项 2.grep 搜索命令的使用 3.echo 以及 重定向的使用 4.管道概念 一丶常用命令 序号 命令 对应英文 作用 01 cat 文件名 con ...