日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11.集合之map

發(fā)布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11.集合之map 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

map接口下的集合

  • map接口下的集合采用鍵值對Map<k,v>的存儲方式,保存具有映射關(guān)系的數(shù)據(jù)。因此map集合里保存兩組值,一組用于保存map里的key值,另外一組用于保存map里的value值,key和value可以是任意引用類型的數(shù)據(jù)。key值不允許重復(fù),鍵可以為null,如果添加key-value鍵值對時已經(jīng)有重復(fù)的key,則添加的value會覆蓋key原來對應(yīng)的value值.常用的實現(xiàn)類有HashMap、LinkedHashMap、TreeMap等。
  • HashMap是以hash算法存儲的,無序的
  • LinkedHashMap是以鏈表方式存儲的.有序的
  • TreeMap是紅黑樹算法存儲的map,有序的

1 HashMap

  • 案例1:存值

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Test {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("CN","中華人民共和國");map.put("FN", "法國人民共和國");map.put("JP","日本人民共和國");map.put("YL", "伊朗人民共和國");map.put(null, "伊朗人民共和國");//鍵可以為nullmap.put("CN", "大秦帝國");//鍵如果重復(fù),會將后面的值覆蓋前面的值String value = map.get("CN");System.out.println("CN鍵對應(yīng)的值:"+value);System.out.println("是否有CN這個鍵:"+map.containsKey("CN"));System.out.println(map.keySet());System.out.println(map.values());System.out.println(map);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據(jù)鍵獲取值String value1 = map.get(key);System.out.println("值"+value1);}} }
  • 結(jié)果

    CN鍵對應(yīng)的值:大秦帝國 是否有CN這個鍵:true [null, YL, JP, FN, CN] [伊朗人民共和國, 伊朗人民共和國, 日本人民共和國, 法國人民共和國, 大秦帝國] {null=伊朗人民共和國, YL=伊朗人民共和國, JP=日本人民共和國, FN=法國人民共和國, CN=大秦帝國} 值伊朗人民共和國 值伊朗人民共和國 值日本人民共和國 值法國人民共和國 值大秦帝國
  • 案例2:存對象

    • Student類

      public class Student{private String name;private int age;public void showStudent(){System.out.println("你好我是"+name+",年齡是:"+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;}}
    • 測試

      import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Test1 {public static void main(String[] args) {Student stu1 = new Student("馬云",45);Student stu2 = new Student("馬化騰",40);Student stu3 = new Student("董明珠",47);Student stu4 = new Student("章澤天",28);//Map集合的適用場景:不適用于大量有序的數(shù)據(jù)遍歷,一般適用于少量數(shù)據(jù)作為方法的參數(shù)Map<String,Student> map = new HashMap<String,Student>();map.put(stu1.getName(), stu1);map.put(stu2.getName(), stu2);map.put(stu3.getName(), stu3);map.put(stu4.getName(), stu4);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據(jù)鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();}} }
    • 結(jié)果

      你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是董明珠,年齡是:47 你好我是馬化騰,年齡是:40 ================================= 你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是董明珠,年齡是:47 你好我是馬化騰,年齡是:40 =============================== 你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是董明珠,年齡是:47 你好我是馬化騰,年齡是:40

2 LinkedHashMap

  • LinkedHashMap以map接口的哈希表算法和連接列表實現(xiàn),具有順序的map

  • 采用雙向列表來維護key-value對的次序(其實只要考慮key的次序即可),該鏈表負責維護map的迭代順序,與插入順序一致,因此性能比HashMap低,但在迭代map里的全部元素時有較好的性能

  • 案例1:

    import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set;public class Test {public static void main(String[] args) {//LinkedHashMap以雙向鏈表式按照你插入元素的順序放到LinkedHashMap容器中//插入性能低,按鍵取值性能比hashMap低,但是遍歷所有值的時候效率高Map<String,String> map = new LinkedHashMap<String,String>();map.put("CN","中華人民共和國");map.put("FN", "法國人民共和國");map.put("JP","日本人民共和國");map.put("YL", "伊朗人民共和國");map.put(null, "伊朗人民共和國");//鍵可以為nullmap.put("CN", "大秦帝國");//鍵如果重復(fù),會將后面的值覆蓋前面的值String value = map.get("CN");System.out.println("CN鍵對應(yīng)的值:"+value);System.out.println("是否有CN這個鍵:"+map.containsKey("CN"));System.out.println(map.keySet());System.out.println(map.values());System.out.println(map);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據(jù)鍵獲取值String value1 = map.get(key);System.out.println("值"+value1);}} }
  • 結(jié)果

    CN鍵對應(yīng)的值:大秦帝國 是否有CN這個鍵:true [CN, FN, JP, YL, null] [大秦帝國, 法國人民共和國, 日本人民共和國, 伊朗人民共和國, 伊朗人民共和國] {CN=大秦帝國, FN=法國人民共和國, JP=日本人民共和國, YL=伊朗人民共和國, null=伊朗人民共和國} 值大秦帝國 值法國人民共和國 值日本人民共和國 值伊朗人民共和國 值伊朗人民共和國
  • 案例2:存對象

    import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set;public class Test1 {public static void main(String[] args) {Student stu1 = new Student("馬云",45);Student stu2 = new Student("馬化騰",40);Student stu3 = new Student("董明珠",47);Student stu4 = new Student("章澤天",28);//Map集合的適用場景:不適用于大量有序的數(shù)據(jù)遍歷,一般適用于少量數(shù)據(jù)作為方法的參數(shù)Map<String,Student> map = new LinkedHashMap<String,Student>();map.put(stu1.getName(), stu1);map.put(stu2.getName(), stu2);map.put(stu3.getName(), stu3);map.put(stu4.getName(), stu4);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據(jù)鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();}} }
  • 結(jié)果

    你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 ================================= 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 =============================== 你好我是馬云,年齡是:45 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47 你好我是章澤天,年齡是:28 10

3 Properties

Properties類是HashTable的子類,它相當于一個key、value都是String類型的map,主要用于讀取配置文件,比如之前學的log4j.properties配置文件,將系統(tǒng)的配置信息配置在該文件中。

4 TreeMap

  • 基于紅黑樹算法實現(xiàn),非線程安全,不允許null,key不允許重復(fù),它是sortedMap的實現(xiàn)類,會根據(jù)紅黑樹算法將key排序后插入到TreeMap容器中。也可以采取自然排序和自定義排序。

  • 如果采用自定義排序,可以實現(xiàn)compareable接口或者comparator接口來重寫comparaTo方法來自定義排序

  • 案例

    import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap;public class Test {public static void main(String[] args) {//TreeMap是會排序后插入到容器中(LinkedHashMap是按序插入)//默認是自然排序,如果需要按照你的規(guī)則,需要實現(xiàn)comparator接口重寫排序規(guī)則Map<String,String> map = new TreeMap<String,String>();map.put("CN", "中國");map.put("AN", "美國");map.put("YL", "伊朗");map.put("JP", "日國");//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據(jù)鍵獲取值String value1 = map.get(key);System.out.println("值"+value1);}} }
  • 結(jié)果

    值美國 值中國 值日國 值伊朗

5 Hashtable

Hashtable與HashMap的區(qū)別

  • hashMap是非線程安全的,hashtable是線程安全的,效率上低于hashMap

  • 案例

  • Student類

    public class Student{private String name;private int age;public void showStudent(){System.out.println("你好我是"+name+",年齡是:"+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;}}
  • 測試類

    import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Test1 {public static void main(String[] args) {Student stu1 = new Student("馬云",45);Student stu2 = new Student("馬化騰",40);Student stu3 = new Student("董明珠",47);Student stu4 = new Student("章澤天",28);//hashMap是非線程安全的,hashtable是線程安全的,效率上低于hashMapMap<String,Student> map = new Hashtable<String,Student>();map.put(stu1.getName(), stu1);map.put(stu2.getName(), stu2);map.put(stu3.getName(), stu3);map.put(stu4.getName(), stu4);//獲取到所有的鍵,是一個無序的set集合Set<String> keys = map.keySet();//創(chuàng)建迭代器,讓無序的鍵排隊Iterator<String> it = keys.iterator();while(it.hasNext()) {//判斷迭代器容器里面有沒有鍵,如果有就取到下一個鍵String key = it.next();//根據(jù)鍵獲取值Student student = map.get(key);student.showStudent();}System.out.println("=================================");for (String key : keys) {Student student = map.get(key);student.showStudent();}System.out.println("===============================");for (Student student : map.values()) {student.showStudent();}} }
  • 結(jié)果

    你好我是馬云,年齡是:45 你好我是章澤天,年齡是:28 你好我是馬化騰,年齡是:40 你好我是董明珠,年齡是:47

6 各Map實現(xiàn)類的性能分析

  • HashMap以哈希算法存儲,存儲無序的,通過鍵獲取值速度最快;最長用
  • LinkedHashMap以雙向鏈表式存儲,會按照存儲的順序存放到集合容器中,因為還要記錄存儲順序所以效率低,但是遍歷集合效率高
  • properties集合也是以鍵值對形式存儲,一般用于配置文件,比如log4j配置
  • TreeMap以紅黑樹算法存儲,存儲的是會按照排序后再去存儲集合容器中,排序方式有自然排序和定制排序
  • HashTable和HashMap一樣的存儲方式,Hashtable考慮線程安全,查詢效率上HashMap要更快
  • 如果記不住,學會HashMap即可
  • 總結(jié)

    以上是生活随笔為你收集整理的11.集合之map的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。