Map

双列结合的根接口
    1.以键值对形式保存数据
        一个key 对应一个value
    2.键保持唯一

    HashSet和HashMap之间的关系
    底层都是哈希算法 根据面向对象来分析 一套算法 两个类使用
    HashSet底层是依赖HashMap去实现的
    添加到Set中的值 实际上 是 添加到Map中的 键的 位置

    HashMap: 有去重功能(操作的是键)(value不具备这项功能)
    TreeMap: 有排序功能(操作的是键)(value不具备这项功能)

Map的添加方法

// map 的添加方法
        HashMap<String, Integer> map = new HashMap<>();
        Integer put = map.put("Java", 21);
        Integer put2 = map.put("Javaya", 19);
        Integer put3 = map.put("Javaya", 28);
        // Javaya 的 19 被 28 覆盖了
        // put方法 返回的是 被覆盖的值
        System.out.println(put);
        System.out.println(put2);
        System.out.println(put3);

是否包含key

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        //是否包含key
        boolean containsKey = mao.containsKey("a");
        System.out.println(containsKey);

是否包含value

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        boolean containsValue = map.containsValue(19)
        System.out.println(containsValue);

通过key 获取对应的value

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        Integer i1 = map.get(a);
        Integer i1 = map.get(b);
        System.out.println(i1);
        System.out.println(i2);

获取所有key的Set集合

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        Set<String> keySet = map.KeySet();
        System.out.println(keySet);

获取所有value的集合

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        Collection<Integer> values = map.values();
        System.out.println(values);

通过key删除整个键值对

Integer remove = map.remove("c");
    System.out.println(remove);

清空Map

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        map.clear();
        System.out.println(map);
创建一个学生类 里面保存姓名和年龄
    写上构造方法 set/get方法 重写toString方法
//创建一个Map key保存学生 value保存户籍
    HashMap<Student, String> hashMap = new HashMap<>();
        hashMap.put(new Student("a", 21), "温州");
        hashMap.put(new Student("b", 22), "安徽");
        hashMap.put(new Student("c", 23), "河南");
        hashMap.put(new Student("c", 23), "河北");
        System.out.println(hashMap);

    发现打印结果 c 有两个 且 一个户籍是 河南 一个户籍是河北
    如果想保持键的唯一性的话
    就需要去重
    这里去重就相当于Set集合去重
    需要重写hashCode 和 equals方法
    重写之后 key相同 value就会被新的值覆盖

用迭代器遍历Map

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        //通过keySet遍历
        Set<String> KeySet = map.KeySet();
        Iterator<String> iterator = keySet.iterator();
        while(iterator.hasNext()){
            String key = iterator.next();
            //根据key 取出 value
            Integer value = map.get(key);
            System.out.println(key + "=" + value);
        }

用增强for循环(foreach)来遍历

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        //通过增强for循环
        //获取key的所有set集合
        Set<Sring> keySet = map.KeySet();
        for(String key : keySet){
            // 通过key取出value
            Integer value = map.get(key);
            System.out.println(key + " = " + value);
        }

通过获取键值对对象是Set集合 来遍历

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
        while(iterator.hasNext()){
            // 获取Entry 对象
            Entry<String, Integer> entry = iterator.next();
            // 获取key
            String key = entry.getKey();
            // 获取value
            Integer value = entry.getValue();
            System.out.println(key + " = " + value);
        }

增强for循环 Entry遍历

HashMap<String, Integer> map = new HashMap<>();
        map.put("a", 21);
        map.put("b", 20);
        map.put("c", 22);
        map.put("d", 19);
        Set<Entry<String,Integer>> entrySet = map.entrySet();
        for (Entry<String, Integer> entry : entrySet) {
            Integer value = entry.getValue();
            String key = entry.getKey();
            System.out.println(key + " = " + value);
        }
// 键盘输入字符串 统计字符串中每个字符出现的次数 

    System.out.println("请输入字符串");
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        char[] charArray = string.toCharArray();
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < charArray.length; i++) {
            // 将每一个字符 存入map中
            // 判断要存的字符 是否存在于 map 中
            char key = charArray[i];
            if (!map.containsKey(key)) {
                // 不存在这个key 记录一次
                map.put(charArray[i], 1);
            }else {
                // 存在这个key
                // 利用key把对应的值 取出来 + 1
                Integer value = map.get(key);
                value = value + 1;
                // 再存回去 覆盖原来 值的 部分
                map.put(key, value);
            }

        }
        System.out.println(map);

linkedHashMap

特点: 有序(怎么存的 怎么打印)
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        map.put("a", 18);
        map.put("b", 19);
        map.put("c", 20);
        map.put("d", 21);
        System.out.println(map);

TreeSet

特点: 有排序功能(操作的是键)(value不具备这项功能)
// 创建一个TreeMap key保存学生 value 保存 户籍
    // 按年龄排序
    TreeMap<Student, String> map = new TreeMap<>();
        map.put(new Student("a", 11), "安徽");
        map.put(new Student("b", 13), "浙江");
        map.put(new Student("c", 17), "河南");
        map.put(new Student("d", 16), "江苏");
        System.out.println(map);

        //使用TreeMap时 系统会自动帮你排序
        //所以打印出来的结果就是按年龄从小打到打印

Collections类中的方法(静态方法)

随机交换集合中的值

ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(13);
        list.add(10);
        list.add(11);
        Collections.shuffle(list);
        System.out.println(list);

排序

ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(13);
        list.add(10);
        list.add(11);
        Collections.sort(list);
        System.out.println(list);
ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("ygs",10));
        list.add(new Student("sxd",12));
        list.add(new Student("hzn",8));
        //排序 实现comparable 接口 只要排的是对象 都需要编写排序规则
        Collections.sort(list);
        System.out.println(list);

二分查找(前提: 有序)

ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(13);
        list.add(10);
        list.add(11);
        int index = Collections.binarySearch;
        System.out.println(index);

反转

ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(13);
        list.add(10);
        list.add(11);
        Collections.reverse(list);
        System.out.println(list);