• Java双列集合Map


    目录

    一、Map

    1、Map的常见API

    2、map集合的三种遍历方式

    3、HashMap

    4、LinkedHashMap

    5、TreeMap


    一、Map

    双列集合的特点

    1、双列集合一次需要存一对数据,分别为键和值

    2、键不能重复,值可以重复 1双列集合一次需要存一对数据,分别为键和值2键不能重复,值可以

    重复

    3、键和值是一一对应的,每一个键只能找到自己对应的值 3键和值是一一对应的,每一个键只能找到自己对应的值

    4、键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象” 4键+值这个整体我们称之为“键值对”或者“键值对对象”,在中叫做“Entry对象”

    1、Map的常见API

    Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的

    方法名称说明
    v put(k key,v value)添加元素
    v remove(object key)根据键删除键值对元素
    void clear()移除所有的键值对元素
    boolean containsKey(object key)判断集合是否包含指定的键
    boolean containsValue(object value)判断集合是否包含指定的值
    boolean isEmpty()判断集合是否为空
    int size()集合的长度,也就是集合中键值对的个数

    示例:

    1. //创建map集合,
    2. Map<String,String> map = new HashMap();
    3. //添加元素
    4. map.put("张三","123");
    5. map.put("李四","456");
    6. map.put("王五","789");
    7. System.out.println(map);
    8. System.out.println("_________________");
    9. //根据键删除键值对元素
    10. map.remove("张三");
    11. System.out.println(map);
    12. //判断集合是否包含指定的键
    13. boolean flag = map.containsKey("张三");
    14. System.out.println(flag);
    15. //判断集合是否包含指定的值
    16. boolean b = map.containsValue("456");
    17. System.out.println(b);
    18. //判断集合是否为空
    19. boolean empty = map.isEmpty();
    20. System.out.println(empty);
    21. //集合的长度,也就是集合中键值对的个数
    22. int size = map.size();
    23. System.out.println(size);
    24. //移除所有的键值对元素
    25. map.clear();
    26. System.out.println(map);

    2、map集合的三种遍历方式

    1、键找值

    示例:

    1. //创建map集合,
    2. Map<String,String> map = new HashMap();
    3. //添加元素
    4. map.put("张三","123");
    5. map.put("李四","456");
    6. map.put("王五","789");
    7. //获取所有的键放在单列集合里
    8. Set<String> stringSet = map.keySet();
    9. //遍历单列集合,得到每一个键
    10. for (String key : stringSet) {
    11. //通过键找到对应的值
    12. String value = map.get(key);
    13. System.out.println(key + "=" + value);
    14. }
    15. System.out.println("-------------");
    16. //通过迭代器遍历
    17. Iterator<String> iterator = stringSet.iterator();
    18. while (iterator.hasNext()){
    19. String key = iterator.next();
    20. String value = map.get(key);
    21. System.out.println(key + "=" + value);
    22. }
    23. System.out.println("-------------");
    24. //通过Lambda表达式遍历
    25. stringSet.forEach(s -> {
    26. //通过键找到对应的值
    27. String value = map.get(s);
    28. System.out.println(s + "=" + value);
    29. });

    2、通过键值对

    示例:

    1. //创建map集合,
    2. Map<String,String> map = new HashMap();
    3. //添加元素
    4. map.put("张三","123");
    5. map.put("李四","456");
    6. map.put("王五","789");
    7. //获取所有键值对放入一个集合
    8. Set<Map.Entry<String, String>> entries = map.entrySet();
    9. //增强for遍历集合
    10. for (Map.Entry<String, String> entry : entries) {
    11. String key = entry.getKey();
    12. String value = entry.getValue();
    13. System.out.println(key + "=" + value);
    14. }
    15. System.out.println("-----------------");
    16. //迭代器遍历
    17. Iterator<Map.Entry<String, String>> iterator = entries.iterator();
    18. while (iterator.hasNext()){
    19. Map.Entry<String, String> next = iterator.next();
    20. System.out.println(next);
    21. }
    22. System.out.println("-----------------");
    23. //lambda表达式遍历
    24. entries.forEach(Entry -> {
    25. System.out.println(Entry);
    26. });

    3、lambda表达式

    示例:

    1. //创建map集合,
    2. Map<String,String> map = new HashMap();
    3. //添加元素
    4. map.put("张三","123");
    5. map.put("李四","456");
    6. map.put("王五","789");
    7. //匿名内部类
    8. map.forEach(new BiConsumer<String, String>() {
    9. @Override
    10. public void accept(String s, String s2) {
    11. System.out.println(s + "=" + s2);
    12. }
    13. });
    14. System.out.println("_________________");
    15. //简化
    16. map.forEach((String key,String value)->{
    17. System.out.println(key + "=" + value);
    18. });
    19. //简化
    20. System.out.println("_________________");
    21. map.forEach((key,value)->System.out.println(key + "=" + value));

    3、HashMap

    HashMap的特点

    1、HashMap是Map里面的一个实现类。

    2、没有特有方法,直接使用Map里面的方法就可以了。

    3、特点都是由键决定的:无序、不重复、无索引

    4、HashMap跟HashSet底层原理是一模一样的,都是哈希表结构

    5、HashMap底层是哈希表结构的

    6、依赖hashcode方法和equals方法保证键的唯一

    7、如果键存储的是自定义对象,需要重写hashCode和equals方法如果值存储自定义对象,不需要

    重写hashCode和equals方法

    HashMap练习,统计投票数

    1. //创建map集合,
    2. Map<String,Integer> map = new HashMap();
    3. //添加元素;定义四个景点
    4. List<String> list = new ArrayList<>();
    5. String [] array = {"A","B","C","D"};
    6. //定义票数
    7. Random random = new Random();
    8. for (int i = 0; i < 40; i++) {
    9. int index = random.nextInt(array.length);
    10. list.add(array[index]);
    11. }
    12. for (String name : list) {
    13. //判断当前景点是否在map集合中
    14. if (map.containsKey(name)){
    15. //存在
    16. //先获取当前经典的票数
    17. int count = map.get(name);
    18. //景点票数加1
    19. count++;
    20. //再放回集合中
    21. map.put(name,count);
    22. }else {
    23. //不存在
    24. map.put(name,1);
    25. }
    26. }
    27. //求最大值
    28. int max = 0;
    29. Set<Map.Entry<String, Integer>> entries = map.entrySet();
    30. for (Map.Entry<String, Integer> entry : entries) {
    31. int count = entry.getValue();
    32. if (count>max){
    33. max = count;
    34. }
    35. }
    36. //判断那个景点票数最多,并打印
    37. for (Map.Entry<String, Integer> entry : entries) {
    38. int count = entry.getValue();
    39. if (count == max){
    40. System.out.println(entry.getKey());
    41. }
    42. }
    43. System.out.println(map);

    4、LinkedHashMap

    由键决定:有序、不重复、无索引。

    这里的有序指的是保证存储和取出的元素顺序一致

    原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储

    的顺序。

    示例:

    1. //创建集合,
    2. LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap<>();
    3. //添加元素
    4. linkedHashMap.put("a",1);
    5. linkedHashMap.put("a",2);
    6. linkedHashMap.put("c",3);
    7. linkedHashMap.put("d",4);
    8. //打印集合
    9. System.out.println(linkedHashMap);

    5、TreeMap

    TreeMap跟TreeSet底层原理一样,都是红黑树结构的。

    由键决定特性:不重复、无索引、可排序

    可排序:对键进行排序。

    注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

    代码书写两种排序规则

    1、实现Comparable接口,指定比较规则。

    2、创建集合时传递Comparator比较器对象,指定比较规则。
    示例:

    1. //创建集合,
    2. TreeMap<Integer,String> treeMap = new TreeMap<>(new Comparator<Integer>() {
    3. @Override
    4. public int compare(Integer o1, Integer o2) {
    5. //o1表示当前要添加的元素
    6. //o2表示已在红黑树存在的元素
    7. //实现倒序
    8. return o2-o1;
    9. }
    10. });
    11. //添加元素
    12. treeMap.put(5,"a");
    13. treeMap.put(4,"b");
    14. treeMap.put(3,"c");
    15. treeMap.put(2,"d");
    16. treeMap.put(1,"e");
    17. //打印
    18. System.out.println(treeMap);














     

  • 相关阅读:
    前端视角对Rust的浅析
    项目开发中关于 uniapp实现 Android和IOS获取App缓存,清除缓存功能
    ANIMALS FULL PACK (总共三十个动物)
    element ui 的 el-tab 当使用 router-view 时 mounted 执行了多次
    Day24_8 Java学习之线程池、网络编程及TCP通信程序
    关于EasyExcel的数据导入和单sheet和多sheet导出
    如何在 Spartacus 使用 UserAccountFacade 在语言设置更改后重新读取用户数据
    SpringCloud怎么禁用sentinel
    arcgis里通过属性分级后怎么统计各部分的数值
    数据库开发-MySQL
  • 原文地址:https://blog.csdn.net/qi341500/article/details/128036015