当前位置:   article > 正文

Java集合-Map接口(key-value)_java map value 为接口

java map value 为接口

Map接口的特点:①KV键值对方式存储②Key键唯一,Value允许重复③无序。

Map有四个实现类:1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类

1.HashMap类:

存储结构:哈希表 = 数组Node[ ] + 链表(红黑树)

扩容方法:resize()

扩容机制:原数组的2倍

特点:①Key唯一,不允许重复②Value允许重复③无序

HashMap: KV键值对集合,key唯一,value允许重复
put()方法:添加键值对,如果key不存在,则返回null; 如果key存在,则保存新value,返回旧
value
get()方法:根据key,获取value,如果key存在,获取该元素的键值对的value值;如果不存在,
则获取该元素的键值对的value值为null;如果返回的value为null, 类型转换时,会发生空指针

  1. public static void main(String[] args) {
  2. // Map键值对集合
  3. //保存城市人口信息
  4. // key :城市名称.
  5. // val:人口数量
  6. HashMap<String,Integer> map = new HashMap<String,Integer>();
  7. map.put("X咸阳",1100);
  8. HashMap<String,Integer> anotherMap = new HashMap<String,Integer>();
  9. anotherMap.put("B北京", 2500);
  10. anotherMap.put("C长春", 300);
  11. anotherMap.put("D大连", 1000);
  12. map.putAll(anotherMap);
  13. anotherMap.put("D大连", 1000); //key不允许重复
  14. map.put("E鄂尔多斯", 1000);//value不允许重复
  15. System.out.println(map);
  16. }

输出:

{D大连=1000, E鄂尔多斯=1000, C长春=300, B北京=2500, X咸阳=1100}

put()与get()方法:

  1. public static void main(String[] args) {
  2. HashMap<String,Integer> cityMap = new HashMap<String,Integer>();
  3. //put()方法:添加键值对
  4. //如果key不存在,则返回null
  5. System.out.println(cityMap.put("X西安", 1100));
  6. System.out.println(cityMap.put("B北京", 2500));
  7. System.out.println(cityMap.put("C长春", 300));
  8. System.out.println(cityMap.put("D大连", 1000));
  9. //如果key存在,则保存新value,返回旧value
  10. System.out.println(cityMap.put("X西安", 1200));
  11. //get()方法:根据Key值,获取value
  12. //key存在
  13. int value1 = cityMap.get("B北京");
  14. System.out.println("B北京===>"+value1);
  15. //key不存在
  16. Integer value2 = cityMap.get("N南京");
  17. System.out.println("N南京"+value2);
  18. //如果返回的value为null,类型转换时,会发生空指针
  19. int value3 = cityMap.get("N南京");
  20. }

 输出:

  1. null
  2. null
  3. null
  4. null
  5. 1100
  6. B北京===>2500
  7. N南京null
  8. Exception in thread "main" java.lang.NullPointerException
  9. at com.zad.day24_1_26_01.Text08.main(Text08.java:28)

遍历map:

遍历Map
方式1:获取所有的key,然后按照每个key获取对应的value
方式2:获取所有的value
方式3:将每个KV键值对按照Entry类型的对象,统一获取

方式1 :获取所有的key,然后按照每个key获取对应的value
 

  1. public static void main(String[] args) {
  2. HashMap<String,String[]> map = new HashMap<String,String[]>();
  3. map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
  4. map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
  5. map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
  6. //遍历Map
  7. //方式1:获取所有的key,然后按照每个key获取对应的value
  8. Set<String> keys = map.keySet();//获取map中所有的key
  9. System.out.println("所有的key:"+keys);
  10. System.out.println("按照每个key,获取对应的value");
  11. Iterator<String> it = keys.iterator();
  12. while(it.hasNext()) {
  13. String key = it.next();//获取每个key
  14. String[] val = map.get(key);//按照key获取对应的value
  15. System.out.printf("%s ---> %s \n",key,Arrays.toString(val));
  16. }
  17. }

输出:

  1. 所有的key:[华语, 乐队, 欧美]
  2. 按照每个key,获取对应的value
  3. 华语 ---> [林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
  4. 乐队 ---> [魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
  5. 欧美 ---> [贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]

方式2:获取所有的value

  1. public static void main(String[] args) {
  2. HashMap<String,String[]> map = new HashMap<String,String[]>();
  3. map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
  4. map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
  5. map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
  6. //遍历map
  7. //方式2:获取所有的value
  8. Collection<String[]> values=map.values();
  9. for(String[] array:values) {
  10. System.out.println(Arrays.toString(array));
  11. }
  12. }

输出:

  1. [林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
  2. [魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
  3. [贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]

 方式3:将每个KV键值对按照Entry类型的对象,统一获取

  1. public static void main(String[] args) {
  2. HashMap<String, String[]> map = new HashMap<String, String[]>();
  3. map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
  4. map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
  5. map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
  6. //遍历Map
  7. //方式3:将每个KV键值对按照Entry类型的对象,统一获取
  8. Set<Entry<String,String[]>> entrys = map.entrySet();
  9. for(Entry<String,String[]> keyValue:entrys) {
  10. System.out.printf("%s--->%s\n",keyValue.getKey(),Arrays.toString(keyValue.getValue()));
  11. }
  12. }

 输出:

  1. 华语--->[林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
  2. 乐队--->[魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
  3. 欧美--->[贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]

常用方法:

  • 判断key是否存在: containsKey()方法
  • 根据key获取value,如果key不存在,则返回default默认值: getOrDefault()方法
  • 根据key,删除KV键值对:remove()方法
  • 获取键值对的数量:size()方法

  1. public static void main(String[] args) {
  2. //歌手分类
  3. HashMap<String, String[]> map=new HashMap<String, String[]>();
  4. map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
  5. map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
  6. map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
  7. //判断key是否存在
  8. boolean isContains = map.containsKey("日韩");
  9. System.out.println(isContains);
  10. //根据key获取value,如果key不存在,则返回default默认值
  11. String[] value = map.getOrDefault("日韩", new String[] {});
  12. System.out.println(Arrays.toString(value));
  13. //根据key,删除KV键值对
  14. map.remove("欧美");
  15. System.out.println(map);
  16. //获取键值对的数量
  17. int size = map.size();
  18. System.out.println(size);
  19. }

 输出:

  1. false
  2. []
  3. {华语=[Ljava.lang.String;@3d8c7aca, 乐队=[Ljava.lang.String;@5ebec15}
  4. 2

 应用例:统计英文字母、中文、数字、标点符号的个数

  1. public static void main(String[] args) {
  2. //统计英文字母、中文、数字、标点符号的个数
  3. String str = "OMG,你们的中英混搭真是各有千秋,但Someone丝毫掩盖不了你们那硬朗的英语底子!For eg.papi酱真的very有才华啊,哦买噶的,U6666666!!!罢特,someone也是成功地掩盖了自己小学程度的英语水平!这样式的,I是不会use的,because l hate 这种人very much~";
  4. //统计结果,保存到map中
  5. HashMap<String, Integer> map = new HashMap<String, Integer>();
  6. // map.put("letters", 0);
  7. // map.put("numbers", 0);
  8. // map.put("chinese", 0);
  9. // map.put("flags", 0);
  10. // 遍历字符串,判断每个字符
  11. for (int i = 0; i < str.length(); i++) {
  12. // 获取每一个字符
  13. char c = str.charAt(i);
  14. if (c >= 'A' && c < 'Z' || c > 'a' && c < 'z') {
  15. //获取一个字符
  16. int oldValue = map.getOrDefault("letters", 0);
  17. int newValue = oldValue + 1;
  18. map.put("letters", newValue);
  19. } else if (c > '0' && c < '9') {
  20. map.put("numbers", map.getOrDefault("numbers", 0)+1);
  21. } else if (c >= 0x4e00 && c <= 0x29fa5) {
  22. map.put("chinese", map.getOrDefault("chinese", 0) + 1);
  23. } else {
  24. map.put("flags", map.getOrDefault("flags", 0)+ 1);
  25. }
  26. }
  27. System.out.println(map);
  28. }

输出:

{chinese=79, flags=16, numbers=7, letters=52}
2.LinkedHashMap类:

存储结构:数组+链表+红黑树,,维护使用链表,记录顺序

特点:①Key唯一,不允许重复②Value允许重复③有序④LinkedHashMap是HashMap的子类

 应用例:统计每个字符出现的次数

  1. public static void main(String[] args) {
  2. //统计每个字符出现的次数
  3. //无序
  4. String str = "qurfkjcbsdjqpiurfufhdvlajydfgquyvhvaljhvqouygqhvhv";
  5. // HashMap<String,Integer> map1 = new HashMap<String, Integer>();
  6. //有序
  7. LinkedHashMap<String,Integer> map2 = new LinkedHashMap<String, Integer>();
  8. for(int i = 0;i<str.length();i++) {
  9. String key = str.substring(i,i+1);
  10. //判断key是否存在
  11. if(map2.containsKey(key)) {
  12. //该字符(key)存在
  13. map2.put(key, map2.get(key)+1);
  14. }else {
  15. //该字符不存在
  16. map2.put(key, 1);
  17. }
  18. }
  19. System.out.println(map2);
  20. }

 输出:

{q=5, u=5, r=2, f=4, k=1, j=4, c=1, b=1, s=1, d=3, p=1, i=1, h=5, v=6, l=2, a=2, y=3, g=2, o=1}
3.TreeMap类:

特点:①Key唯一,不允许重复②Value允许重复③按照Key自动排序④AbstractMap的子类

存储结构:树中的每个节点均是Entry内部类对象(红黑树)

例:按照key自动排序,通过key进行比较后排序!!!

  1. public static void main(String[] args) {
  2. //HashMap:无序,按照key计算保存位置
  3. //HashMap<String,String> map = new HashMap<String,String>();
  4. // TreeMap:按照key自动排序,通过key进行比较后排序
  5. TreeMap<String, String> map = new TreeMap<String, String>();
  6. map.put("SN201", "A1");
  7. map.put("SN111", "A2");
  8. map.put("SN107", "A3");
  9. map.put("SN191", "A4");
  10. map.put("SN100", "A5");
  11. map.put("SN103", "A6");
  12. map.put("SN2011", "A7");
  13. map.put("SN1031", "A8");
  14. map.put("SN1231", "A9");
  15. for (Entry<String, String> entry : map.entrySet()) {
  16. System.out.println(entry.getKey() + ":" + entry.getValue());
  17. }
  18. }

 输出:

  1. SN100:A5
  2. SN103:A6
  3. SN1031:A8
  4. SN107:A3
  5. SN111:A2
  6. SN1231:A9
  7. SN191:A4
  8. SN201:A1
  9. SN2011:A7

 调用TreeMap<>()的有参构造方法,重写compare()方法,按照大小排序

  1. public static void main(String[] args) {
  2. //HashMap:无序,按照key计算保存位置
  3. //HashMap<String,String> map = new HashMap<String,String>();
  4. // TreeMap:按照key自动排序,通过key进行比较后排序
  5. TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
  6. @Override
  7. public int compare(String o1, String o2) {
  8. int n1 = Integer.parseInt(o1.substring(2));
  9. int n2 = Integer.parseInt(o2.substring(2));
  10. return n1 - n2;
  11. }
  12. });
  13. map.put("SN201", "A1");
  14. map.put("SN111", "A2");
  15. map.put("SN107", "A3");
  16. map.put("SN191", "A4");
  17. map.put("SN100", "A5");
  18. map.put("SN103", "A6");
  19. map.put("SN2011", "A7");
  20. map.put("SN1031", "A8");
  21. map.put("SN1231", "A9");
  22. for (Entry<String, String> entry : map.entrySet()) {
  23. System.out.println(entry.getKey() + ":" + entry.getValue());
  24. }
  25. }

输出:

  1. SN100:A5
  2. SN103:A6
  3. SN107:A3
  4. SN111:A2
  5. SN191:A4
  6. SN201:A1
  7. SN1031:A8
  8. SN1231:A9
  9. SN2011:A7
4.Hashtable类

特点:①Key唯一,不允许重复②Value允许重复③key 和 value不允许为空,如果为null,则抛出NullPointerExceptino④线程安全,使用synchronized加锁,性能较差

存储结构:数组+链表

  • 允许使用null做key
  • 不允许使用null做value
  1. public static void main(String[] args) {
  2. HashMap<String, String> map=new HashMap<String, String>();
  3. map.put(null, "巴黎世家");//不允许使用null做key
  4. map.put("AAA", null);//允许使用null做value
  5. System.out.println(map);
  6. Hashtable<String, String> table=new Hashtable<String, String>();
  7. table.put(null, "巴黎世家");//不允许使用null做key
  8. table.put("AAA", null);//不允许使用null做value
  9. System.out.println(table);
  10. }

输出:

  1. {null=巴黎世家, AAA=null}
  2. Exception in thread "main" java.lang.NullPointerException
  3. at java.util.Hashtable.put(Hashtable.java:465)
  4. at com.zad.day24_1_26_01.Text15.main(Text15.java:15)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号