美文网首页
Topic18:Map集合

Topic18:Map集合

作者: KaveeDJ | 来源:发表于2019-01-24 20:14 被阅读2次

18.01 Map集合概述和特点

  • Map接口概述
    • 将键映射到值的对象
    • 一个映射不能包含重复的键
    • 每个键最多只能映射到一个值
  • Map接口和Collection接口的不同
    • Map是双列的,Collection是单列的
    • Map的键唯一,Collection的子体系Set是唯一的
    • Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
    • Set底层依赖Map

18.02 Map集合的功能概述

  • 添加功能
    • V Put(K key, V value):添加元素
      • 如果键是第一次存储,就直接存储元素,返回null
      • 如果键不是第一次存储,就用值把以前的值替换掉,返回以前的值。
  • 删除功能
    • void clear():移除所有的键值对元素
    • V remove(object key):根据键删除键值对元素,并把值返回
  • 判断功能
    • boolean containsKey(Object key):判断集合是否包含指定的键
    • boolean containsValue(Object key):判断集合是否包含指定的值
    • boolean isEmpty():判断集合是否为空
  • 获取功能
    • Set<Map.Entry<K,V>> entrySet():
    • V get(Object key):根据键获取值
    • Set<K> keySet():获取集合中所有键的集合
    • Collection<V> values():获取集合中所有值得集合
  • 长度功能
    • int size():返回集合中的键值对的个数

18.03 Map集合的遍历之键找值

  • 使用增强for循环
  • 在keySet()集合中根据get(key)获得value

18.04 键值对对象找键和值

  • 思路
    • 获取所有键值对对象的集合
    • 遍历键值对对象的集合,获取到每一个键值对对象
    • 根据键值对对象找键和值
  • Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象,并存储在Set集合中
  • Entry是Map的子对象

18.05 HashMap

  • HashMap集合键是Student值是String的案例
  • 自定义对象重写hashCode和equals方法

18.06 LinkedHashMap的概述和使用

  • 底层用链表实现,可以有序排列

18.07 TreeMap集合存取自定义对象

  • 自定义对象要实现Comparable接口,实现compareTo方法
  • 也可以添加比较器comparator
  • 与TreeSet是一个套路

18.08 统计字符串中每个字符出现的次数

  • 没有特殊要求,就用hashMap,因为它的效率最高(它是无序的,直接往里面扔)
package com.kevin.test;

import java.util.HashMap;

public class Test1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // 1.定义一个需要被统计的字符串
        String s = "aaaaaaabbbbbccccdddfffff";
        // 2.将字符串转换为字符数组
        char[] arr = s.toCharArray();
        // 3.定义双列集合,存储字符串中字符以及字符出现的次数
        HashMap<Character, Integer> hm = new HashMap<>();
        // 4.遍历字符数组获取每一个字符,并将字符存储在双列集合中
        for (char c : arr) {
            // 5.做判断,如果集合中不包含这个键,就将该字符当做键,值为1存储,如果集合中包含这个键,就将值加1存储
            hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
        }
        // 6.打印双列集合获取字符串出现的次数
        for (Character key : hm.keySet()) {
            System.out.println(key + "=" + hm.get(key));
        }
    }

}

18.09 集合嵌套——HashMap嵌套HashMap

  • 进行嵌套打印
  • for(HashMap<Student, String> h : hm.KeySet())

18.10 HashMap和Hashtable的区别

  • Hashtable与Vector很像,现在都被替代掉了
  • 共同点
    • 底层都是Hash算法,都是双列集合
  • 区别
    • HashMap是线程不安全的,效率高,JDK1.2版本的
    • Hashtable是线程安全的,效率低,JDK1.0版本的
    • HashMap可以存储null键与null值
    • Hashtable不可以存储null键与null值

18.11 Collection工具类的概述和常见方法讲解

  • 当一个类中所有的方法都是静态方法,那么就应该私有构造方法,直接类名调用就可以了。
  • 所谓的比较,就必须实现compare方法
  • Collections中的常见方法
    • sort(List<T> list)
    • binarySearch(二分查找法)
    • max
    • min
    • reverse
    • shuffle:随机置换, 可以用来洗牌

18.12 模拟斗地主洗牌和发牌

  • concat:连接两个字符串
package com.kevin.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

public class Test2 {

    /**
     * 分析:
     * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去
     * 2,洗牌
     * 3,发牌
     * 4,看牌
     */
    public static void main(String[] args) {
        // 1.买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去
        String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String[] color = {"红桃","黑桃","方块","梅花"};
        ArrayList<String> poker = new ArrayList<>();
        
        //拼接花色和数字
        for (String s1 : color) {
            for (String s2 : num) {
                poker.add(s1.concat(s2));
            }
        }
        
        poker.add("小王");
        poker.add("大王");
        
        // 2.洗牌
        Collections.shuffle(poker);
        
        // 3.发牌
        ArrayList<String> gaojin = new ArrayList<>();
        ArrayList<String> longwu = new ArrayList<>();
        ArrayList<String> me = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();
        
        for (int i = 0; i < poker.size(); i++) {
            if (i >= poker.size() - 3) {
                dipai.add(poker.get(i));
            } else if(i % 3 == 0){
                gaojin.add(poker.get(i));
            } else if(i % 3 == 1){
                longwu.add(poker.get(i));
            } else {
                me.add(poker.get(i));
            }
        }
        
        // 4.看牌
        System.out.println(gaojin);
        System.out.println(longwu);
        System.out.println(me);
        System.out.println(dipai);
    }

}

18.13 对牌进行重新排序

  • 使用HashMap:双列集合
package com.kevin.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class Test3 {

    /**
     * 分析:
     * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去
     * 2,洗牌
     * 3,发牌
     * 4,看牌
     */
    public static void main(String[] args) {
        // 1.买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去
        String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2",};
        String[] color = {"红桃","黑桃","方块","梅花"};
        
        // 存储索引和扑克牌
        HashMap<Integer, String> hm = new HashMap<>();
        // 存储索引
        ArrayList<Integer> list = new ArrayList<>();
        int index = 0;
        // 拼接扑克牌并将索引和扑克牌存储在HashMap中
        for (String s1 : num) {                           //获取数字
            for (String s2 : color) {                     //获取颜色
                hm.put(index, s2.concat(s1));
                list.add(index);
                index++;
            }
        }
        // 将小王添加到双列集合中
        hm.put(index, "小王");
        list.add(index);
        index++;
        hm.put(index, "大王");
        list.add(index);
        
        // 2.洗牌
        Collections.shuffle(list);
        
        // 3.发牌
        TreeSet<Integer> gaojin = new TreeSet<>();
        TreeSet<Integer> longwu = new TreeSet<>();
        TreeSet<Integer> me = new TreeSet<>();
        TreeSet<Integer> dipai = new TreeSet<>();
        
        for (int i = 0; i < list.size(); i++) {
            if (i >= list.size() - 3) {
                dipai.add(list.get(i));
            } else if(i % 3 == 0){
                gaojin.add(list.get(i));
            } else if(i % 3 == 1){
                longwu.add(list.get(i));
            } else {
                me.add(list.get(i));
            }
        }
        
        // 4.看牌
        lookPoker(hm, gaojin, "高进");
        lookPoker(hm, longwu, "龙五");
        lookPoker(hm, me, "我");
        lookPoker(hm, dipai, "底牌");
    }

    public static void lookPoker(HashMap<Integer, String> hm,
            TreeSet<Integer> ts, String name) {
        System.out.print(name + "的牌是:");
        for (Integer integer : ts) {
            System.out.print(hm.get(integer) + " ");
        }
        System.out.println();
    }

}

18.14 泛型固定下边界

  • 泛型固定上边界(多态的思想,父类指向子类)
    • ? extends E
  • 泛型固定下边界(拿出去做比较,也是多态的思想)
    • ? super E

18.15 集合总结

  • Collection体系

    • List(存取有序,有索引,可以重复)
      • ArrayList(底层是数组实现的,线程不安全,查找和修改快,增和删比较慢)
      • LinkedList(底层是链表实现的,线程不安全,增和删比较快,查找和修改比较慢)
      • Vector(底层是数组实现的,线程安全的,无论增删改查都慢)
    • Set (存取无序,无索引,不可以重复)
      • HashSet(底层是哈希算法实现的)
        • LinkedHashSet(底层是链表实现的,但是也是可以保证元素唯一,和HashSet原理一样)
      • TreeSet(底层是二叉树算法实现)
  • Map体系

    • HashMap(底层是Hash算法,针对键)
      • LinkedHashMap(底层是链表,针对键)
    • TreeMap(底层是二叉树算法,正对键)
  • 开发中常用,ArrayList,HashSet,HashMap,简单高效(开发中一般不需要排序)

相关文章

  • Topic18:Map集合

    18.01 Map集合概述和特点 Map接口概述将键映射到值的对象一个映射不能包含重复的键每个键最多只能映射到一个...

  • 2019-01-03

    Map集合 Map集合 1.1Map集合概念 Map集合是一种存放关系对象的对象的双列集合。 1.2Map集合的常...

  • 2019-01-13

    基于Map集合重点整理 Map集合 1.1Map集合概念 Map集合是一种存放关系对象的对象的双列集合。 1.2M...

  • Map集合Map<Integer,String> m

    01Map集合概述 A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接...

  • Map接口

    01Map集合概述 A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接...

  • 2020-06-30【Map】

    Map概述 Map集合的基本功能 Map集合的获取功能 Map集合的遍历 练习 Collections类 斗地主

  • day04 【Map】

    day04 【Map】 主要内容 Map集合 教学目标 能够说出Map集合特点 使用Map集合添加方法保存数据 使...

  • Java - Part 6

    一、Map集合Map集合和Collection集合不一样,Map集合是双列集合,以键值对的形式存在,键不能重复,值...

  • 集合详解

    Iterator:迭代器,它是Java集合的顶层接口(不包括 map 系列的集合,Map接口 是 map 系列集合...

  • 第六篇学习笔记

    第六篇学习总结 一、Map集合 Map集合和Collection集合不一样,Map集合是双列集合,以键值对的形式存...

网友评论

      本文标题:Topic18:Map集合

      本文链接:https://www.haomeiwen.com/subject/ugiujqtx.html