HashMap:鍵值對(key-value):
通過對象來對對象進行索引,用來索引的對象叫做key,其對應的對象叫做value.
默認是1:1關系:
存在則覆蓋,當key已經存在,則利用新的value覆蓋原有的value;
示例:
1 package com.etc; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class Test { 7 8 public static void main(String[] args) { 9 Map map=new HashMap(); 10 map.put(1, "java"); 11 map.put(2, "python"); 12 map.put(1, "c++"); 13 System.out.println(map.get(1)+" "+map.get(2)); 14 15 } 16 }
運行效果截圖:
很明顯可以看出來,key1對應的value值被后面put進去的value值覆蓋了,那么問題來了,如果我想要一個key去存放多個value值,以便觀察其value值的變化趨勢該怎么辦呢?
分揀存儲(分組歸類):
what? : 以快遞公司分揀包裹為例,首先包裹可以來自不同的地方(北京上海深圳廣東...)然而快遞選擇的方式似乎就那么幾種,什么順豐,京東,韻達,郵政等,我們需要確定包裹選擇怎樣的快遞,然后把它們分開,對每一種快遞方式對應的包裹進行不一樣的操作,這就是分揀的一種場景,然后我要存放這些相同快遞的包裹,就得有個容器,這就開始奔向了java的HashMap的特殊機制了。
示例1:
1 package com.etc; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import java.util.Map; 6 import java.util.Set; 7 8 /* 9 統計單詞出現的次數 10 思路: 11 1.分割字符串 12 2.分揀存儲 1:N 13 3.按要求查看單詞出現的次數 14 */ 15 public class MapDemo1 { 16 public static void main(String[] args) { 17 String str="i just want to study hard and i feel so happy"; 18 //根據空格分割字符串 19 String[] arr=str.split(" "); 20 //利用泛型存放 單詞-次數 21 Map <String,Integer> map=new HashMap<String,Integer>(); 22 for(String key :arr) { 23 //將每個單詞打印出來 24 System.out.print(key+"--"); 25 //若單詞不存在相同的 26 if(!map.containsKey(key)) { 27 //將value值也就是次數設為1 28 map.put(key, 1); 29 //若存在相同的,則每出現一次將value值+1 30 }else { 31 map.put(key, map.get(key)+1); 32 } 33 } 34 System.out.println(); 35 //查看每個單詞的次數 36 Set<String> set=map.keySet(); 37 Iterator<String> it=set.iterator(); 38 while(it.hasNext()) { 39 String key=it.next(); 40 Integer value=map.get(key); 41 //打印出單詞及其出現的次數 42 System.out.println(key+"-->"+value); 43 } 44 } 45 }
效果截圖:
示例2:(面向對象實現分揀存儲)
我們模擬一個場景,有多個班級的學生同時進行考試后將個人信息錄入,我們需要得到每個班的總分和平均分並將其記錄下來。
代碼實現:
1.新建兩個實體類,用於創建對象記錄信息
(1)Student.java
1 package com.etc; 2 3 public class Student { 4 //學生的姓名,編號,所屬班級名,分數 5 private String name; 6 private int id; 7 private String className; 8 private double score; 9 10 public Student() { 11 12 } 13 public Student(String name, int id, String className, double score) { 14 super(); 15 this.name = name; 16 this.id = id; 17 this.className = className; 18 this.score = score; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public int getId() { 27 return id; 28 } 29 public void setId(int id) { 30 this.id = id; 31 } 32 public String getClassName() { 33 return className; 34 } 35 public void setClassName(String className) { 36 this.className = className; 37 } 38 public double getScore() { 39 return score; 40 } 41 public void setScore(double score) { 42 this.score = score; 43 } 44 45 }
(2)ClassRoom.java
1 package com.etc; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ClassRoom { 7 private String className;//班級名稱 8 private List<Student> list;//list存放學生信息 9 private double sum;//總分 10 11 public ClassRoom() { 12 list=new ArrayList<Student>(); 13 } 14 public ClassRoom(String className) { 15 this(); 16 this.className=className; 17 } 18 public ClassRoom(String className, List<Student> list, double sum) { 19 super(); 20 this.className = className; 21 this.list = list; 22 this.sum = sum; 23 } 24 public String getClassName() { 25 return className; 26 } 27 public void setClassName(String className) { 28 this.className = className; 29 } 30 public List<Student> getList() { 31 return list; 32 } 33 public void setList(List<Student> list) { 34 this.list = list; 35 } 36 public double getSum() { 37 return sum; 38 } 39 public void setSum(double sum) { 40 this.sum = sum; 41 } 42 43 }
2.測試類,進行場景模擬及方法實現
1 package com.etc; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Set; 9 10 public class MapDemo2 { 11 12 public static void main(String[] args) { 13 //考試信息錄入 14 List<Student> list=Examing(); 15 //根據傳過來的學生考試信息求每個班級的總分 16 Map<String,ClassRoom> map=getSum(list); 17 //將班級信息,總分,平均分,班級名稱打印出來 18 getInfo(map); 19 } 20 21 //獲取班級的信息,包括班級名稱,總分,平均分 22 public static void getInfo(Map<String,ClassRoom> map) { 23 Set<String> key=map.keySet(); 24 //構造迭代器 25 Iterator<String> it=key.iterator(); 26 //獲取記錄 27 while(it.hasNext()) { 28 String cno=it.next(); 29 ClassRoom cr=map.get(cno); 30 //查看總分,計算平均分 31 double total=cr.getSum(); 32 //計算平均分:總分/該班級下的學生數 33 double avg=total/cr.getList().size(); 34 System.out.println(" 班級名稱:"+cno+" 總分:"+total+" 平均分:"+avg); 35 } 36 } 37 38 //統計信息,每個班的平均成績 39 public static Map<String,ClassRoom> getSum(List<Student> list){ 40 //定義一個map集合用於存放班級名(String) 41 Map<String,ClassRoom> map=new HashMap<String,ClassRoom>(); 42 //遍歷list 43 for(Student stu :list) { 44 String cno=stu.getClassName();//班級編號 45 double sco=stu.getScore();//學生成績 46 //查看是否有該班級 47 ClassRoom cr=map.get(cno); 48 if(cr==null) { 49 //不存在則創建班級 50 cr=new ClassRoom(cno); 51 map.put(cno, cr); 52 } 53 //存在則放入學生 54 cr.getList().add(stu);//放入學生 55 cr.setSum(cr.getSum()+sco);//計算該班級的總分 56 } 57 return map; 58 } 59 60 //場景模擬,學生考試成績信息錄入 61 public static List<Student> Examing(){ 62 List<Student>list=new ArrayList<Student>(); 63 list.add(new Student("張三",1,"軟件一班",85)); 64 list.add(new Student("李四",2,"軟件一班",87)); 65 list.add(new Student("王五",3,"軟件二班",86)); 66 list.add(new Student("朱六",4,"軟件二班",85)); 67 list.add(new Student("關羽",4,"軟件二班",88)); 68 return list; 69 } 70 71 }
效果截圖:
好了,這樣就將之前學過的泛型以及簡單的分揀方法用上去了,同時也實現了面向對象編程,不過還是需要進行深入,因為真正的分揀存儲(對於我這個小白)還是比較晦澀難懂的。