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实现心跳机制
一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...
随机推荐
- CS231n 第一次作业KNN中本地CIFAR10数据集的载入
一.问题描述 网上绝大多数作业参考都是在jupyter下运行的,数据集载入过程一般如下: from cs231n.data_utils import load_CIFAR10 #导入数据集,并打印出数 ...
- [Swift]LeetCode106. 从中序与后序遍历序列构造二叉树 | Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- apache(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试 ...
今天启动Apache时, 报了“(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试. : make_sock: could not bind to address 0.0.0.0: ...
- Redis 设计与实现 (六)--发布订阅
发布订阅 相关命令:publish(发布) subscribe(订阅) psubscribe(支持通配符匹配) 发布者--频道--订阅者(发布和订阅都是客户端频道是服务端) 1.publish- ...
- Python档案袋(线程 )
Python的进程和线程是使用的操作系统的原生线程和进程,其是去调用操作系统的相应接口实现 进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程 线程:基于进程,之间可直接共享数据,可执行,只 ...
- python高级-生成器(17)
1. 什么是⽣成器 通过列表⽣成式,我们可以直接创建⼀个列表.但是,受到内存限制,列表容量肯定是有限的.⽽且,创建⼀个包含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素 ...
- MySQL如何系统学习
MySQL是当下互联网最流行的开源数据库.不管你使用或者学习何种编程语言,都将会使用到数据库,而MySQL则是应用最为广泛的数据库,没有之一! 之前在我的博客上也发布过一些MySQL优化配置项,都收到 ...
- Python内置函数(57)——setattr
英文文档: setattr(object, name, value) This is the counterpart of getattr(). The arguments are an object ...
- Java操作符真的简单到易如反掌?
之前我写了一篇<吃人的那些Java名词:对象.引用.堆.栈和堆栈>,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...