在Java中,Map是一种用于存储键值对的数据结构。它提供了一种关联数组的实现方式,可以通过键来快速查找和访问对应的值。
Map接口定义了一组操作方法,包括添加、删除、修改、查询等。常用的实现类有HashMap、TreeMap、LinkedHashMap等。
下面是Map的一些基本概念:
键(Key):键是Map中唯一的标识符,用于查找和访问对应的值。键必须是不可变的对象,比如字符串、数字、枚举等。
值(Value):值是与键相关联的对象,可以是任何类型的对象。
映射(Mapping):映射是指将键与值建立关联的过程。每个键只能对应一个值,但一个值可以对应多个键。
Entry:Entry是Map中的一个内部接口,表示一个键值对。每个Entry对象包含一个键和对应的值。
HashMap:HashMap是一种基于哈希表实现的Map,它可以快速查找和访问键值对。HashMap的键和值都可以为null,但由于键的唯一性,只能有一个键为null。HashMap不保证元素的顺序,因此遍历时可能不按照插入顺序输出。
TreeMap:TreeMap是一种基于红黑树实现的有序Map,它可以按照键的自然顺序或指定的比较器顺序来排序。TreeMap不允许键为null,但值可以为null。由于使用了红黑树,TreeMap的插入、删除和查找操作的时间复杂度都是O(logN)。
LinkedHashMap:LinkedHashMap是一种基于哈希表和双向链表实现的有序Map,它保留了插入顺序或访问顺序。LinkedHashMap的性能介于HashMap和TreeMap之间,插入、删除和查找操作的时间复杂度都是O(1)。
Map接口定义:Map接口是一个泛型接口,定义了一组与键值对映射相关的操作。其中,键和值都可以是任何Java对象。Map接口中定义了以下方法:
- put(key, value):将指定的键值对添加到Map中,如果键已经存在,则用新值替换旧值。
- get(key):返回与指定键相关联的值,如果该键不存在,则返回null。
- remove(key):从Map中删除与指定键相关联的键值对。
- containsKey(key):判断Map中是否包含指定的键。
- containsValue(value):判断Map中是否包含指定的值。
- size():返回Map中键值对的数量。
- keySet():返回Map中所有键的Set视图。
- values():返回Map中所有值的Collection视图。
- entrySet():返回Map中所有键值对的Set视图。
-
HashMap实现原理:HashMap是基于哈希表实现的Map,它通过将键的哈希值映射到数组索引上来实现快速查找。具体来说,HashMap内部维护了一个存储键值对的数组table,在插入或查找时,先计算键的哈希值,然后根据哈希值计算出数组索引,最后在该索引位置上进行插入或查找操作。如果多个键的哈希值映射到同一个数组索引上,则会形成一个链表,称为“桶”。
-
HashMap扩容机制:当HashMap中键值对的数量超过了负载因子(默认为0.75)与当前数组长度的乘积时,就需要进行扩容操作。扩容操作会创建一个新的数组,并将原有的键值对重新分配到新数组中,以减少哈希冲突的概率。具体来说,扩容操作会将数组长度扩大一倍,并重新计算每个键的哈希值和数组索引。
-
TreeMap实现原理:TreeMap是基于红黑树实现的Map,它通过将键按照自然顺序或指定的比较器顺序进行排序,从而实现快速查找和遍历。具体来说,TreeMap内部维护了一棵红黑树,每个节点代表一个键值对,根据键的大小关系进行排序。在插入或查找时,通过比较键的大小关系,可以快速定位到目标节点。
-
LinkedHashMap实现原理:LinkedHashMap是基于哈希表和双向链表实现的Map,它继承了HashMap的实现机制,并在此基础上增加了双向链表来维护键值对的顺序。具体来说,在插入时,LinkedHashMap会将新节点插入到双向链表的尾部,并更新哈希表中的指针;在删除时,也会同时删除链表中的节点。
开发时根据业务情况选择合适的MAP类型