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实现心跳机制
一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...
随机推荐
- mysql数据库连接异常问题(总结)
mysql数据库连接异常问题(总结) 1.1 前言 最近项目由1个数据源增加至了3个数据源(连接池使用C3P0),结果各种奇葩的数据库连接问题接踵而至,为防止将来再次遇到同样的问题不犯同样错误,现 ...
- VSTS 执行git pull报错问题修复
VSTS中进行双向同步配置的git pull指令如下: 运行时报错,Log如下图所示: 原因说的很清楚了,需要提前执行以下两条git config指令: git config --global use ...
- 微服务(Microservices)和服务网格(Service Mesh)架构概念整理
注:文章内容为摘录性文字,自己阅读的一些笔记,方便日后查看. 微服务(Microservices) 在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技 ...
- 浅析Diffie–Hellman
一.作者 这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie).马丁·赫尔曼(Martin Edward Hellman)于1976年发表. 二.说明 它是一种安全协 ...
- 安卓开发学习笔记(四):Android Stuidio无法实现隐式Intent是为什么?
一.首先检查我们的代码: FirstActivity.java(主活动程序当中的代码):Button3监听器后面的代码就是我们隐式Intent的业务逻辑所在了,大家可以往下面看看,大概在代码的第57行 ...
- Eclipse极致性能调优
直接复制以下到eclipse.ini里面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 -Xverify:n ...
- [Swift]LeetCode312. 戳气球 | Burst Balloons
Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...
- [Swift]LeetCode778. 水位上升的泳池中游泳 | Swim in Rising Water
On an N x N grid, each square grid[i][j]represents the elevation at that point (i,j). Now rain start ...
- OpenOCD的概念,安装和使用
概念: OpenOCD是一个运行于PC上的开源调试软件,它可以控制包括Wiggler之内的很多JTAG硬件:我们可以将它理解为一种GDB服务程序.OpenOCD的源码只能通过SVN下载,地址是:svn ...
- iOS学习——#define、const、typedef的区别
在iOS开发中经常遇到一些字段和类型的定义,例如配置生产和测试不同环境的参数等,这时候经常用到#define.const以及typedef.那么它们之间有什么区别呢?我们接下来一个一个具体了解下. 一 ...