小东吖 之 java Map集合类

一.初识map

1.java集合框架用于存储数据,也被称为集合类

位于java.util包下

java.util包下常用接口和类

Collection和Map是Java集合框架的根接口

List集合是有序集合,集合中的元素可以重复,有下标,访问集合中的元素可以根据元素的索引来访问

Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。

Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。

2.Map接口

Map接口不是Collection接口的继承。Map接口用于维护 键/值对(key/value pairs)。该接口描述了从不重复的键到值的映射。

HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。

HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;

可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

TreeMap 不仅可以保持顺序,而且可以用于排序

Map与Collection:
Map与Collection在集合框架中属并列存在
Map存储的是键值对
Map存储元素使用put方法,Collection使用add方法
Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素
Map集合中键要保证唯一性

二.一些方法的使用

3.向集合添加元素

/** 
 *  
 * 向Map集合添加
 * 
 */  
public class Demo01   
{  
    public static void main(String[] args)  
    {  
        Map<String,Integer> map = new HashMap<String,Integer>();  
          // 三对键值对
       map.put("张三", 19);  
       map.put("李四", 17);  
       map.put("王五", 18);  
        // 如果你的key值一样 value的值不一样 就会被覆盖
        // 因为key值 是唯一的
        map.put("张三", 20)
        System.out.println(map);  
    }  
}  

在这里要注意的是: 方法的返回值 返回的是 被覆盖的值

4.一些常用的方法:
clear()
从此映射中移除所有映射关系(可选操作)
containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)
size()
返回此映射中的键-值映射关系数。
get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。

       Map<String, Integer> map = new HashMap<>();
        Integer num1 = map.put("小一", 13);
        Integer num2 = map.put("小二", 15);
        Integer num3 = map.put("小三", 18);
        Integer num4 = map.put("小四", 11);
        // 测试clean
        //map.clear();
        // containsKey(Object key)
        // 是否包含key 键值
        boolean containsKey = map.containsKey("小三");
        System.out.println(containsKey);
        // containsValue(Object value) 
        // 是否包含value 键值对应的值
        boolean containsValue = map.containsValue(18);
        System.out.println(containsValue);
        // isEmpty() 
        // 判断map是否为空/
        boolean empty = map.isEmpty();
        System.out.println(empty);
        // remove(Object key) 返回的是 value
        // 删除key 键值 (根据键来删除 键是唯一的)
        Integer remove = map.remove("小三");
        System.out.println(remove);
        // size() 
        // map有几对键值对
        int size = map.size();
        System.out.println(size);
        System.out.println(map);

        // get 是通过键值获取value值
        Integer integer = map.get("小三");
        System.out.println(integer);
    }

三.map集合的两种取出方式:

1 . Set keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。

Set keySet 是把map中的所有键(key) 取出来 放入一个Set集合中 返回给你

get(Object key) 是通过传入键key 返回的是 键key 对应的value值

Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
2 . Set

四.map遍历的三种方法

1.for循环遍历

Map<String, Integer> map = new HashMap<>();
        Integer num1 = map.put("小一", 13);
        Integer num2 = map.put("小二", 15);
        Integer num3 = map.put("小三", 18);
        Integer num4 = map.put("小四", 11);

        // for循环遍历
        // 先获取key键值 
        for (String string : map.keySet()) {
            // 通过键值找到value的值
            Integer integer = map.get(string);
            System.out.println(string + " " + integer);
        }

2.用迭代器遍历

    Map<String, Integer> map = new HashMap<>();
        Integer num1 = map.put("小一", 13);
        Integer num2 = map.put("小二", 15);
        Integer num3 = map.put("小三", 18);
        Integer num4 = map.put("小四", 11);

        // 先获取set的迭代器
        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            Integer integer = map.get(next);
            System.out.println(next + " " + integer);
        }

3.使用Entry
entrySet()
返回此映射中包含的映射关系的 Set 视图。
主要使用其中的方法
getKey()
返回与此项对应的键。
getValue()
返回与此项对应的值。

         //该方法是一个集合 集合中储存的是一个一个键值对对象
        // Entry对象 中 保存的是 key 和 value
        // 利用该方法遍历
Map<String, Integer> map = new HashMap<>();
        Integer num1 = map.put("小一", 13);
        Integer num2 = map.put("小二", 15);
        Integer num3 = map.put("小三", 18);
        Integer num4 = map.put("小四", 11);
        // 获取map中所有的 Entry对象的Set集合
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        // for循环遍历
        for (Entry<String, Integer> entry : entrySet) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + " " + value);
        }

五.TreeMap集合 TreeMap 不仅可以保持顺序,而且可以用于排序

创建学生类 TreeMap集合
先储存3个学生 户籍


public class Student implements Comparable<Student>{
    private String name;
    private int age;
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

  // 重写 HashCode 和 equals 方法
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
// 按年龄排序就要进行重写compareTo方法
    @Override
    public int compareTo(Student o) {
        int num = this.age- o.age;
        return num == 0? 1 : num;
    }
}


 public static void main(String[] args)  
    {  
        // TreeMap 可以对map中的键进行排序 
        // 向TreeMap中添加3个学生 key是学生 value户籍
        // 按年龄排序
        TreeMap<Student, String> treeMap = new TreeMap<>(new MyComparator());
        treeMap.put(new Student("张三", 13), "安徽");
        treeMap.put(new Student("李四", 12), "上海");
        treeMap.put(new Student("王五", 15), "北京");

        System.out.println(treeMap);
    }

HashMap 的用法 和 HashSet的用法完全一样 因为 HashSet的底部实现就是HashMap集合
所以 要进行 去重方法 重写 HashCode 和 equals 方法
排序也要重写compareTo方法 通过类实现Comparable接口 即可
六.Map嵌套


         * java 学科
         * java 1-- 学生 和 户籍 
         * java 2-- 学生 和 户籍
         * 
         * java学科 是一个map 
         * 保存了两个键值对
         * 
         * 1班 也是一个 map
         * 保存 --- 学生 户籍

        // java 学科
        HashMap<HashMap<Student, String>, String> bigMap = new HashMap<>();
        // 1班
        HashMap<Student, String> class1 = new HashMap<>();
        class1.put(new Student("1", 13), "安徽");
        class1.put(new Student("2", 14), "北京");
        // 2班
        HashMap<Student, String> class2 = new HashMap<>();
        class2.put(new Student("3", 15), "广州");
        class2.put(new Student("4", 16), "深圳");

        bigMap.put(class1, "1班");
        bigMap.put(class2, "2班");

        // 遍历  我遍历的是哪个容器 容器里存在的什么?
        // 遍历 biaMap
        for (HashMap<Student, String> ban : bigMap.keySet()) {
            // 在bigMap 中 对应value 班
            String string = bigMap.get(ban);
            System.out.println(string);
            // 继续遍历 通过学生找 户籍
            for (Student student : ban.keySet()) {
                // 找户籍 
                String hj = ban.get(student);
                System.out.println(student + " " + hj);
            }
        }

七.练习

键盘输入一个字符串 来计算每个字符出现的次数

     // 键盘输入一个字符串 来计算每个字符出现的次数
        System.out.println("请输入");
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        // 把字符串转为数组
        char[] charArray = string.toCharArray();
        // 创建map集合
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < charArray.length; i++) {
            // 遍历输入的字符串
            char c1 = charArray[i];
            // 如果集合没有包含这个字符
            if (!map.containsKey(c1)) {
                // 就添加到集合中去
                map.put(c1, 1);
            }else {
                // 通过键值获取value的值
                Integer num = map.get(c1);
                // 有的话 就会被覆盖 value值加1
                map.put(c1, num+1);
            }
        }
        System.out.println(map);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值