java-HashMap默認機制


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 }

效果截圖:

好了,這樣就將之前學過的泛型以及簡單的分揀方法用上去了,同時也實現了面向對象編程,不過還是需要進行深入,因為真正的分揀存儲(對於我這個小白)還是比較晦澀難懂的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM