9

Java集合:双列集合Map详解,让你快速上手!

 9 months ago
source link: https://studygolang.com/articles/36437
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Java集合:双列集合Map详解,让你快速上手!

YunDuanCode · 8天之前 · 57 次点击 · 预计阅读时间 7 分钟 · 大约8小时之前 开始浏览    

Map是一种双列集合,一个元素包含两个值,一个是Key,一个是Value。Map集合中的元素,key和value的数据类型可以相同,也可以不同。一个映射不能包含重复的键;每个键最多只能有一个值。

今天我们继续探索Java集合的世界,这次我们要聊的主题是——双列集合Map。

首先,让我们来理解一下什么是双列集合。在Java中,集合是一种用于存储对象的容器,而双列集合则是一种可以同时通过两个键(Key)来访问元素的集合。听起来有些复杂?别担心,接下来我会用最简单的语言,带你走进Map的世界。

现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,学号与学生等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。 Map 接口下的集合与Collection 接口下的集合,他们的存储形式有所不同,如下图:

image.png

Collection 集合,元素是独立的,存储的元素是一个一个的存储。

Map中的集合,元素是成对出现。每个元素由键与值两部分组成,通过键可以找到所对应的值。

所以 我们前面所说 Collection是单列集合,而Map 成为双列集合。

需要注意,Map中的键不能重复,值可以重复,并且每个键只能对应一个值。

2 Map 常用子类

Map 接口 也有很多子类,这里我们主要讲解常用的HashMap集合,LinkedHashMap集合。

image.png

HashMap:,v> 存储数据采用哈希表结构,元素的存取顺序不能保证一致。

由于要保证键的唯一,不重复,需要重写键的hashCode()方法,equals()方法。我们之前所学的HashSet 底层,实际上也是new了一个HashMap,但是只是使用了 HashMap中的 K,所以HashSet是不允许重复值的。

LinkedHashMap:,v> HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。

通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

Set与Map之间的关系非常密切,从java 源码来看,java是先实现了Map,然后通过包装一个所有value都为null的Map,就实现了Set集合。

你还在苦恼找不到真正免费的编程学习平台吗?可以试试云端源想!课程视频、在线书籍、在线编程、实验场景模拟、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费!点这里即可查看

3 Map 接口中的常用方法

Map接口中定义了很多方法,常用的如下:

添加、删除、修改操作:

  • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中

  • void putAll(Map m):将m中的所有key-value对存放到当前map中

  • Object remove(Object key):移除指定key的key-value对,并返回value

  • void clear():清空当前map中的所有数据

    public class Demo1Map {
    
        public static void main(String[ ] args) {
    
            //  ○ Object put(Object key,Object value):将指定key-value添加到(或修 改)当前map对象中
            //  ○ void putAll(Map m):将m中的所有key-value对存放到当前map中
            //  ○ Object remove(Object key):移除指定key的key-value对,并返回value
            //  ○ void clear():清空当前map中的所有数据
    
            //创建集合对象
            Map<String, Student> studentMap = new HashMap<>();
    
            //将对应的对象放到map中
            studentMap.put("N001", new Student("叮当", 7));
            studentMap.put("N002", new Student("糖糖", 7));
            studentMap.put("N003", new Student("熙熙", 7));
    
            //remove
            studentMap.remove("N002");
            System.out.println("remove==" + studentMap);
    
            //put
            studentMap.put("N004", new Student("狗蛋", 7));
            System.out.println("put==" + studentMap);
    
            //putAll 如果键重复,会把原map中的节点替换
            Map<String, Student> studentMap2 = new HashMap<>();
            studentMap.put("N001", new Student("一一", 7));
            studentMap.put("N002", new Student("陌陌", 7));
            studentMap.putAll(studentMap2);
            System.out.println("putAll == " + studentMap);
    
            //clear
            studentMap.clear();
            System.out.println("clear == " + studentMap);
        }
    
    }
    

    元素查询的操作:

  • Object get(Object key):获取指定key对应的value

  • boolean containsKey(Object key):是否包含指定的key

  • boolean containsValue(Object value):是否包含指定的value

  • int size():返回map中key-value对的个数

  • boolean isEmpty():判断当前map是否为空

  • boolean equals(Object obj):判断当前map和参数对象obj是否相等

    public class Demo2Map {
    
        public static void main(String[ ] args) {
    
            //创建集合对象
            Map<String, Student> studentMap = new HashMap<>();
    
            //将对应的对象放到map中
            studentMap.put("N001", new Student("叮当", 7));
            studentMap.put("N002", new Student("糖糖", 7));
            studentMap.put("N003", new Student("熙熙", 7));
    
            //get
            Student n001 = studentMap.get("N001");
            System.out.println("001==" + n001 );
    
            //containsKey
            boolean isContainsKey = studentMap.containsKey("N002");
            System.out.println("containsKey结果 == " + isContainsKey);
            //containsValue
            boolean containsValue = studentMap.containsValue(new Student("熙熙", 7));
            System.out.println("containsValue结果 == " + containsValue);
            //size
            int size = studentMap.size();
            System.out.println("size == "+ size);
            //isEmpty
            boolean isEmpty = studentMap.isEmpty();
            System.out.println("isEmpty == " + isEmpty);
            //equals
            boolean equals = studentMap.get("N002").equals(new Student("糖糖", 7));
            System.out.println("equals == " + equals);
        }
    
    }
    

4 Map 集合遍历

Map接口没有继承 接口 Iterable ,所以遍历不能直接使用 迭代器和增强for循环。 那它如何遍历呢? 我们知道,Map中存放的是两种对象 Key对象 & Value对象,他们在Map中是一一对应的,这一对对象合起来在Map集中称为 Entry 对象,也称之为 键值对象。 而我们在遍历Map集合时,就可以从每一个键值对对象中获取对应的键,然后找到对应的值。

4.1键找值方式

在Map 集合中,为我们提供了一个方法

keySet() 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键`。 那我们就可以遍历这个Set集合,通过 Entry的方法

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

4.2 键值对方式

在Map集合中也提供了获取所有Entry对象的方法:

public Set> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。 那我们就 可以通过这个方法,获取Map集合中,所有的键值对(Entry)对象的 Set集合,然后遍历 包含Entry对象的Set集合,得到每一个Entry对象。 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getkey() getValue()

    public class Demo3Map {

        public static void main(String[ ] args) {

                //方法一:keySet遍历key+value:
                //创建集合对象
                Map<String, Student> studentMap = new HashMap<>();

                //将对应的对象放到map中
                studentMap.put("N001", new Student("叮当", 7));
                studentMap.put("N002", new Student("糖糖", 7));
                studentMap.put("N003", new Student("熙熙", 7));

                //获取 map集合中的所有key
                Set<String> strings = studentMap.keySet();
                //遍历 key的集合,通过get()获取没一个value
                for (String key : strings) {
                    Student student = studentMap.get(key);

                    System.out.println("studentmap == key="+key+" value="+ student);
                }


​    

                //方法二:entrySet遍历key+value:
                Set<Map.Entry<String, Student>> entries = studentMap.entrySet();

                for (Map.Entry<String, Student> entry : entries) {

                    String key = entry.getKey();
                    Student value = entry.getValue();

                    System.out.println("studentmap 方式2 == key="+key+" value="+ value);
                }
        }
    }

Map在实际应用中非常广泛,例如在数据库中存储和查询数据、在缓存中存储和获取数据、在处理用户输入和输出时进行转换等。通过使用Map,我们可以更高效地处理复杂的数据结构和业务逻辑。

总的来说,Map是Java集合框架中的一个重要组成部分,它的强大功能和灵活应用为我们的编程工作带来了极大的便利。希望通过今天的学习,你能对Map有一个更深入的理解,并能在实际编程中灵活运用。


有疑问加站长微信联系(非本文作者))

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK