麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

集合框架之Map集合

2019-11-14 13:11:46
字體:
來源:轉載
供稿:網友

今天,我向大家介紹集合框架的最后一個知識塊:Map集合,Map集合是雙列集合的根接口。我個人感覺Map集合比Collection集合更重要些,在實際的項目開發中,使用Map創建集合非常之多,在框架整合開發中也會用到,在后期做Web項目的時候還會用到它,原因我不多說。接下來直接看我演示Map集合的案例…在前面我說到了Collection集合,Collection集合是單列集合的根接口,我們學習了Collection集合的Set集合和List集合,又介紹和學習了Set集合的子集合:HashSet、LinkedHashSet和TreeSet,主要說了它們的功能和用途,學習了List集合的子集合:ArrayList、LinkedList和Vector,也介紹它的功能和用途,但其中最重要的是要學會怎樣去應用,該如何用?嘿嘿,前面的介紹和學習那就慢慢領悟吧~接下來,步入我們的正題:介紹和學習Map集合。 首先,Map集合它也是一個接口,上面剛說到,它是雙列集合的根接口。關于Map集合接口的概述,百度了一下,網上說的是千篇一律。我從Sun官方提供的手冊中,查看API可知: Map集合是:1.將鍵映射到值得對象;2.是一個集合不能包含重復的鍵;3.每個鍵最多只能映射到一個值。 那Map接口與Collection接口有什么不同呢? 1.Map接口是雙列的,而Collection接口是單列的; 2.Map的鍵唯一,Collection的子體系Set是唯一的; 3.Map集合的數據結構針對鍵有效,跟值無關,Collection集合的數據結構針對元素有效。 Map集合它處于java.util包下,它的數據結構看起來更像多行兩列的表格,每一條數據中包含兩個信息key-value,其中key在Map中不允許重復,重復指的是equals為true,Map集合它有兩個子類,一個是HashMap,一個是TreeMap,HashMap有一個子類叫做LinkedHashMap。和Set集合的體系結構非常相似。接下來,我們來看一下Map集合的方法: 1.V put(K k,V v):向Map集合中添加元素 如果鍵是第一次存儲,就直接存儲元素,返回null; 如果鍵不是第一次存儲,就用值把以前的值替換掉,返回以前的值。 如下程序代碼:

package cn.edu.jit.map;import java.util.HashMap;import java.util.Map;/** * Map * 該數據結構看起來更像多行兩列的表格 * 每一條數據中包含兩個信息key-value, * 其中key在Map中不允許重復,重復指的是equals為true。 * @author Rocky * */public class MapDemo01 { public static void main(String[] args) { /* * Map本身也是一個接口,是不能實例化的,我們用它的一個 * 實 * 例叫做:HashMap * 我們通常也讓Map加泛型,給它們的具體類型。 * * * 創建一個Map * key是字符串,value是整數 */ Map<String,Integer> map = new HashMap<String,Integer>(); //調用Map的一個方法叫 put() 可以存放key和value的值。 /* * V put(K k,V v) * 將給定的key與對應的value存入Map中。 * * 若給定的key在Map中不存在,則是添加新內容,那么返回的就是被替換的value值。 * 若給定的key在Map中已存在,則是替換value操作,返回值是null。 * */ System.out.PRintln(map);//{} Integer i = map.put("語文", 95); System.out.println(map);//{語文=95} System.out.println(i);//null i = map.put("語文", 99); System.out.println(map);//{語文=99} map.put("英語", 90); map.put("數學", 90); map.put("物理", 98); map.put("化學", 88); System.out.println(map); }}

從Map中獲取元素的方式,我們采用Map的get()方法。 2.V get(K k):根據給定的key獲取對應的value值。 如下程序代碼:

/* * V get(K k) * 根據給定的key獲取對應的value值 */ Integer num = map.get("英語"); System.out.println("英語" + num); //如果給一個不存在的key,其結果如下: /* * 給定一個Map中不存在的key, * 返回值則為null。 */ num = map.get("高數"); System.out.println("高數:" + num);//若找不到對應的key值,則返回null"空"

3.刪除功能: void clear():移除所有的鍵值對元素; V remove(Object key):根據鍵刪除鍵值對元素,并把值返回。 如下程序代碼:

package cn.edu.jit.map;import java.util.HashMap;import java.util.Map;public class MapDemo02 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("張三", 23); map.put("李四", 24); map.put("王五", 25); map.put("趙六", 26); //根據鍵刪除元素,返回鍵對應的值 Integer value = map.remove("張三"); System.out.println(value); System.out.println(map); //運行結果: //23 //{趙六=26, 李四=24, 王五=25} }}

4.判斷功能: boolean containsKey(K k): 判斷當前Map中是否含有給定的key,是否含有是根據key的equals判斷的,返回值為boolean類型。 boolean containsValue(Object value): 判斷集合是否包含指定的值,返回值為boolean類型。 boolean isEmpty(): 判斷集合是否為空,返回值為boolean類型。 如下代碼程序:

package cn.edu.jit.map;import java.util.HashMap;import java.util.Map;public class MapDemo03 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("張三", 23); map.put("李四", 24); map.put("王五", 25); map.put("趙六", 26); //根據鍵刪除元素,返回鍵對應的值// Integer value = map.remove("張三");// System.out.println(value); /* * 判斷是否包含傳入的鍵(值) */ System.out.println(map.containsKey("張三"));//true System.out.println(map.containsValue(23));//true System.out.println(map); }}

5.int size():返回集合中的鍵值對的個數 如下程序代碼:

package cn.edu.jit.map;import java.util.Collection;import java.util.HashMap;import java.util.Map;public class MapDemo04 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("張三", 23); map.put("李四", 24); map.put("王五", 25); map.put("趙六", 26); Collection<Integer> c = map.values(); System.out.println(c);//[26, 23, 24, 25] System.out.println(map.size());//4 }}

上面幾個方法主要是Map集合的常用方法,接下來我們看hashCode對Map操作的影響,看如下程序代碼:

package cn.edu.jit.map;import java.util.HashMap;import java.util.Map;/** * hashCode對Map操作的影響 * @author Rocky * */public class MapDemo02 { public static void main(String[] args) { Map<Point,Integer> map = new HashMap<Point,Integer>(100); Point p = new Point(1,2); map.put(p, 100); boolean contains = map.containsKey(p); System.out.println("包含key:" + contains); System.out.println(map); Integer i = map.get(p); System.out.println(i); System.out.println(p.hashCode()); //內容變化了,hashCode值就會變化 p.setX(2); System.out.println(p.hashCode()); i = map.get(p); System.out.println(i);//null contains = map.containsKey(p); System.out.println("包含key:" + contains);//包含key:false System.out.println(map);//{day05.Point@401=100} map.put(p, 200); System.out.println(map); Integer ii = map.remove(p); System.out.println("刪除的是:" + ii); System.out.println(map); p.setX(1); ii = map.remove(p); System.out.println("刪除的是:" + ii);//null System.out.println(map);//{day05.Point@401=100} }}

使用HashMap時應當注意,作為key的對象有以下要求: 1.首先當key這個類重寫了equals方法,那么重寫的hashcode的要求必須滿足; 2.作為key的對象若存入HashMap后,其會影響hashcode值得內容不要發生改變,否則可能會影響Map操作。 下面,我給大家主要介紹遍歷Map的三種方式: 1.遍歷所有的key; 2.遍歷所有的鍵值對(key-value); 3.遍歷所有的value(不常用) 如下程序代碼:

package cn.edu.jit.map;import java.util.Collection;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map;import java.util.Set;import java.util.Map.Entry;/** * 遍歷Map的三種方式: * 1:遍歷所有的key * 2:遍歷所有的鍵值對(key-value) * 3:遍歷所有的value(不常用) * @author Rocky * */public class MapDemo03 { public static void main(String[] args) { Map<String,Integer> map = new LinkedHashMap<String,Integer>(); map.put("數學", 90); map.put("語文", 98); map.put("物理", 85); map.put("化學", 78); map.put("英語", 92); map.put("體育", 65); map.put("生物", 78); /* * 遍歷所有的key * Set<K> keySet() * 該方法可以獲取Map中所有的Key,并將它們存入一個Set集合中返回 * 所以,遍歷該集合就等于遍歷所有的key了。 */ Set<String> keySet = map.keySet(); for(String str : keySet) { System.out.println("str:" + str); } /* * 遍歷鍵值對 * Set<Entry> entrySet() * 該方法會將每一組key-value存入一個Entry示例中,并將 * 這些Entry實例存入一個Set集合并返回 * 我們只需要遍歷該集合,拿到每一個Entry實例并獲取其中的key與 * value即可。 * * Entry是Map的一個內部類。 */ //我們Entry里面的泛型兒要和Map中的泛型保持一致! Set<Entry<String,Integer>> entrySet = map.entrySet(); for(Entry<String,Integer> e:entrySet) { String key = e.getKey(); Integer value = e.getValue(); System.out.println(key+":"+value); } /* * 遍歷所有的value * 獲取來的是Collection集合 */ Collection<Integer> values = map.values(); for(Integer value : values) { System.out.println("value:" + value); } }}

下面,我們來做一個案例練習:HashMap集合鍵是Student,值是String。 為什么我們要在雙列集合中要存儲一個Student呢,Student是什么?它是一個自定義類。也就是我們想把自定義對象存儲在HashMap集合中。剛在一開始的時候我就介紹過,HashMap這個指針指向的只對鍵有效,咱們把自定義對象存儲在它的鍵的位置,就想看它如何保證鍵的唯一。接下來,我們來演示這個案例,看如下程序代碼: 首先,我們要自定義一個Student類:

package cn.edu.jit.bean;public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Studnet [age=" + age + ", name=" + name + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }}

我們創建一個HashMapDemo05,如下程序:

package cn.edu.jit.map;import java.util.HashMap;import cn.edu.jit.bean.Student;/** * 案例演示: * HashMap集合鍵是Student,值是String的案例。 * 鍵:是學生對象,代表每一個學生; * 值:是字符串對象,代表學生的歸屬地 * @author Rocky * */public class HashMapDemo05 { public static void main(String[] args) { HashMap<Student, String> hm = new HashMap<Student, String>(); hm.put(new Student("錢春華",23), "江蘇南通"); hm.put(new Student("Jolin",24), "江蘇泰州"); hm.put(new Student("Jolin",24), "上海"); hm.put(new Student("二狗",25), "江蘇無錫"); hm.put(new Student("瑤瑤",20), "江蘇南京"); System.out.println(hm); //{Studnet [age=23, name=錢春華]=江蘇南通, Studnet [age=25, name=二狗]=江蘇無錫, Studnet [age=20, name=瑤瑤]=江蘇南京, Studnet [age=24, name=Jolin]=上海} }}

接下來,我們來說HashMap有一個子類叫做LinkedHashMap,它的特點是:底層是鏈表實現的可以保證怎么存就怎么取。如下代碼:

package cn.edu.jit.map;import java.util.LinkedHashMap;/** * * @author Rocky * */public class LinkedHashMapDemo { public static void main(String[] args) { LinkedHashMap<String, Integer> lhm = new LinkedHashMap<String, Integer>(); lhm.put("張三", 23); lhm.put("李四", 24); lhm.put("趙六", 26); lhm.put("王五", 25); System.out.println(lhm); //{張三=23, 李四=24, 趙六=26, 王五=25} }}

說完了LinkedHashMap,我們再來說一說TreeMap,我們來看看TreeMap如何對鍵唯一,因為雙列集合只針對鍵有效,鍵值得算法是一個二叉樹,也就是說它可以對鍵進行排序。好,我們來通過這個案例演示TreeMap集合:鍵是Student,值是:String。如下程序代碼: 首先我們要在Student類實現Comparable接口,并重寫compareTo方法,貼上代碼:

@Override public int compareTo(Student o) { int num = this.age - o.age; return num == 0 ? this.name.compareTo(o.name) : num; }

Student類整個代碼如下:

package cn.edu.jit.bean;public class Student implements Comparable<Student> { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Studnet [age=" + age + ", name=" + name + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public int compareTo(Student o) { int num = this.age - o.age; return num == 0 ? this.name.compareTo(o.name) : num; }}

在創建一個TreeMapDemo類,代碼如下:

package cn.edu.jit.map;import java.util.TreeMap;import cn.edu.jit.bean.Student;/** * TreeMap集合鍵是Student,值是String * @author Rocky * */public class TreeMapDemo { public static void main(String[] args) { TreeMap<Student, String> tm = new TreeMap<Student, String>(); tm.put(new Student("張三",23), "北京"); tm.put(new Student("李四",24), "上海"); tm.put(new Student("王五",25), "廣州"); tm.put(new Student("趙六",26), "深圳"); System.out.println(tm); //在沒有實現Comparable接口時,報了異常,因為沒有在Student類實現Compare這個接口。 //運行結果:{Studnet [age=23, name=張三]=北京, Studnet [age=24, name=李四]=上海, Studnet [age=25, name=王五]=廣州, Studnet [age=26, name=趙六]=深圳} }}

大家覺得很好奇,剛才運行結果的程序是按照對象比較性進行排序的,有沒有比較器呢,我們來看一下,有一個重構方法Comparator去實現,我們通過匿名內部類去實現,貼上代碼:

package cn.edu.jit.map;import java.util.Comparator;import java.util.TreeMap;import cn.edu.jit.bean.Student;/** * TreeMap集合鍵是Student,值是String * @author Rocky * */public class TreeMapDemo { public static void main(String[] args) { TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //按照姓名去比較 int num = s1.getName().compareTo(s2.getName()); return num == 0 ? s1.getAge() - s2.getAge() : num; } }); tm.put(new Student("張三",23), "北京"); tm.put(new Student("李四",24), "上海"); tm.put(new Student("王五",25), "廣州"); tm.put(new Student("趙六",26), "深圳"); System.out.println(tm); //運行結果:{Studnet [age=23, name=張三]=北京, Studnet [age=24, name=李四]=上海, Studnet [age=25, name=王五]=廣州, Studnet [age=26, name=趙六]=深圳} //我們可以看到,這就按照順序排序打印出來了 }}

好了,今天Map集合方法以及它的用途就介紹到這,下面講解HashMap集合嵌套,本文中所有的案例程序都是本人親測過,如有不對的地方請各位朋友歡迎指正,謝謝了!


上一篇:set容器

下一篇:預處理指令--define

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91一级毛片 | 久草视频国产在线 | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 欧美 日韩 国产 成人 | 性爱视频在线免费 | 一区二区三区视频在线 | 特级毛片免费视频 | 久久久久国产成人精品亚洲午夜 | 欧美一级片免费在线观看 | 狠狠干五月天 | 久久免费综合视频 | 欧美成人免费电影 | a免费视频 | 国产高潮好爽好大受不了了 | h色网站在线观看 | 日韩在线播放中文字幕 | 九九热视频在线免费观看 | 毛片免费视频 | 九九热精品视频在线播放 | 亚洲骚妻 | 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 日韩欧美电影一区二区三区 | 日本特级a一片免费观看 | 国产一国产一级毛片视频 | 看毛片免费 | 国内精品一级毛片免费看 | 国产成人高清成人av片在线看 | 毛片免费视频观看 | 免费观看的毛片手机视频 | 91短视频版高清在线观看www | 国产一级小视频 | 国产日产精品一区二区三区四区 | 久久成人精品视频 | 久久人人爽人人爽人人片av高请 | 韩国美女一区 | 国产一区视频观看 | 第四色成人网 | 欧美日韩一区二区综合 | 丰满年轻岳中文字幕一区二区 | 色婷婷久久久久久 | 久色成人网 |