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)); }
}

运行效果截图:

java-HashMap默认机制

很明显可以看出来,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);
}
}
}

效果截图:

java-HashMap默认机制

示例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默认机制

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

上一篇:ThreadLocal的是否有设计问题


下一篇:ThreadLocal 源码剖析