Java重点 | Map集合

简介: 本文将对Map集合概念以及常用方法进行详细的介绍,通过代码实战,让你深入浅出的理解Map集合。

Map集合

概述

**java.util.Map<k,v>集合
Map集合的特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)。
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同。
3.Map集合中的元素,key是不允许重复的,value是可以重复的。
4.Map集合中的元素,key和value是一一对应。**

结构继承图

在这里插入图片描述

继承图详细介绍

**Map集合介绍:
1、Map集合和Collection集合没有关系。
2、Map集合以key和value的这种键值对的方式存储元素。
3、key和value都是存储java对象的内存地址。
4、所有Map集合的kev特点:无序不可重复的。
Map集合的key和Set集合存储元素特点相同。**

**HashMap集合介绍:
HashMap集合底层是哈希表数据结构,查询速度快,是非线程安全的。
在JDK8之后,如果哈希表单向链表中元素超过8个,单向链表这种数据结构会变成红黑树数据结构。当红黑树上的节点数量小于6时,会重新把红黑树变成单向链表数据结构。这种方式也是为了提高检索效率,二叉树的检索会再次缩小扫描范围。提高效率。初始化容量16默认加载因子.75
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8):提高查询的速度
HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
扩容是:扩容之后的容量是原容量的2倍。**

**LinkedHashMap集合介绍:
1.底层是哈希表+链表(保证迭代的顺序)
2.是一个有序的集合,存储元素和取出元素的顺序是一致的**

**Hashtable集合介绍:
Hashtable集合底层也是哈希表数据结构,是线程安全的,其中所有的方法都带有 synchronized关键字,效率较低,现在使用较少了,因为控制线程安全有其它更好的方案.**

**Properties属性类介绍:
Properties是线程安全的,因为继承Hashtable,另外Properties存储元素的时候也是采用key和value的形式存储,并且key和value只支持String类型不支持其它类型。
Properties被称为属性类。**

**SortedMap集合介绍:
SortedMap集合的key存储元素的特点:
首先是无序不可重复的,另外放在SortedMap集合key部分的元素会自动按照大小顺序排序称为可排序称为可排序的集合。**

TreeMap集合底层的数据结构是一个二叉树。

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):判断集合中是否包含指定的键

put方法

** public V put(K key,V value):把指定的键与指定的值添加到Map集合中。
返回值:v
存储键值对的时候,key不重复,返回值v是null。
存储键值对的时候,kev重复,会使用新的value替换map中重复的value,返回被替换的value值。**

举例

private static void show01() {
        //创建Map集合对象 多态
        Map<String,String> map = new HashMap<>() ;

        String v1 = map.put("小飞","冰冰1") ;
        System.out.println("v1:"+v1); //key不重复,返回值是null。输出:v1:null

        String v2 = map.put("小飞","冰冰2") ;
        System.out.println("v2:"+v2); //键重复 返回被替换的值。输出:v2:冰冰1 

        System.out.println(map); // 输出:{小飞=冰冰2}

        map.put("冷风","孔晓云");
        map.put("杨过","小龙女");
        System.out.println(map);//输出:{杨过=小龙女, 小飞=冰冰2, 冷风=孔晓云}

    }

remove方法

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

举例

private static void show02() {
        //创建Map集合对象
        Map<String,Integer> map = new HashMap<>();
        map.put("丽颖",168);
        map.put("音",165);
        map.put("玲",178);
        System.out.println(map); //{玲=178, 丽颖=168, 音=165}

        Integer v1 = map.remove("玲");
        System.out.println("v1:"+v1);  //v1:178 key存在,返回被删除的值
        System.out.println(map); //{丽颖=168, 音=165}

        Integer v2 = map.remove("林志");
        System.out.println("v2:"+v2);//v2:null key不存在 返回null
        System.out.println(map); //{丽颖=168, 音=165}
//        注意问题 :多使用包装类接收,少使用基本数据类型

    }

get方法

** public V get(Object key):根据指定的键,在Map集合中获取对应的值。
返回值:key存在,返回对应的value值。key不存在,返回null。**

举例

private static void show03() {
        //创建Map集合对象
        Map<String,Integer> map = new HashMap<>();
        map.put("丽颖",168);
        map.put("音",165);
        map.put("玲",178);

        Integer v1 = map.get("丽颖");
        System.out.println("v1:"+v1);// v1:168 有对应的key返回对应的值

        Integer v2 = map.get("热巴");
        System.out.println("v2:"+v2); //v2:null  没有对应的key返回null
    }

containsKey方法

boolean containsKey(Object key):判断集合中是否包含指定的键,包含返回true,不包含返回false

举例

private static void show04() {
        //创建Map集合对象
        Map<String,Integer> map = new HashMap<>();
        map.put("丽颖",168);
        map.put("音",165);
        map.put("玲",178);

        boolean v1 = map.containsKey("丽颖");
        System.out.println("v1:"+v1); //v1:true  有这个key 返回ture

        boolean v2 = map.containsKey("颖");
        System.out.println("v2:"+v2); //v2:false  没有这个key 返回false
    }
相关文章
|
19天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
25 2
|
23天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
19天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
23天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
23天前
|
Java 开发者
|
28天前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
30 1
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
60 5
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
69 3
|
2月前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
59 3
|
2月前
|
存储 缓存 安全
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
33 2