欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java SE集合Map

程序员文章站 2022-06-09 20:44:23
...

集合-3

1. 常用Map集合

1.1 Map集合的概述

​ Map接口是双列集合的顶层接口,下面是Map接口的定义

interface Map<K,V>  K:键的类型;V:值的类型

​ 存储的数据必须包含key和value。

​ key和value在Map集合中是一一对应的关系。一个key对应一个value。

​ key在map集合中是不会重复的。

1.2 HashMap

HashMap集合的特点

  • 底层数据结构是哈希表
  • 存储元素的顺序和遍历获取出来的顺序可能不一致
  • key不会重复

1.2.1 创建对象

HashMap<key的数据类型,value的数据类型> map = new HashMap<>();

例如:

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        HashMap<String,Integer> map = new HashMap<>();
    }

1.2.2 常用方法

V put(K key, V value)   //添加元素,如果key不存在就添加,如果key已经存在则是修改对应的value,并且返回修改前的value
V get(Object key)  //根据key获取对应的value值返回。如果key不存在就返回null
V remove(Object key) //根据key删除map中对应的键值对。并且把删除的value返回
boolean containsKey(Object key) //判断key是否存在
int size() //集合中键值对的对数
void clear() //清空集合中的所有键值对    
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
//        map.put()
        //添加元素
        map.put("name", "重庆");
        map.put("age", "15");
        String v = map.put("name", "重庆火锅");
        String name = map.get("name");
        String age = map.get("age");
        //删除元素
        String delV = map.remove("age");
        //判断key是否存在
        if(map.containsKey("name")){
            String age111 = map.get("name");//null
            System.out.println(age111.length());
        }
        //size
        int size = map.size();
        map.clear();
    }

1.2.3 遍历

1.使用entrySet遍历

​ map集合的entrySet方法可以获取一个Set集合,集合中存放的是Entry对象,一个Entry对象相当于一个键值对。我们可以遍历set集合拿到Entry对象,然后获取出里面的键和值。

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","张三");
        map.put("age","20");

        Set<Map.Entry<String, String>> entries = map.entrySet();
        //使用迭代器遍历entrySet
        Iterator<Map.Entry<String, String>> it = entries.iterator();
        while (it.hasNext()){
            Map.Entry<String, String> entry = it.next();
            System.out.println(entry.getKey()+"===="+entry.getValue());
        }
    }
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","三更");
        map.put("age","15");
		
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //使用foreach遍历entrySet
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+"===="+entry.getValue());
        }
    }

2.使用keySet遍历

​ map集合的keySet方法可以获取一个Set集合,集合中存放的是所有的key。我们可以遍历set集合拿到key对象,然后通过key获取对应的value。

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","张三");
        map.put("age","15");

        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key+"===="+map.get(key));
        }
    }

1.3 HashMap的key去重原理

​ HashMap在添加元素的时候会判断集合中是否有key和本次存入的key相同。判断的时候主要是通过hashCode方法和equals方法来进行判断的。hashCode相同,并且equals判断也相同就会认为是同一个key。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jp2SBGHt-1617273068285)(img\image-20201205213813932.png)]

​ 所以如果我们要存储到HashMap中的key是一个自定义的类型。就需要根据情况判断下是否需要重写下hashCode方法和equals方法。重写的时候使用IDEA的提示即可。

public class Student {
    private int age;
    private String name;
	// ....此次省略了构造方法和set/get方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}

注意:HashSet存储数据其实也是使用了HashMap。所以如果往HashSet中存储自定义对象也要看情况是否需要重写hashCode方法和equals方法。