【JAVA基础】 -- Map常见问题(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qqxyy99/article/details/87869079

问题:

返回的HashMap中key有对应的value值,但取值时结果却为null。

解析-返回结果为何为null?

1. HashMap的key和value均可为null。

2.key所对应的value本身为空或null,则value返回null

3.无法找到key,则value返回null

4.key的类型与Map定义的类型不一致(同3,即找不到这个key),则value返回null

在代码实例中,由于粗心,在map.get(Key)时没有转换key的类型,导致一直返回null。

List<VoteResultDto.VoteItemResult> voteResults = resultMap.get(Long.valueOf(voteIdList.get(i)));

同理:containsKey()方法也如此,resultMap.containsKey(Long.valueOf(voteIdList.get(i)))

问题:

如何判定Map中存在某个Key?

解析-在Map集合中如何判断是否存在某个键(key)?

1.HashMap的key和value均可为null

2.由1并不能明确返回的null时key为null,还是value为null,即key存在的情况下,value也可能为null,key不存在时,必然返回null。

3.所以不能通过map.get()方法来判断是否存在某个key

4.方法一:直接使用java api提供的map.containsKey()。

   方法二:循环遍历,逐个比较。


	public static void main(String[] args) {
		
		Map<String, String> map = Maps.newHashMap();
		map.put("1", "1");
		map.put("2", "2");
		map.put("3", "3");
		map.put("4", "4");
		
		//方法1
		System.out.println(map.containsKey("5"));
		
		//方法2
		Iterator keys = map.keySet().iterator();
		String key;
		while(keys.hasNext()){
			key = (String) keys.next();
			if ("1".equals(key)) {
				System.out.println("存在");
			} 
		}
	}

题外话:

取List中的属性值,分别作为Map的key,value。java8特性

Map<Long, Long> map = votelist.stream().collect(Collectors.toMap(k -> k.getVoteId(), v -> v.getItemId()));

问题:

使用上述方式将List转换成Map时,提示报错:java.lang.IllegalStateException: Duplicate key 2

解析:

在List转换成Map时,由于Map中的key不唯一,即出现了重复的key,导致报错。

原因:需要使用了stream包下Collectors.toMap方法的另一个重载方法的参数,这个参数可以传一个合并的函数解决冲突。

方案如下:Map<Long, Long> map = votelist.stream().collect(Collectors.toMap(k -> k.getVoteId(), v -> v.getItemId(), (oldData,newData)->newData));

猜你喜欢

转载自blog.csdn.net/qqxyy99/article/details/87869079