当前位置:   article > 正文

J2EE基础-集合框架Map_set>

set>

前言

上篇(http://t.csdn.cn/i9015)中我们已经认识了集合框架set,这篇我们将学习集合框架Map

目录

前言

一、Map集合

A、特点

B、map集合增删改

 C、遍历方式

Ca、查询单个

 Cb、查询所有(两种方式)-第一种

Cc、查询所有(两种方式)-第二种

D、HashMap与Hashtable的区别

案例一、统计map集合中字符串出现的次数

 思路:

 OK、我们延伸一下,按字符出现的次数进行排序

 二、泛型

A、有泛型之前:

B、有泛型之后:

三、集合框架工具类

A、集合之间的相互转换

​编辑Aa、结论:

B、基本数据类型排序

 C、对象等其他数据类型排序


一、Map集合

A、特点

Map是一个无序,键值对的集合,键不可以重复,值可以重复,键重复则后者覆盖前者,Map集合没有继承Collection接口

  1. package com.oyang.map;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * map集合的特点
  6. * 键值对 & 无序
  7. * @author yang
  8. *
  9. * @date 2022年6月9日下午1:53:49
  10. */
  11. public class Demo1 {
  12. public static void main(String[] args) {
  13. Map<String,Integer> map = new HashMap<>();
  14. //增
  15. map.put("s", 1);
  16. // V put(K key, V value);
  17. map.put("a", 2);
  18. map.put("c", 3);
  19. map.put("d", 4);
  20. map.put("g", 5);
  21. System.out.println(map);
  22. }
  23. }

打印一下

 我们可以看到,它是无序输出的,所以是没有继承Collection接口的

B、map集合增删改

  1. package com.oyang.map;
  2. import java.util.HashMap;
  3. import java.util.Hashtable;
  4. import java.util.Map;
  5. import java.util.Map.Entry;
  6. import java.util.Set;
  7. /**
  8. * map集合的特点
  9. * 键值对 & 无序
  10. * @author yang
  11. *
  12. * @date 2022年6月9日下午1:53:49
  13. */
  14. public class Demo1 {
  15. public static void main(String[] args) {
  16. Map<String,Integer> map = new HashMap<>();
  17. //增
  18. map.put("s", 1);
  19. // V put(K key, V value);
  20. map.put("a", 2);
  21. map.put("c", 3);
  22. map.put("d", 4);
  23. map.put("g", 5);
  24. System.out.println(map);
  25. //删 返回的是删除的值
  26. Object remove = map.remove("s");
  27. System.out.println("删除的值:"+remove);
  28. System.out.println("==============删除后===============");
  29. System.out.println(map);
  30. //改 也是调用put方法
  31. map.put("a", 22);
  32. System.out.println(map);
  33. }
  34. }

打印结果:

 C、遍历方式

Ca、查询单个

查单个根据键拿到值        

		System.out.println(map.get("a"));

结果:

 Cb、查询所有(两种方式)-第一种

先拿到map集合中所有的key(键)后再遍历

  1. Set set = map.keySet();//先拿到map集合中所有的key(键)
  2. //再遍历
  3. for (Object key : set) {
  4. System.out.println("键:"+key+"值:"+map.get(key));
  5. }

结果:

Cc、查询所有(两种方式)-第二种

拿到映射关系,键值都有了

  1. //第二种:拿到映射关系
  2. Set<Entry<String, Integer>> entrySet = map.entrySet();
  3. for (Entry<String, Integer> entry : entrySet) {
  4. System.out.println("键:"+entry.getKey()+"值:"+entry.getValue());
  5. }

结果:

D、HashMap与Hashtable的区别

  1. Hashtable<String,Integer> hashtable = new Hashtable<>();
  2. // public synchronized V put(K key, V value) synchronized同步
  3. hashtable.put("a", 12);
  4. Map<String,Integer> map = new HashMap<>();
  5. //增
  6. map.put("s", 1);
  7. // V put(K key, V value);

 注意://之后是拿的底层

我们都能看到,Hashtable比HashMap多了一个 synchronized同步,同步既排队,这大大提升了线程安全性。而HashMap非同步 线程不安全

Hashtable在jdk1.8以下键是不能存放null的

案例一、统计map集合中字符串出现的次数

String s="sadzfdsafkbsdjbfvsdjdsaksdfjdkfbuewfsdsabfdsafsdjsdafds";

 思路:

实现思路:
   1.做字符串切割,得到一个字符数组
   2.接下来遍历,拿到单个字符
   3.如果该字符没有出现过,即value值为null,那么该字符为key,值初始化为1
   4.如果已经出现过,拿到原来的值+1

 代码:

  1. package com.oyang.map;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Map.Entry;
  5. import java.util.Set;
  6. import java.util.TreeMap;
  7. /**
  8. * 字符串出现的次数
  9. * @author yang
  10. *
  11. * @date 2022年6月9日下午2:32:49
  12. */
  13. public class Demo2 {
  14. public static void main(String[] args) {
  15. //需要创建一个字符串:
  16. String s="sadzfdsafkbsdjbfvsdjdsaksdfjdkfbuewfsdsabfdsafsdjsdafds";
  17. //切割成字符数组:
  18. char[] array = s.toCharArray();
  19. //定义一个Map集合并且循环遍历字符数组arr判断:
  20. Map<Character, Integer> map=new TreeMap<>();用TreeMap可以按字母排序
  21. for (char c : array) {
  22. Integer value = map.get(c);
  23. if(value==null) {
  24. map.put(c, 1);
  25. }else {
  26. map.put(c, value+1);
  27. }
  28. }
  29. //拿到映射关系
  30. Set<Entry<Character,Integer>> set = map.entrySet();
  31. //循环遍历
  32. for (Entry<Character, Integer> entry : set) {
  33. System.out.println(entry.getKey()+" 出现次数: "+entry.getValue()+"次");
  34. }
  35. }
  36. }

结果:

 OK、我们延伸一下,按字符出现的次数进行排序

代码:

  1. package com.oyang.map;
  2. import java.util.ArrayList;
  3. import java.util.Comparator;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8. import java.util.Set;
  9. import java.util.TreeMap;
  10. /**
  11. * 字符串出现的次数
  12. * @author yang
  13. *
  14. * @date 2022年6月9日下午2:32:49
  15. */
  16. public class Demo2 {
  17. public static void main(String[] args) {
  18. String s="sadzfdsafkbsdjbfvsdjdsaksdfjdkfbuewfsdsabfdsafsdjsdafds";
  19. char[] array = s.toCharArray();
  20. Map<Character, Integer> map=new TreeMap<>();
  21. for (char c : array) {
  22. Integer value = map.get(c);
  23. if(value==null) {
  24. map.put(c, 1);
  25. }else {
  26. map.put(c, value+1);
  27. }
  28. }
  29. List<Map.Entry<Character, Integer>>aa=new ArrayList<>(map.entrySet());
  30. //实现接口sort
  31. aa.sort(new Comparator<Map.Entry<Character, Integer>>() {
  32. // 实现Comparator
  33. @Override
  34. public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
  35. Integer sa= o1.getValue() - o2.getValue();
  36. return sa==0?o1.getKey().compareTo(o2.getKey()):sa;//出现次数一样就按照字母的循序排序
  37. }
  38. });
  39. //增强for循环遍历
  40. for (Entry<Character, Integer> entry : aa) {
  41. System.out.println(entry.getKey()+" 出现次数: "+entry.getValue()+"次");
  42. }
  43. }
  44. }

结果:

 二、泛型

 泛型是一种不确定的数据类型:

    比如:ArrayList<E> E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。

 泛型是可以省略的。如果省略,默认泛型是Object类型。


  有泛型之前:不健壮的代码,会在运行时才会把错误暴露出来


  有泛型之后:将潜在的问题暴露出来,早预防早治疗
                         将运行期出现的异常转换为编译期的错误

A、有泛型之前:

  1. package com.oyang.map;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. /**
  5. * @author yang
  6. *
  7. * @date 2022年6月9日下午4:08:57
  8. */
  9. public class Demo3 {
  10. public static void main(String[] args) {
  11. Set set=new HashSet<>();
  12. set.add(1);
  13. set.add(2);
  14. set.add(3);
  15. set.add(4);
  16. set.add(5);
  17. set.add(6 );
  18. for (Object obj : set) {
  19. if(Integer.valueOf(obj.toString()) %2==0) {
  20. System.out.println(obj);
  21. }
  22. }
  23. }
  24. }

此时,编译期没有错,运行也是没有错的:

 但是,当其他调用者并不知道要输入什么类型,如果他输入字符串时,会产生什么后果呢?

  1. package com.oyang.map;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. /**
  5. * @author yang
  6. *
  7. * @date 2022年6月9日下午4:08:57
  8. */
  9. public class Demo3 {
  10. public static void main(String[] args) {
  11. Set set=new HashSet<>();
  12. set.add(1);
  13. set.add(2);
  14. set.add(3);
  15. set.add(4);
  16. set.add(5);
  17. set.add("a");
  18. for (Object obj : set) {
  19. if(Integer.valueOf(obj.toString()) %2==0) {
  20. System.out.println(obj);
  21. }
  22. }
  23. }
  24. }

此时,编译期没有错,但是运行期呢?

 我们可以看到,不加泛型:不会出现编译报错!但是运行有问题

B、有泛型之后:

 数据类型不匹配时编译期就直接报错!

在一些重复性的方法进行多个类的使用时,添加泛型进行编码效率的提高!

三、集合框架工具类

A、集合之间的相互转换

  1. package com.oyang.map;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. /**
  5. * @author yang
  6. *
  7. * @date 2022年6月9日下午4:54:29
  8. */
  9. public class Demo4 {
  10. public static void main(String[] args) {
  11. String [] arr = {"a","b","c","e"};
  12. List<String> list=Arrays.asList(arr);//数组的长度是不可变的,哪怕是转换成了集合,底层依然还是数组
  13. // Object[] array = list.toArray();//集合转数组
  14. list.add("f");
  15. //java.lang.UnsupportedOperationException
  16. System.out.println(list.size());
  17. }
  18. }

运行后: 

Aa、结论:

 集合之间的相互转换:

1.数组转成集合,本质上依然是一个数组,哪怕是转换成了集合,底层依然还是数组
2.集合与数组所具备的方法是不一样的,如对于数组而言,就没有判断内部包含哪个元素,而集合有

B、基本数据类型排序

sort(List):根据元素的自然顺序对指定List集合元素按升序排序

sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序

  1. package com.oyang.map;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.List;
  6. /**
  7. * 对于工具类其他方法的应用
  8. * sort
  9. * tostring
  10. * @author yang
  11. *
  12. * @date 2022年6月9日下午5:05:35
  13. */
  14. public class Demo5 {
  15. public static void main(String[] args) {
  16. List<String> list = new ArrayList<>();
  17. list.add("c");
  18. list.add("h");
  19. list.add("b");
  20. list.add("f");
  21. list.add("r");
  22. list.add("a");
  23. System.out.println("正常打印:"+list);
  24. Collections.sort(list);
  25. System.out.println("排序后:"+list);
  26. //这里面的x、y指的是集合中的元素
  27. Collections.sort(list, (x,y)->y.compareTo(x));
  28. System.out.println("降序后:"+list);
  29. }
  30. }

结果:

 C、对象等其他数据类型排序

代码:

  1. package com.oyang.map;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.List;
  6. /**
  7. * 对于工具类其他方法的应用
  8. * sort
  9. * tostring
  10. * @author yang
  11. *
  12. * @date 2022年6月9日下午5:05:35
  13. */
  14. public class Demo5 {
  15. public static void main(String[] args) {
  16. System.out.println("============对象=============");
  17. List<Person> list = new ArrayList<>();
  18. list.add(new Person("c",20));
  19. list.add(new Person("a",13));
  20. list.add(new Person("f",54));
  21. list.add(new Person("h",45));
  22. list.add(new Person("d",38));
  23. list.add(new Person("m",22));
  24. System.out.println("升序"+list);
  25. Collections.sort(list, (x,y)->x.getName().compareTo(y.getName()));
  26. System.out.println("降序:"+list);
  27. System.out.println("============数组=============");
  28. //升序
  29. Integer [] arr= {2,5,1,7,4,8,6};
  30. Arrays.sort(arr);
  31. System.out.println("升序:"+Arrays.toString(arr));
  32. //降序
  33. Integer [] arra= {2,5,1,7,4,8,6};
  34. Arrays.sort(arra, (x,y)-> y-x);
  35. System.out.println("降序:"+Arrays.toString(arra));
  36. }
  37. }
  38. /**
  39. * Person 实体类
  40. * @author yang
  41. *
  42. * @date 2022年6月9日下午6:13:35
  43. */
  44. class Person{
  45. private String name;
  46. private int age;
  47. public String getName() {
  48. return name;
  49. }
  50. public void setName(String name) {
  51. this.name = name;
  52. }
  53. public int getAge() {
  54. return age;
  55. }
  56. public void setAge(int age) {
  57. this.age = age;
  58. }
  59. public Person() {
  60. // TODO Auto-generated constructor stub
  61. }
  62. public Person(String name, int age) {
  63. this.name = name;
  64. this.age = age;
  65. }
  66. @Override
  67. public String toString() {
  68. return "Person [name=" + name + ", age=" + age + "]";
  69. }
  70. }

 结果:


 OK,今日的学习就到此结束啦,如果对个位看官有帮助的话可以留下免费的赞哦(收藏或关注也行),如果文章中有什么问题或不足以及需要改正的地方可以私信博主,博主会做出改正的。个位看官,小陽在此跟大家说拜拜啦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/441416
推荐阅读
相关标签
  

闽ICP备14008679号