import java.util.*;
import java.util.Set;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args){
Map<String,String>map=new HashMap<>();
//存入map
map.put("1","第一个值");
map.put("2","第二个值");
map.put("3","第三个值");
//通过keySet for-each循环取出map中的value
Set<String>Key=map.keySet();//将map中的key作为Set集合的元素
for(String key:Key){
System.out.println("key="+key+",value:"+map.get(key));
}
}
}
注意:String类型的hashcode和equals已经重写过,如果是自定义对象作为key和value时需要将hashcode和equals重写,否则存入会有重复不符合要求的元素。
通过keySet()遍历获取可以发现,只要我们得到对应的key,再通过map.get(key)就可以直接获得对应value,这就是为什么HashMap以key-value形式存储数据,简单地获得key就可以获得对应的value。
步骤如下:
1.将map中的key单独地作为Set集合的元素。
2.遍历Set集合的key。
3对应的key通过map.get(key)获得对应的value。
//通过Iterator遍历keySet
System.out.println("通过Iterator遍历map中的key");
Iterator<String>it=map.keySet().iterator();//用迭代器遍历map中的key
while(it.hasNext()){
String key= it.next();
System.out.println("key="+key+",value:"+map.get(key));
}
结果:
可以看出Iterator和for-each都是遍历的方式,在这里,通过迭代器的移动,对元素进行判断和取值,步骤如下:
1.用迭代器遍历map中的key。
2.it.hasNext()若返回true,表示接下来还有元素,继续移动。
3.String key= it.next(); 返回迭代器刚刚经过的元素key。
4.通过key获取value,map.get(key)。
//通过for-each遍历entrySet
System.out.println("通过for-each遍历entrySet");
Set<Map.Entry<String,String>>entry= map.entrySet();
for(Map.Entry<String,String> entrys:entry){
System.out.println("key="+entrys.getKey()+",value:"+entrys.getValue());
}
结果:
Map.Entry是Map声明的一个内部接口,定义为Entry
步骤为:
1.将entrySet中的映射Entry放入Set集合,此时集合里是一个个键值对。
2.遍历Set集合。
3.通过entrys.getKey(),和entrys.getValue()获得相应的key-value。
entrySet是Java中key-value的集合,而Entry就是entrySet集合中的一个键值对。
//通过Iterator遍历entrySet
System.out.println("通过Iterator遍历entrySet");
Iterator<Map.Entry<String,String>>it1=map.entrySet().iterator();
while(it1.hasNext()){
Map.Entry<String,String>entry1=it1.next();
System.out.println("key="+entry1.getKey()+",value:"+entry1.getValue());
}
结果:
直接使用Iterator对entrySet()中的映射Entry进行遍历,就可以得到其对应的key和value
步骤:
1.用迭代器遍历entrySet中的映射Entry。
2.it.hasNext()若返回true,表示接下来还有元素,继续移动。
3.Map.Entry
4.通过entry1.getKey()和entry1.getValue()获取key和value
//直接通过for-each遍历Map通过map.value获取值
System.out.println("通过map.value获取值");
for(String v: map.values()){
System.out.println("value:"+v);
}
直接通过map.Values()遍历所有的value,但不能遍历key。
ublic class HashMapExample {
//根据value查key
public static List<String>getValue(Map<String,String>map,String value){
List<String>list=new ArrayList<String>();
Set<Map.Entry<String,String>>set=map.entrySet();//将entrySet集合中的映射Entry放到集合Set中,每一个键值对就是一个元素
for(Map.Entry<String,String>entry:set){
//遍历Set中,也就遍历了所有的key和value
if(entry.getValue().equals(value)) {
//如果Set集合中的值和我们要的值一样时,在集合中添加key值
list.add(entry.getKey());
}
}
return list;
}
public static void main(String[] args){
Map<String,String>map=new HashMap<>();
//存入map
map.put("1","第一个值");
map.put("2","第二个值");
map.put("3","第三个值");
map.put("4","第一个值");
System.out.println(getValue(map,"第一个值"));
}
}
以上我们想通过value,也就是"第一个值“,找到这个value所对应的key,结果如下:
以上结果确实通过value找到了两个key。
map中一个value可以有多个key,但不能有相同的key。
List<String>list=new ArrayList<String>();
for(String key: map.keySet()) {
//直接遍历map中的key
if (map.get(key).equals(value)) {
//通过key获得的value如果和预设的value一致,说明找到了此key,添加到集合中
list.add(key);
}
}
return list;
既然entrySet方法可以通过value获取key,那么通过keySet也是可以的,entrySet是遍历键值对,而keySet直接遍历key,只要替换刚刚的部分代码就可以实现。
结果:
Map<String,String>map=new HashMap<>();
List list1=new ArrayList();//建立List集合
//存入map
map.put("1","第一个值");
map.put("2","第二个值");
map.put("3","第三个值");
map.put("4","第一个值");
// list里为value:key
System.out.println("投进List");
List<String>list=map.entrySet().stream().map(m->String.format("%s:%s",m.getValue(),m.getKey())).collect(Collectors.toList());
for (String s:list){
//遍历list,list里包含了key和value,通过stream方法可以筛选我们所需要的对象。
System.out.println(s);
list1.add(s);
//System.out.println(s);
}
System.out.println(list1);
}
也可以输出成Map形式:value作为key,value:key作为value
Map<String,String>map=new HashMap<>();
List list1=new ArrayList();
//存入map
map.put("1","第一个值");
map.put("2","第二个值");
map.put("3","第三个值");
map.put("4","第一个值");
Map<String,List<String>> map2=map.entrySet().stream().map(m->String.format("%s:%s",m.getValue(),m.getKey())).collect(Collectors.groupingBy(s -> s.split(":")[0]));
System.out.println("投进map");
for (Map.Entry<String,List<String>>e:map2.entrySet()){
System.out.println(e);
}
List常用功能中的stream有几个接口:collect()收集接口,把流转换为集合类(List、Map、Set),filter()过滤方法,返回stream流,熟练使用我们可以得到任意类型的集合。
总结:
无论是通过key获取value,或者通过value获取key,我们都是可以实现的,方法也比较多,我们可以在实际的开发过程中选择合适的方法,如果大家还有什么好的建议可以留言评价,谢谢。