一、Map集合:以键(key)-值(value)映射的形式,将数据保存到集合中,键和值保存的是对象的内存地址,键不允许重复,
如果已经存在一个键-值,再插入相同的键,则会覆盖已存在的键的所对应值
二、HashMap的数据结构
1、HashMap集合底层是哈希(散列)表的数据结构
2、哈希表是一个怎么样的数据结构呢?
哈希表是一个数组和单链表的结合体
数组:在查询方面效率很高,增加和删除方面效率很低
单向链表:在随机增加删除方面效率更高
三、map集合常用的方法:
size() | 判断map集合的长度,即键值对的个数,返回值为int型 |
isEmpety() | 判断该集合是否为空,返回值是Boolean类型 |
clear() | 清除map集合中的所有键值对 |
containsKey(Object key) | 判断map集合中是否有该键,返回值类型为Boolean |
containsValue(Object value) | 判断map集合中是否有该值,返回值类型为Boolean |
get(Object key) | 通过get方法,获取键key获取所对应的value值,返回值类型是value(值)的数据类型 |
keySet() | map集合中键是不允许重复的,set集合中元素也是不允许重复的,该方法获取map集合中的所有键,并存入Set集合中,Set集合的类型是键的数据类型 |
entrySet() | 该方法获取map集合中的所有键-值,并存入Set集合中:Set{key1=value1,...,keyn=valuen},Set集合的类型是键和值的数据类型:Set<Map.entry<key的数据类型,value的数据类型>> |
remove(object key) | 从map集合中删除key所对应的键值对 |
values() | 获取map集合中所有的value(值),并放入Collection集合中,集合类型由value的数据类型决定 |
put(key,value) | 往map集合中放入键值对,其中key和value的数据类型,要和map集合定义时的键值类型要一致 |
putall(Object map-b) |
将一个map-p复制到map集合中 |
package daily; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class maptest { public static void main(String[] args) { HashMap<Integer,String> map1 = new HashMap<>();//定义HashMap集合,且HashMap的数据类型是包装类型,或者应用数据类型 HashMap<Integer,String> map2 = new HashMap<>(); map1.put(1,"亚索"); map1.put(1,"快乐风男");//当键已经存在集合中,再插入重复的键时,值会进行覆盖,即快乐风男会覆盖亚索 map1.put(2,"盲僧"); map1.put(3,"石头人"); map2.put(5,"火影劫"); map2.put(6,"诡术妖姬"); map2.put(7,"阿卡丽"); System.out.println(map1.size()); System.out.println(map1.isEmpty()); System.out.println(map1.containsKey(1)); System.out.println(map1.containsValue("快乐风男")); System.out.println(map1.get(2)); System.out.println(map1.keySet()); System.out.println(map1.values()); System.out.println(map1.entrySet()); System.out.println(map1.remove(1));//删除map1中,key为1所对应的键值对 System.out.println(map1.entrySet()); System.out.println(map1.put(4,"英雄联盟")); map1.putAll(map2);//将map2复制到map1中 System.out.println(map1.entrySet()); } } 运行结果: 3 false true true 盲僧 [1, 2, 3] [快乐风男, 盲僧, 石头人] [1=快乐风男, 2=盲僧, 3=石头人] 快乐风男 [2=盲僧, 3=石头人] null [2=盲僧, 3=石头人, 4=英雄联盟, 5=火影劫, 6=诡术妖姬, 7=阿卡丽]
四、Map集合的三种遍历方式:
map集合是数组和链表的结合体,所以不能直接借助Iterator迭代器进行遍历,一般采用两种遍历方式:
package daily; import java.util.*; public class maptest { public static void main(String[] args) { HashMap<Integer,String> map1 = new HashMap<>();//定义HashMap集合,且HashMap的数据类型是包装类型,或者应用数据类型 map1.put(1,"亚索"); map1.put(2,"快乐风男"); map1.put(3,"盲僧"); map1.put(4,"石头人"); map1.put(5,"火影劫"); map1.put(6,"诡术妖姬"); map1.put(7,"阿卡丽"); //方式一:直接通过keySet()方法获取map集合中所有的键,并放入到Set集合中,再通过迭代器Iterator或者foreach循坏进行遍历 Set<Integer> s = map1.keySet();//set集合的类型和键的类型要一致 //a.通过迭代器Iterator进行遍历 Iterator<Integer> i= s.iterator(); while(i.hasNext()) { int j = i.next(); String k=map1.get(j);//通过get()方法,利用键获取值 System.out.println(j+"="+k); } System.out.println(' '); //b.通过foreach循环进行遍历 for(Integer S: s){ String k = map1.get(S); System.out.println(S+"="+k); } System.out.println(' '); //方式二:通过entrySet获取map集合中的所有键值对,并放入到Set集合中,Set集合的类型是Set<Map.Entry<键的数据类型,值得数据类型>>,
再通过foreach循环遍历,这种方式的使用频率比较高,因为获取key-value都是直接从链表的节点对象获取的,适用于数据量比较大的key-value的时候 Set<Map.Entry<Integer,String>> s1 = map1.entrySet(); for (Map.Entry<Integer,String> S:s1) { System.out.println(S); } } } 运行结果: 1=亚索 2=快乐风男 3=盲僧 4=石头人 5=火影劫 6=诡术妖姬 7=阿卡丽 1=亚索 2=快乐风男 3=盲僧 4=石头人 5=火影劫 6=诡术妖姬 7=阿卡丽 1=亚索 2=快乐风男 3=盲僧 4=石头人 5=火影劫 6=诡术妖姬 7=阿卡丽