Map集合是双列集合,Map中的集合是成对存在的,每个元素由键和值两部分组成,通过键可以找到对应的值。
注意:Map中的集合不能包含重复的键,值可以重复。每个键只能对应一个值。
HashMap<K,V>:存储数据采用哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一,不重复,需要重写键的hashcode()方法,equals()方法。
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,通过下面的源码我们可以看出。存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证键的唯一,不重复。需要重写键的hashcode() 方法,equals()方法。
注意:Map接口中的集合都有两个泛型变量<k,v>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<k,v>的数据类型可以相同,也可以不同。
Map的方法:
put方法:将指定的键与值对应起来,并添加到集合中
1.方法返回值为键所对应的值
使用put方法,若指定的键在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中。
使用put方法时,若指定的键在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键对应的值,替换成指定的新值。
返回結果:
get方法:获取指定键所对应的值
remove方法:根据指定的键删除元素,返回被删除元素的值。
map集合中遍历键找值的方式?
由于集合中的键是唯一的,所以我们通过键来找值。
步骤:
1.获取map集合中所有的键,由于键唯一,所以返回一个set集合存储所有的键
2.遍历键 的set集合,得到每一个键
3.根据键,获取键所对应的值
代码展示:
结果:
在map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象,即键值对对象,这样我们在遍历map集合时,就可以从每个键值对对象中获取对应的键与对应的值。
Map集合遍历键值对方式?
通过集合中每个键值对对象,获取键值对对象中的键与值
步骤:
1.获取Map集合中,所有的键值对对象,以set集合形式返回
2.遍历包含键值对对象的set集合,得到每一个键值对对象
3.通过键值对对象,获取entry对象中的键与值
注意:map集合不能直接使用迭代器或者foreach进行遍历。但是转成set之后就可以使用了
当key中存放的是自定义类型的变量?
// 1,创建hashmap集合对象。
Map<Student, String> map = new HashMap<Student, String>();
// 2,添加元素。
map.put(new Student("lisi", 28), "上海");
map.put(new Student("wangwu", 22), "北京");
map.put(new Student("zhaoliu", 24), "成都");
map.put(new Student("zhouqi", 25), "广州");
map.put(new Student("wangwu", 22), "南京");
// 取出元素,键找值方式
Set<Student> keySet = map.keySet();
for (Student key : keySet) {
String value = map.get(key);
System.out.println(key.toString() + "=" + value);
}
// 取出方式,键值对方式
Set<Entry<Student, String>> entrySet = map.entrySet();
for (Entry<Student, String> entry : entrySet) {
Student key = entry.getKey();
String value = entry.getValue();
System.err.println(key.toString() + "=" + value);
}
当给hashMap中存放自定义对象时,如果自定义对象作为key存在这时要保证对象唯一,必须复写独享的hashcode和equals方法。
如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合存放
LinkedHashMap:
我们知道hashmap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?
在Hashmap中有个子类linkedhashmap,它是链表和哈希表组合的一个数据存储结构。
示例代码:
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("邓超", "孙俪");
map.put("李晨", "范冰冰");
map.put("刘德华", "柳岩");
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
运行结果: