map删除键值对_关于Map的概述

本文介绍了Map集合的概述,常用子类如HashMap和LinkedHashMap,以及Map接口中的关键方法。讲解了如何通过键找值、Entry对象以及遍历Map集合的方法。还探讨了自定义类型键值对的存储,特别是使用LinkedHashMap保持插入顺序。最后提到了JDK9对Map的优化。
摘要由CSDN通过智能技术生成

 我是小羊同学,一个兢兢业业的程序员

Map集合

概述

IP地址与主机名,身份证号码与个人,这种一一对应的关系,被称为映射。在java中,有用来专门存放这种对象关系的集合类。java.util.Map接口

Map接口与Collection接口的存储数据形式不同

b1fbcf52230158201fcecff9c4b7890d.png

  • Collection中的集合,元素是孤立存在的(单身),存储采用一个个元素的方式存储

  • Map中的集合,元素是成对存在的(夫妻),每个元素由键和值两部分组成,通过键来找到值,一一对应,一个键对应的只有一个值

  • Collection中的集合被称为单列集合,Map中的集合被称为双列集合

  • Map中的集合,键不能重复,值可以重复

Map常用子类

HashMapLinkedHashMap集合

  • HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

  • LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

Map接口中的常用方法

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。

  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

  • boolean containsKey(Object key) 判断集合中是否包含指定的键。

  • public Set keySet(): 获取Map集合中所有的键,存储到Set集合中。

  • public Set> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

//当使用put方法时 ,若指定key在集合中没有,则对应值返回为null,并且把指定值添加到集合中//若key值存在,则返回值为集合中原本存在的值(替换前的值),并把指定键Kry对应的值,进行替换public class MapDemo {    public static void main(String[] args) {        //创建 map对象        Map<String, String>  map = new HashMap<String, String>();        //添加元素到集合        map.put("小月", "小轩");        map.put("无敌", "鲁班");        map.put("吕布", "貂蝉");        System.out.println(map); //{无敌=鲁班, 小月=小轩, 吕布=貂蝉}        //String remove(String key) 删除键,返回删除键的值        System.out.println(map.remove("小月")); //返回小轩        System.out.println(map);//{无敌=鲁班, 吕布=貂蝉}        // 想要查看 键对应的值         System.out.println(map.get("无敌")); //鲁班        System.out.println(map.get("吕布")); //貂蝉       }}

Map集合遍历找键的方式

键找值:通过元素的键,获取键对应的值

步骤分析:1.获取Map中所有的键,返回一个Set集合存储所有的键 //keyset()2.遍历键的Set集合,得到每一个键3.根据键,获取对应的值 //get(K key)

6441630bd4c79f7a4de43e3724038f39.png

Entry键值对对象

Map存放的是两种对象,一是key(键),二是value(值),在Map中是一一对应的关系,这一对对象,又被称为Map中的一个Entry(项)

Entry将键值对的对应关系封装成了对象(键值对对象),这样可以使我们,在遍历Map集合时,可以从每一个键值对 对象中获取对应的键与值

方法

  • public K getKey():获取Entry对象中的键。

  • public V getValue():获取Entry对象中的值。

public Set> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

步骤:1.获取Map集合中,所有键值对(Entry)对象,以Set集合返回 //entrySet()2.遍历键值对对象的Set集合,得到每一天键值对(Entry)对象3.通过键值对对象,获取Entry对象中的键与值 //getkey() getvalue()
代码:    public class MapDemo02 {    public static void main(String[] args) {        // 创建Map集合对象         HashMap<String, String> map = new HashMap<String,String>();        // 添加元素到集合         map.put("小月", "小轩");        map.put("无敌", "鲁班");        map.put("吕布", "貂蝉");        // 获取 所有的 entry对象  entrySet        SetString,        // 遍历得到每一个entry对象        for (Entry<String, String> entry : entrySet) {             // 解析             String key = entry.getKey();            String value = entry.getValue();              System.out.println(key+"的值是:"+value);        }    }}

68f9685dfc503a5c69d8b322a68691e9.png

Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

HashMap存储自定义类型键值

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

//学生姓名并且年龄相同的学生,为同一学生

学生类

public class Student {    private String name;    private int age;    public Student() {    }    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;    }    //重写toString方法     @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    //重写equals方法    @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);    }    //重写hashCode方法    @Override    public int hashCode() {        return Objects.hash(name, age);    }}

测试类

import java.util.HashMap;import java.util.Map;import java.util.Set;public class HashMapTest {    public static void main(String[] args) {        //1,创建Hashmap集合对象。        Mapmap = new HashMap();        //2,添加元素。        map.put(new Student("李四",28), "上海");        map.put(new Student("王五",22), "北京");        map.put(new Student("小罗",24), "成都");        map.put(new Student("小月",18), "广州");        map.put(new Student("小轩",22), "南京");        //3,取出元素。键找值方式        Set keySet = map.keySet();        for(Student key: keySet){            String value = map.get(key);            System.out.println(key.toString()+"....."+value);        }    }}

在给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法

java.util.LinkedHashMap集合,可以保证map存放的key和取出顺序一致

LinkedHashMap

HashMap保证成对元素唯一,并且查询速度很快,但是成对元素存放进去没有顺序,若要保证有序,并且速度快,我们可以使用HashMAp下面的一个子类LinkedHashMap

public class LinkedHashMapDemo {    public static void main(String[] args) {        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();        map.put("小月", "小轩");        map.put("无敌", "鲁班");        map.put("吕布", "貂蝉");        SetString,         for (Entry<String, String> entry : entrySet) {            System.out.println(entry.getKey() + "  " + entry.getValue());        }    }}

结果

小月  小轩无敌  鲁班吕布  貂蝉    

JDK9的优化

class HelloJDK9 {    public static void main(String[] args) {        Set<String> str1=Set.of("a","b","c");        //str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合        System.out.println(str1);        Map<String,Integer> str2=Map.of("a",1,"b",2);        System.out.println(str2);        List<String> str3=List.of("a","b");        System.out.println(str3);    }}结果[c, b, a]{b=2, a=1}[a, b]

tips:

1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如 HashSet,ArrayList等待;

2:返回的集合是不可变的;

8bb3c42dde0b018b2656347db3415dec.png

JAVA+Windows每日爬取必应壁纸

a9d4095aa22da6b7942167d51dd3cca7.png

2020年11月程序员工资统计,平均14327元

736b8f4af156f53f18a852d700ca3224.png

如何编写优雅的异步代码 — CompletableFuture

70fc221a10a72432c37e2a967264902c.png

据说是程序员才看懂的段子。。。

707fe62ef631b3c15678c0b52c3245f7.png

end

660ede7ac3ed68290d23090117d7af43.png

*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

176e8ab810d9b113a1b40a170fffb8e3.gif

好文!必须在看
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值