Java集合——Map

本文详细介绍了Java中的Map接口,包括其概念、常用子类如HashMap和LinkedHashMap。通过实例展示了Map接口的方法,如put、remove、get、keySet和entrySet等,并演示了如何遍历Map集合。此外,还讲解了如何存储自定义类型键值对以及使用LinkedHashMap保持插入顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map集合


概述


  • 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口。

  • 我们通过查看 Map 接口描述,发现 Map 接口下的集合与 Collection 接口下的集合,它们存储数据的形式不同,如下图。

在这里插入图片描述

Map常用子类


在这里插入图片描述

Map接口中的常用方法


  1. public V put(K key,V value):把指定键与指定的值添加到Map集合中。
  2. public V remove(Object key):把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值。
  3. public V get(Object key):根据指定的键,在Map集合中获取对应的值。
  4. public Set<K> KeySet():获取Map集合中所有的键,存储到Set集合中。
  5. public Set<Map.Entry<K,V>> entrySet():获取Map集合中所有的键值对对象的集合(Set集合)。
  • Map接口的方法演示:
import java.util.HashMap;  
import java.util.Iterator;  
import java.util.Map;  
import java.util.Set;  
  
public class Demo01 {  
    public static void main(String[] args) {  
        HashMap<String, String> hm = new HashMap<>();  
        //1.把指定键与指定的值添加到Map集合中  
        hm.put("白昼","庆尘");  
        hm.put("白昼","胡小牛");  
        hm.put("黑桃","秧秧");  
        hm.put("恒社","李东泽");  
  
        System.out.println(hm.size());  
  
        //2.把指定的键所对应的键值对元素,在Map集合中删除,返回被删除元素的值  
        String re = hm.remove("恒社");  
        System.out.println(re);  
        System.out.println(hm);  
  
        //3.根据指定的键,在Map集合中获取对应的值  
        String s = hm.get("黑桃");  
        System.out.println(s);  
  
        //4.获取Map集合中所有的键,存储到Set集合中  
        Set<String> keys = hm.keySet();  
        Iterator<String> it = keys.iterator();  
        while (it.hasNext()) {  
            String key = it.next();  
            System.out.println(key+","+hm.get(key));  
        }  
  
        //5.获取Map集合中所有的键值对对象的集合(Set集合)  
        Set<Map.Entry<String, String>> entries = hm.entrySet();  
        Iterator<Map.Entry<String, String>> iterator = entries.iterator();  
        while (iterator.hasNext()) {  
            Map.Entry<String, String> entry = iterator.next();  
            System.out.println(entry.getKey());  
            System.out.println(entry.getValue());  
        }  
  
    }
  • tips
    • 使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中。
    • 若指定的键(key)在集合中存在,则返回值为集合中键的对应值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

Map集合遍历键找值方式


在这里插入图片描述

  • 代码如下:
//通过map的key遍历map集合(迭代器方式)  
public static void getMap1(Map<String,String> map) {  
    Set<String> keys = map.keySet();  
    Iterator<String> it = keys.iterator();  
    while (it.hasNext()) {  
        String key = it.next();  
        System.out.println(key+","+map.get(key));  
    }  
}  
//通过map的key遍历map集合(增强for)  
public static void getMap2(Map<String,String> map) {  
    Set<String> keys = map.keySet();  
    for (String key:keys) {  
        System.out.println(key+"="+map.get(key));  
    }  
}

Entry键值对对象


在这里插入图片描述

Map集合遍历键值对方式


  • 键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
  1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet() 。

  2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

  3. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示: getkey() getValue()

public static void getMap3(Map<String,String> map) {  
    Set<Map.Entry<String, String>> entries = map.entrySet();  
    Iterator<Map.Entry<String, String>> iterator = entries.iterator();  
    while (iterator.hasNext()) {  
        Map.Entry<String, String> entry = iterator.next();  
        System.out.println(entry.getKey());  
        System.out.println(entry.getValue());  
    }  
}

HashMap存储自定义类型键值


  • 练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到 map集合中。学生作为键, 家庭住址作为值。

  • 注意,学生姓名相同并且年龄相同视为同一名学生。

  • 编写学生类:

import java.util.Objects;  
  
public class Student {  
    private String name;  
    private int age;  
  
    public Student(String name, int age) {  
        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 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(name, age);  
    }  
}
  • 编写测试类:
import java.util.HashMap;  
import java.util.Map;  
import java.util.Set;  
  
public class StudentTest {  
    public static void main(String[] args) {  
        Map<Student,String> map = new HashMap<>();  
        map.put(new Student("景嘉伟",18),"上海");  
        map.put(new Student("周鹏",18),"北京");  
        map.put(new Student("宋柯",18),"北京");  
        map.put(new Student("王佳",18),"深圳");  
        System.out.println(map);  
  
        Set<Student> key = map.keySet();  
        for (Student stu:key) {  
            String value = map.get(stu);  
            System.out.println(value);  
            //System.out.println(key.toString());  
        }  
    }  
}

LinkedHashMap


  • 我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那在HashMap下面有一个子类L么我们要保证有序,还要速度快怎么办呢?

  • LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

import java.util.LinkedHashMap;  
import java.util.Map;  
import java.util.Set;  
  
public class Demo02 {  
    public static void main(String[] args) {  
        LinkedHashMap<String, String> map = new LinkedHashMap<>();  
        map.put("周鹏","18");  
        map.put("宋柯","19");  
        map.put("王佳","20");  
        map.put("嘉伟","20");  
  
        Set<Map.Entry<String, String>> entries = map.entrySet();  
        for (Map.Entry keys:entries) {  
            System.out.println(keys.getKey());  
            System.out.println(keys.getValue());  
        }  
    }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值