集合-3

1. 常用Map集合

1.1 Map集合的概述

  1. Map接口是双列集合的顶层接口,下面是Map接口的定义
  1. interface Map<K,V> K:键的类型;V:值的类型
  1. 存储的数据必须包含keyvalue
  2. keyvalueMap集合中是一一对应的关系。一个key对应一个value
  3. keymap集合中是不会重复的。

1.2 HashMap

HashMap集合的特点

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

1.2.1 创建对象

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

例如:

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

1.2.2 常用方法

  1. V put(K key, V value) //添加元素,如果key不存在就添加,如果key已经存在则是修改对应的value,并且返回修改前的value
  2. V get(Object key) //根据key获取对应的value值返回。如果key不存在就返回null
  3. V remove(Object key) //根据key删除map中对应的键值对。并且把删除的value返回
  4. boolean containsKey(Object key) //判断key是否存在
  5. int size() //集合中键值对的对数
  6. void clear() //清空集合中的所有键值对
  1. public static void main(String[] args) {
  2. HashMap<String,String> map = new HashMap<>();
  3. // map.put()
  4. //添加元素
  5. map.put("name", "三更");
  6. map.put("age", "15");
  7. String v = map.put("name", "三更草堂");
  8. String name = map.get("name");
  9. String age = map.get("age");
  10. //删除元素
  11. String delV = map.remove("age");
  12. //判断key是否存在
  13. if(map.containsKey("name")){
  14. String age111 = map.get("name");//null
  15. System.out.println(age111.length());
  16. }
  17. //size
  18. int size = map.size();
  19. map.clear();
  20. }

1.2.3 遍历

1.使用entrySet遍历

  1. map集合的entrySet方法可以获取一个Set集合,集合中存放的是Entry对象,一个Entry对象相当于一个键值对。我们可以遍历set集合拿到Entry对象,然后获取出里面的键和值。
  1. public static void main(String[] args) {
  2. HashMap<String,String> map = new HashMap<>();
  3. map.put("name","三更");
  4. map.put("age","15");
  5. Set<Map.Entry<String, String>> entries = map.entrySet();
  6. //使用迭代器遍历entrySet
  7. Iterator<Map.Entry<String, String>> it = entries.iterator();
  8. while (it.hasNext()){
  9. Map.Entry<String, String> entry = it.next();
  10. System.out.println(entry.getKey()+"===="+entry.getValue());
  11. }
  12. }
  1. public static void main(String[] args) {
  2. HashMap<String,String> map = new HashMap<>();
  3. map.put("name","三更");
  4. map.put("age","15");
  5. Set<Map.Entry<String, String>> entries = map.entrySet();
  6. //使用foreach遍历entrySet
  7. for (Map.Entry<String, String> entry : entries) {
  8. System.out.println(entry.getKey()+"===="+entry.getValue());
  9. }
  10. }

2.使用keySet遍历

  1. map集合的keySet方法可以获取一个Set集合,集合中存放的是所有的key。我们可以遍历set集合拿到key对象,然后通过key获取对应的value
  1. public static void main(String[] args) {
  2. HashMap<String,String> map = new HashMap<>();
  3. map.put("name","三更");
  4. map.put("age","15");
  5. Set<String> keys = map.keySet();
  6. for (String key : keys) {
  7. System.out.println(key+"===="+map.get(key));
  8. }
  9. }

1.3 HashMap的key去重原理

  1. HashMap在添加元素的时候会判断集合中是否有key和本次存入的key相同。判断的时候主要是通过hashCode方法和equals方法来进行判断的。hashCode相同,并且equals判断也相同就会认为是同一个key。<br />![image-20201205213813932.png](https://cdn.nlark.com/yuque/0/2022/png/25966321/1650014002835-37589011-1f29-4c06-bcdb-5515f965b80e.png#clientId=u9f557d3f-bf1d-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u646487c0&margin=%5Bobject%20Object%5D&name=image-20201205213813932.png&originHeight=97&originWidth=806&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6302&status=done&style=none&taskId=ua5d016d1-5c02-44fe-8e62-27188f7baf2&title=)<br /> 所以如果我们要存储到HashMap中的key是一个自定义的类型。就需要根据情况判断下是否需要重写下hashCode方法和equals方法。重写的时候使用IDEA的提示即可。
  1. public class Student {
  2. private int age;
  3. private String name;
  4. // ....此次省略了构造方法和set/get方法
  5. @Override
  6. public boolean equals(Object o) {
  7. if (this == o) return true;
  8. if (o == null || getClass() != o.getClass()) return false;
  9. Student student = (Student) o;
  10. return age == student.age &&
  11. Objects.equals(name, student.name);
  12. }
  13. @Override
  14. public int hashCode() {
  15. return Objects.hash(age, name);
  16. }
  17. }
  1. **注意:HashSet存储数据其实也是使用了HashMap。所以如果往HashSet中存储自定义对象也要看情况是否需要重写hashCode方法和equals方法。**