Map接口 Map<K,V>
一.
1.Map接口有两个泛型,一个是K(key)表示键,一个是V(value)表示值,与Collection不同,Collection接口只有一个泛型Collection<E>
2.Map接口也在java.util包中
3.Map介绍:
是将键映射到值的对象,一个映射不能包含重复的键(K是唯一的),每个键最多只能映射到一个值(意思就是键(K)是唯一的,每个键(K)和值(V)的关系是一一对应的。键(K)和值(V)的泛型可以相同也可以不同
二.
与Collection集合做对比:
1.Collection集合只有一个泛型Collection<E>,而Map集合有两个泛型 Map<K,V>。且K的值不能重复,在Map中每个元素包含两个值(一个键,一个值,且一个键对应一个值),而Collection集合里面只有一个值。
![3465e4442aa034ebf7db9ebe17a7a4d1.png](https://i-blog.csdnimg.cn/blog_migrate/53b99bf49231249e070345a08fc300c8.png)
三.Map接口的常用子类(实现类)
3.1 HashMap<K,V>
HashMap<K,V>的底层是哈希表(数组+链表/红黑树),对比HashSet可知,HashSet只是实现了HashMap里面的K(键),因为键是不能重复存储的所以HashSet不能够存储重复元素
HashMap<K,V>集合是一个无序的集合,所以不可以保证映射的顺序,是不同步的(多线程),意味着速度快
HashMap的子类linkedHashMap(和LinkedHashSet一样的,就是底层多了一个链表记录顺序,所以LinkedHashMap是有序的,HashMap是无序的)
3.1.1 HashMap<K,V>中的常用方法
导包:
import java.util.HashMap;
创建HashMap对象:
HashMap<泛型1,泛型2> 对象名= new HashMap<>();
01:给HashMap对象添加元素
put(K key,V value)方法,这个方法如果K(键)不在HashMap里面存在,就会返回null,并使得,value覆盖null。如果K已经存在,返回的是原本K对应的value值,然后新的value值覆盖原来的value值。
![e9326298c8f6984923a712f879933322.png](https://i-blog.csdnimg.cn/blog_migrate/806542b6c1d1aa007130f28153371e9b.jpeg)
图中可以看到黄玲的年龄的值被覆盖了
02:找K(键)的对应的的value值
get(Object K)方法;返回的是K对应的value的值
![7939a68be488e48f80d92d78b885bfb2.png](https://i-blog.csdnimg.cn/blog_migrate/ff6fbdfaad847d5bc6e4af3ced7104e2.jpeg)
03:通过K把键值对删了(元素)
remove(Object K),删掉对应的K对应的键值对,返回被删除的V(value),若K不存在返回null(也就是说可以通过remove方法判断K存不存在)
傻子不存在所以返回值为null
![ef5f6f49e0264db707903324c79b1961.png](https://i-blog.csdnimg.cn/blog_migrate/8d2bd38d92da69838ef1ffa5640effd4.jpeg)
删除后可以发现黄玲的键值对不在Map集合里了
04:判断K(键)是否存在于对应的HashMap<K,V>中
containKey(Object K);返回boolean值,存在返回ture,不存在返回false
![efc89de0372a8c0d8f5d5b3bb57876f2.png](https://i-blog.csdnimg.cn/blog_migrate/3c1cb6ab1c6fef56373b9b5a9b51535a.jpeg)
05:上面示例的所有代码
import java.util.HashMap;
public class Demo01Map {
public static void main(String[] args) {
demo01();
}
private static void demo01() {
HashMap<String,Integer> hsm=new HashMap<>();//创建map对象,存人物及对应的年龄
hsm.put("黄玲",19);//用put方法添加键值对(map元素)
hsm.put("曹操",22);
hsm.put("典韦",20);
hsm.put("黄玲",18);
Integer hl = hsm.get("黄玲");//通过传入键K获得对应的value,可知黄玲为19
Integer tc = hsm.get("天才");//因为不存在K(天才),所以返回值为null
System.out.println("黄玲的value"+hl);//黄玲的value
System.out.println("天才的value"+tc);//天才的value
System.out.println(hsm);//打印HashMap
System.out.println("==============");
Integer huangling = hsm.remove("黄玲");
Integer shazi = hsm.remove("傻子");
System.out.println("删除黄玲返回的value"+huangling);
System.out.println("删除傻子返回的value"+shazi);
System.out.println("###########################");
boolean bajie = hsm.containsKey("猪八戒");
boolean dianwei = hsm.containsKey("典韦");
System.out.println("有八戒吗?"+bajie);
System.out.println("有典韦吗?"+dianwei);
}
}
四.Map集合遍找值:
4.1 keySet();方法
作用:把Map集合的所有key取出来放到一个Set集合里面
例如一个HashMap集合{典韦=20, 曹操=22, 黄玲=18}
通过keySet方法可以取出典韦,曹操,黄玲三个键
历Map集合其实就是对返回的Set集合进行遍历输出,这里可以使用增强for循环or'迭代器,然后通过get方法获取对应key的value
![25d3642c3b220475c8f28858b3876913.png](https://i-blog.csdnimg.cn/blog_migrate/f856ac18d5ea882301a90c90e35e42fe.jpeg)
import java.util.HashMap;
import java.util.Set;
public class Demo02keySet {
public static void main(String[] args) {
demo02();
}
private static void demo02() {
HashMap<String,Integer> hsm=new HashMap<>();//创建map对象,存人物及对应的年龄
hsm.put("黄玲",19);//用put方法添加键值对(map元素)
hsm.put("曹操",22);
hsm.put("典韦",20);
System.out.println(hsm);//打印Map集合
Set<String> set = hsm.keySet();//通过keySet方法将HashMap集合的所有键返回到一个Set集合里面
System.out.println(set);//打印Set集合
//遍历Map集合其实就是对返回的Set集合进行遍历输出,这里可以使用增强for循环or'迭代器
for (String key:set){
System.out.println(key+hsm.get(key));//通过get方法获取对应key的value
}
}
}
五.LinkedHashMap
LinkedHashMap集合和HashMap的区别在于底层比HashMap多了一个链表,所以LinkedHashMap是有序的(存入的顺序就是取出的顺序),而HashMap是无序的
六.Hashtable集合
在包java.util.Hashtable,实现了Map<K,V>接口,底层也是哈希表,是一个线程安全的集合(单线程),而且速度慢
HashMap是线程不安全的集合(多线程),速度快
Hashtable和别的集合的区别:Hashtable集合不可以存储null(无论是K键还是V值都不可以),其他集合可以,Hashtable已经被取代了,但它的一个子类Properties仍然和活跃,经常使用
六:应用:计算一个字符串的每个字符的出现次数
6.1 输入一个字符串(Scanner方法)
6.2 将字符串以字符的方式存入(toCharArray方法)
其他代码和解释如下图
![b93516ec0b97e39508889ceede967a89.png](https://i-blog.csdnimg.cn/blog_migrate/e463e97ceb04c956337740423c47e2ac.jpeg)
import java.util.HashMap;
import java.util.Scanner;
//value用来存储字符出现的次数
//K键用来存储字符
public class StringText {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("输入字符串");
String s=sc.next();//s接收字符
HashMap<Character,Integer> hm=new HashMap<>();//泛型Character,and Integer
for (char c:s.toCharArray()){//用toCharArray转化s成一个字符数组,遍历
if (hm.containsKey(c)){//如果已经存在了字符c(K键),取出value,更新
Integer value=hm.get(c);//获取c的value值
value++;
hm.put(c,value);//覆盖
}
else {//K不存在,第一次存,更新value为1
hm.put(c,1);
}
}
}
}
希望文章对你认识Map集合有帮助