一、Map的说明
Map没有像List、Queue、Set一样继承Collection,它是独立于它们存在的。
Map是一个接口类,实现的类有HashMap和TreeMap。
Map在现实生活中对什么进行抽象的呢?--------姓名--个人资料,就是key-value,
但还是以key为准。
二、Map的常用方法说明
1.Map.Entry<k,v>的说明
1.关于Map.Entry<k,v>,他其实是Map内部实现的用来存放<key,value>键值对映射关系的内部类,所以调用的时候才采用Map.Entry方式进行调用;
2.该内部类里边还提供了<key,value>的获取,value的设置以及key的比较方式:方框里的三个方法比较重要
注意:Map.Entry<K,V>中没有提供设置Key的方法----------------那是因为再HashMap在排序比较的时候,就像一棵搜索二叉树,其key是唯一不变的,key的改变会影响树的结构,所以不能key不能改变。
2.常用方法
方法 | 解释 |
---|---|
V get(Object key) | 返回key所对应的value |
V getOrDefault(Object key,V defaultValue) | 返回key对应的value,key不存在,则返回默认设置(jdk1.8以后才有的) |
V put(K key,V value) | 设置key对应的value |
V remove(Object key) | 删除key对应的映射关系 |
Set keySet() | 返回所有key的不重复的集合 |
Collection values() | 返回所有value的可重复集合 |
Set<Map.Entry<K,V>> entrySet() | 返回所有的key-value的映射关系 |
boolean containsKey | 返回是否包含key |
boolean containsValue(Object value) | 判断是否包含value |
3.TreeMap和HashMap的区别
TreeMap | HashMap |
---|---|
底层结构为红黑树 | 底层结构为哈希桶 |
插入/删除/查找时间复杂度O(log(n)) | O(1) |
关于key有序 | 无序 |
线程不安全 | 线程不安全 |
插入/删除/查找时:需要进行元素的比较 | 通过哈希函数计算哈希地址 |
应用场景:需要ley有序的场景下 | key是否有序不关心,而是需要更高的时间性能 |
4.注意的一些小概念
(1)Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap;
(2)Map中存放键值对的key是唯一的,value是可以重复的;
(3)在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空;
(4)Map中的key可以完全分离出来,存储到Set中来进行访问(因为key不能重复);
(5)Map中的value可以完全分离出来,存储在Collection的任何一个子集中(value可能有重复);
(6)Map键值对中的key不能直接修改,value可以修改,如果要修改key,只能先将key删除掉,然后再来进行重新插入。
5.代码
主要就是对Map的一些方法进行调用,具体的是如何调用的以及要注意的一些问题进行了补充:代码如下
import java.util.Map;
import java.util.TreeMap;
public class Map1 {
public static void main(String[] args) {
Map<String,String> m=new TreeMap<>();
//put(key,value):插入key-value的键值对
m.put("林冲","豹子头");
m.put("鲁智深","花和尚");
m.put("武松","行者");
m.put("宋江","及时雨");
String str=m.put("李逵","黑旋风");
System.out.println(m.size());
System.out.println(m);
//put(key,value):注意key不能为空,但是value可以为空,key如果为空,会抛空指针异常
str=m.put("无名",null);
System.out.println(m.size());
//如果key存在,put(key,value)则会替换掉原来的value,返回旧的value
str=m.put("李逵","铁牛");
//get(key),返回key所对应的value
//如果key存在,则返回key对应的value,如果key不存在,则返回null
System.out.println(m.get("鲁智深"));
System.out.println(m.get("史进"));
//containKey(key):检查key是否包含在Map中,时间复杂度O(log(n))
//按照红黑树的主性质进行查找
//找到返回true,找不到,则返回false
System.out.println(m.containsKey("林冲"));
System.out.println(m.containsKey("史进"));
//containValue(value):检测value是否包含在Map中,时间复杂度O(n)
//因为TreeMap是按照key进行组织的,因此查找value时候就需要整体遍历
//找到返回true,找不到返回false
System.out.println(m.containsValue("豹子头"));
System.out.println(m.containsValue("九纹龙"));
//打印所有的key
for(String s:m.keySet()){
System.out.println(s+" ");
}
System.out.println();
//打印所有的value
for(String s:m.values()){
System.out.println(s+" ");
}
System.out.println();
//打印所有的键值对
//entrySet():将Map中的键值对放在Set中返回了
for(Map.Entry<String,String> entry:m.entrySet()){
System.out.println(entry.getKey()+"---->"+entry.getValue());
}
System.out.println();
三、总结
1.了解了Map这个概念,知道了可以用Map存取对象之间的映射,做题的时候,例如:找出现次数最多的单词,<次数,单词>就可以使用TreeMap来进行求解,凡是有关两个属性,并且之间是一对一关系的就可以使用Map;
2.要熟知Map的一些常用方法,做题的时候会更加方便的。