集合中的Map接口
最最最重要的一件事就是不要害怕去学习Map接口,在这之前,我也一样,就是那种一看就会,一做就费,所以耐心的看完它,然后动手实践一下,你就会获得很多哦!
今天们来聊一聊关于Map集合的那些事儿,我们在平时的学习中用于保存数据使用更多的是数组,因为他简单,但是随着学习的持续推进你就会发现我们需要存储的数据越来越多,所以数组我们就发现了数组的很多缺点:
- 数组长度固定不变,不能很好的适应元素数量动态变化的情况
- 可以通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数
- 数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较
所以为了解决这个问题又产生了集合这个概念, 集合他比数组更加灵活,更加实用,而大大提高软件的开发效率,并且不同的集合可以应用于不同的应用场合,如果你想尝试讲一个数组转换为一个集合,可以点这里哦数组和集合的相互转换
接下来我们先来聊一聊关于Map集合的故事。
Map接口存储一组成对的键(key)-值(value)对象,提供key到value的映射,通过key来检索,Map接口中的key不要求有序,不允许重复,value同样不要求有序,但允许重复,这是一个Map接口的框架,你先瞅一瞅
一:Map接口框架
二:Map接口的常用实现类
-
HashMap<K,V>
:底层采用的"哈希表"结构,元素的 "存取无序" (HashSet的底层其实是借助了HashMap实现存储) 要保证键的 "唯一、不重复" , "需要重写键的hashCode()方法、equals()方法"
-
TreeMap<K,V>
:TreeMap集合底层的数据结构是"红黑树":可以对元素的键进行排序 排序方式有两种:"自然排序","比较器排序"(键的排序规则与TreeSet一样)
三:Map接口的常用方法。
方法 | 说明 |
---|---|
Object put(Object key,Object value) | 将互相关联的一个key与一个value访放入该集合,如果Map接口中已经包含了key对应的value,则旧值将被替换 |
Object remove(Object key) | 从当前集合中移除与指定key 相关的映射,并返回该key关联的旧value,如果key没有任何关联,则返回null |
Object get(Object key) | 获得与key相关的value,如果该key不关联任何非null值,则返回null |
boolean containskey(Object key) | 判断集合中是否存在key |
boolean containsValue(Object value) | 判断集合中是否存在value |
boolean isEmpty() | 判断集合是否为空 |
void clear() | 清除集合中所有元素 |
int size() | 返回集合中元素的数量 |
Set keySet() | 获取所有key的集合 |
Set entrySet | 获取键集,每个键仅会遍历一次,不保证按顺序遍历 |
四:常用方法的使用
(1) Object put(Object key,Object value)
将互相关联的一个key与一个value访放入该集合,如果Map接口中已经包含了key对应的value,则旧值将被替换
private static void Test() {
HashMap<Integer, String> hm=new HashMap<Integer, String>();
//使用put()方法向集合中添加键值对
hm.put(121, "卤蛋");
hm.put(122, "貂蝉");
hm.put(123, "赵云");
hm.put(124, "张飞");
System.out.println(hm);
// {121=卤蛋, 122=貂蝉, 123=赵云, 124=张飞}
}
hm.put(121, "凯爹");
System.out.println(hm);
// {121=凯爹, 122=貂蝉, 123=赵云, 124=张飞}
//在这里我们可以看到,如果再次添加元素的键重复了,他就会覆盖之前key相对应的值,卤蛋->凯爹
/* Map添加元素的特点:
1.键不允许重复,添加时如果键相同,值会替换,键不变
2.值可以重复
*/
注意啦:下面的方式举例是在这个基础上实现的,因为这样就不需要每次添加元素了
(2) Object get(Object key)
获得与key相关的value,如果该key不关联任何非null值,则返回null
//V get(Object key):根据指定的键,在Map集合中获取对应的值
String nameOne=hm.get(122);
String nameTwo=hm.get(155);
System.out.println("key为122所对应的值是"+nameOne);
System.out.println("key为155所对应的值是"+nameTwo);
//获取元素,由键得值,如果存在就输出key所对应的值,如果不存在就输出null
(3)Object remove(Object key)
从当前集合中移除与指定key 相关的映射,并返回该key关联的旧value,如果key没有任何关联,则返回null
//V remove(Object key):根据键删除键值对元素,返回被删元素的值,没有返回null
String nameOne=hm.remove(124);
String nameTwo=hm.remove(166);
System.out.println("根据key为124删除的元素是"+nameOne);
System.out.println("根据key为166删除的元素是"+nameTwo);
(4) boolean containskey(Object key)
判断集合中是否存在key
//boolean containskey(Object key) ,判断集合中是否包含指定的键,有返回true,没有返回false
boolean existOne=hm.containsKey(123);
System.out.println("key为123存在吗?"+existOne);
boolean existTwo=hm.containsKey(89);
System.out.println("key为89存在吗?"+existTwo);
(5)boolean containsValue(Object Value)
判断集合中是否存在value
他与上一个方式是一样的,一个查询是否存在键,一个查询是否存在值,大家可以参考上一个例子
(6)boolean isEmpty()
判断集合是否为空
//判断集合是否为空,为空输出true,不为空输出true
System.out.println(hm.isEmpty());
(7)void clear()
清除集合中所有元素
hm.clear();
System.out.println(hm);
//结果:
//{}
(8) int size()
返回集合中元素的数量
int size=hm.size();
System.out.println(size);
//结果
//4
遍历集合的两种方式
方式一:
(9) Set keySet()
获取所有key的集合
//建立一个key的集合
Set<Integer> keySet=hm.keySet();
//根据遍历每一个key,然后get()到每一个键所对应的值
for (Integer key : keySet) {
//获取每个键对应的值
String value=hm.get(key);
System.out.println(key+":"+value);
}
方式二:
(9) Set entrySet
获取键集,每个键仅会遍历一次,不保证按顺序遍历
//1.获取键值对的集合,(Entry集合)
/*
Set<> : Set集合
Map.Entry<String, String>:集合的元素
String,String :键和值的类型
*/
Set<Map.Entry<Integer, String>> entrySet=hm.entrySet();
//增强for循环:for(数据类型 每个元素:元素的集合){}
for (Entry<Integer, String> entry : entrySet) {
//获取每个entry对象的键
Integer key=entry.getKey();
//获取每个entry对象的值
String value=entry.getValue();
System.out.println("键:"+key+","+"值:"+value);
}
集合的功能很强大,方法也很多,所以他的使用用途很多,大家记得多多去练习哦,工欲善其事,必先利其器。今天的知识就分享到这儿了,有啥问题记得私信我哦!
今天是持续写作的第 4 / 200 天。可以点赞、评论、收藏啦。