Map是使用键值对的映射表型数据结构
Map集合需要注意的地方:
- Map也是一个接口,真正使用的时候我们使用它的实现类HashMap来进行操作。
- Map的key(键)不能重复,如果向一个map中同时put进去两个键相同的数据,那么后面的这个key所对应的值会覆盖之前的。
Map的遍历:
遍历Map的key:
遍历key值可以使用for each遍历Map对象的keySet()方法返回的set集合,注意,set集合是不包含重复值的。
如下:
public class Test3 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>(16);
map.put("xiaoMing","game");
map.put("xiaoHong","art");
map.put("xiaoGang","loser");
for (String s : map.keySet()) {
System.out.println(s);
}
}
}
遍历Map集合的key和value:
同时遍历key
和value
可以使用for each
循环遍历Map
对象的entrySet()
集合,它包含每一个key-value
映射:
如下:
public class Test3 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>(16);
map.put("xiaoMing","game");
map.put("xiaoHong","art");
map.put("xiaoGang","loser");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
警告:
遍历Map时,不可假设输出的key是有序的!
Map的equals方法:
我们可以注意到,实际上,当我们在Map中查询一个值的时候,我们传入的key他们可能只是能容相同,但实际上,他们确实不同的对象。比如下面的:
public class Test4 {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>(16);
map.put("数学",99);
map.put("英语",89);
map.put("语文",87);
String english = new String("英语");
System.out.println(map.get(english));
}
}
这里同样我们传入的是内容相同但是对象不同的实体,但是他们都能正确的找到value,这个是因为Map在内部比较的时候,也是使用的eauals方法:,这一点和List
查找元素需要正确覆写equals()
是一样的,即正确使用Map
必须保证:作为key
的对象必须正确覆写equals()
方法。
我们经常使用String
作为key
,因为String
已经正确覆写了equals()
方法。但如果我们放入的key
是一个自己写的类,就必须保证正确覆写了equals()
方法。