基本概念和使用场景
Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有:
- 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢
- 二分查找,时间复杂度为,但搜索前必须要求序列是有序的
上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找可能会在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,这时就需要使用Map和Set这两种适合动态查找的集合容器。
所以map和set是两种用来搜索查找的集合类。
存储模型
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以存储元素的模型会有两种:K-V模型和纯K模型。
- 纯K模型:也就是在一个空间里只存放关键字,不存放与之对应的值,搜索时也只是使用关键字进行搜索。例如:在词典中找一个单词
- K-V模型:既存放关键字Key,同时也存放与之对应的值,在空间中的存储形式是键值对<key,value>的形式,例如:统计一个文件中单词出现的次数—> <单词,次数> <单词,中文含义>。
Map
- Map是一个接口,没有继承Collection;
- Map中存储的是键值对(K-V模型),并且要求K不能重复(V是可以重复的),且K不能为空,否则会抛出异常,但是V可以为空;
- Map中键值对的体现:在Map内部定义Entry(实体)接口,该接口中包含有K,V,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式;
注意: Map.Entry<K,V>并没有提供设置Key的方法 - Map接口包含的方法:
其中,
containKey():时间复杂度:O(logN)
containValue():时间复杂度:O(N) - Map中的Key不能直接修改,value可以直接修改;如果要修改key,只能先将该key删除掉,再重新插入;
- Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap;
- TreeMap或者HashMap的共同点:都存储的是键值对,都实现了Map接口;
- TreeMap或者HashMap的区别:
- 分别用hashmap和treemap实例化map,代码实现:
public static void testTreeMap(){
Map<String,String> m1 = new TreeMap<>();
m1.put("apple","苹果");
m1.put("orange","橘子");
m1.put("peach","桃");
System.out.println(m1.size());
System.out.println(m1);