java集合——Map

  • Post author:
  • Post category:java


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());
}

运行结果:



版权声明:本文为weixin_41933719原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。