Map:用于保存具有映射关系的数据,因此Map集合里有两组值:key和value(key不允许重复,同一个Map里任何两个key通过equals方法比较都返回false)(key和value都可以是任何类型的引用数据)
Map接口下有:
HashMap、LinkedHashMap、SortedMap(接口)、TreeMap、EnumMap等子接口和实现类。
Map与List的相同点:元素之间可重复,可以根据索引来查找;
Map与List的不同点:Map索引key不再使用整数值,而是以另一个对象作为索引。——有时,Map称为**“字典”**或关联数组。
一、HashMap实现类
keySet: 把Map集合中所有的key放在一起,它们就组成了一个Set集合(没有顺序,不可重复,可翻译成罐子)——>keySet()方法,输出所有key
Map的遍历:通过遍历key来实现遍历所有的key-value对
【Map的常用方法】:默认map为引用变量
1.根据key删除对应的value
——map.remove(“key1”);
2.清空
——map.clear();
3.获取长度
——map.size();
4.获取一个元素
——map.get(“key2”):可通过key2获取value2
5.取出所有的key
——map.keySet();
6.取出所有的value
——map.values()
5.获取所有元素——遍历
(方法一)迭代器
Set allKeys = map.keySet();
Iterator it = allKeys.iterator();
while(it.hasNext())
{
String key = it.next();
String val = map.get(key);
println(key+"="+val);
}
(方法二)foreach——只要能使用迭代器,就能使用foreach——推荐
for(var key:map.keySet())
{
println(key+map.get(key))
}
————以上可简化为:
map.forEach((key,value) -> System.out.println(key + “–>” + value));
(方法三)entry对象
【实例一】
import java.util.*;
public class MapTest
{
public static void main(String[] args)
{
Map map = new HashMap();//HashMap实现类
//key-value
map.put("你好",10);
map.put("我好",30);
map.put("他好",58);
map.put("大家好",58);//value可重复
//输出Map集合包含的key-value对
System.out.println(map);
//用新的value覆盖原有的value,则put()方法会返回被覆盖的value
System.out.println(map.put("你好",90));//输出10
//判断是否包含指定的key或value
System.out.println("是否包含值为:他好 的key?"+ map.containsKey("他好"));
System.out.println("是否包含值为:58 的value?"+ map.containsValue(58));
//通过foreach循环遍历出所有key。只能通过遍历key来实现遍历key-value对
//而一般的对象可以直接遍历对象本身,如:for(var a: apple)
for(var key:map.keySet())//keySet方法:返回Map中所有key组成的set集合
{
System.out.println(key +"——>"+map.get(key));
//get(key)用于返回指定key所对应的value
}
//根据key来删除key-value对
map.remove("大家好");
System.out.println(map);
}
}
【实例二】
使用泛型定义Map
import java.util.*;
public class MapDemo1
{
public static void main(String[] args)
{
Map<String,Object> map = new HashMap<>();
//泛型,菱形语法,限制Map里的key必须为String类型,value必须为Object类型
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");
map.put("key5","value5");
System.out.println(map);
System.out.println(map.keySet());
System.out.println(map.values());
//直接定义变量遵循如下形式:
Set<String> set = map.keySet();
System.out.println(set);
Collection<Object> values = map.values();
System.out.println(values);
//删除功能
//1、根据key来删除value
map.remove("key1");
System.out.println(map);
//获取元素
System.out.println(map.get("key2"));
//foreach遍历
for(var key:map.keySet())//keySet方法:返回Map中所有key组成的set集合
{
System.out.println(key +"——>"+map.get(key));
//get(key)用于返回指定key所对应的value
}
//通过迭代器遍历
//取出所有key
Set<String> allKeys = map.keySet();
Iterator<String> it = allKeys.iterator();
while(it.hasNext())
{
String key = it.next();
Object val = map.get(key);
System.out.println(key+"="+val);
}
}
}
二、LinkedHashMap实现类
是HashMap的一个子类,使用双向链表来维护key-value对的顺序。
功能:LinkedHashMap可以记住key-value的添加顺序,遍历时会按照顺序输出。
而HashMap无法记住顺序,是把key放在一个Set集合中。
import java.util.*;
public class LinkedHashMapTest
{
public static void main(String[] args)
{
var scores = new LinkedHashMap();
var s = new HashMap();
scores.put("语文",80);
scores.put("数学",90);
scores.put("英语",60);
s.put("语文",80);
s.put("数学",90);
s.put("英语",60);
//遍历方法一:通过forEach()方法遍历scores里的所有key-value对
System.out.println("LinkedHashMap:");
scores.forEach((key,value) -> System.out.println(key + "-->" + value));
System.out.println("HashMap:");
s.forEach((key,value) -> System.out.println(key + "-->" + value));
//遍历方法二:通过foreach
System.out.println("第二种遍历方法:");
System.out.println("LinkedHashMap:");
for(var key:scores.keySet())//keySet方法:返回Map中所有key组成的set集合
{
System.out.println(key +"——>"+scores.get(key));
//get(key)用于返回指定key所对应的value
}
System.out.println("HashMap:");
for(var key:s.keySet())//keySet方法:返回Map中所有key组成的set集合
{
System.out.println(key +"——>"+s.get(key));
//get(key)用于返回指定key所对应的value
}
}
}