• Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
  • Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
  • Collection中的集合称为单列集合,Map中的集合称为双列集合。
  • 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

1 Map常用子类

Map常用子类有:

  • HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

  • LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

2 Map接口中的常用方法

Map接口中定义了很多方法,常用的如下:

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
  • boolean containsKey(Object key) 判断集合中是否包含指定的键。
  • public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

代码运行如下:

import java.util.HashMap;
import java.util.Map;public class Demo01Map {public static void main(String[] args) {show01();show02();show03();show04();}private static void show04() {Map<String,Integer> map = new HashMap<>();map.put("赵丽颖",168);map.put("杨颖",165);map.put("林志玲",178);Integer v1 = map.get("杨颖");boolean b1 = map.containsKey("赵丽颖");System.out.println("========show04=========");System.out.println("b1:" + b1);boolean b2 = map.containsKey("赵武");System.out.println("b2:"+b2);}private static void show03() {Map<String,Integer> map = new HashMap<>();map.put("赵丽颖",168);map.put("杨颖",165);map.put("林志玲",178);Integer v1 = map.get("杨颖");System.out.println("=======show03==========");System.out.println("v1:"+v1);Integer v2 = map.get("迪丽热巴");System.out.println("v2: "+v2);}private static void show02() {//创建map集合对象Map<String, Integer> map = new HashMap<>();map.put("赵丽颖",168);map.put("杨颖",165);map.put("林志玲",178);System.out.println("=======show02==========");System.out.println(map);Integer v1 = map.remove("林志玲");System.out.println("v1:"+v1);System.out.println(map);Integer v2 = map.remove("林志颖");System.out.println("v2:"+v2);System.out.println("================");}private static void show01() {Map<String, String> map = new HashMap<>();System.out.println("======show01===========");String v1 = map.put("李晨","范冰冰1");System.out.println("v1:"+v1);System.out.println(map);String v2 = map.put("李晨","范冰冰2");System.out.println("v2:"+v2);System.out.println(map);map.put("冷峰","龙小云");map.put("杨过","小龙女");map.put("尹志平","小龙女");System.out.println(map);}
}

运行结果如图:

3 Map集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值

分析步骤:

  1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示:keyset()
  2. 遍历键的Set集合,得到每一个键。
  3. 根据键,获取键所对应的值。方法提示:get(K key)

遍历图解:

代码运行如下:

package Demo01;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*Map集合的第一种遍历方式:通过键找值的方式Map集合中的方法:Set<K> keySet() 返回此映射中包含的键的 Set 视图。实现步骤:1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中2.遍历set集合,获取Map集合中的每一个key3.通过Map集合中的方法get(key),通过key找到value*/
public class Demo02KeySet {public static void main(String[] args) {//创建Map集合对象Map<String, Integer> map = new HashMap<>();map.put("赵丽颖",168);map.put("杨颖",165);map.put("林志玲",178);//1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中Set<String> set = map.keySet();//2.遍历set集合,获取Map集合中的每一个key//使用迭代器遍历Set集合Iterator<String> it = set.iterator();while (it.hasNext()){String key = it.next();Integer value = map.get(key);//3.通过Map集合中的方法get(key),通过key找到valueSystem.out.println(key +"-->"+value);}System.out.println("=================");//使用增强for遍历Set集合for (String key :set) {Integer value = map.get(key);System.out.println(key+"--->"+value);}System.out.println("===================");for (String key :map.keySet()) { //3.通过Map集合中的方法get(key),通过key找到valueInteger value = map.get(key);System.out.println(key+"-->"+value);}}
}

运行结果如图:

3.1 Entry键值对对象

Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:

  • public K getKey():获取Entry对象中的键。
  • public V getValue():获取Entry对象中的值。

在Map集合中也提供了获取所有Entry对象的方法:

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

4 Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

操作步骤与图解:

  1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()
  2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
  3. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getkey() getValue()


注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

代码运行如下:

package Demo01;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*Map集合遍历的第二种方式:使用Entry对象遍历Map集合中的方法:Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。实现步骤:1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中2.遍历Set集合,获取每一个Entry对象3.使用Entry对象中的方法getKey()和getValue()获取键与值*/
public class Demo03EntrySet {public static void main(String[] args) {//创建Map集合对象Map<String, Integer> map = new HashMap<>();map.put("赵丽颖",168);map.put("杨颖",165);map.put("林志玲",178);//1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中Set<Map.Entry<String,Integer>> set = map.entrySet();//2.遍历Set集合,获取每一个Entry对象//使用迭代器遍历Set集合Iterator<Map.Entry<String , Integer>> it = set.iterator();while(it.hasNext()){Map.Entry<String , Integer> entry = it.next();//3.使用Entry对象中的方法getKey()和getValue()获取键与值String key = entry.getKey();Integer value = entry.getValue();System.out.println(key+"--->"+value);}System.out.println("========================");for (Map.Entry<String, Integer> entry:set){//3.使用Entry对象中的方法getKey()和getValue()获取键与值String key = entry.getKey();Integer value = entry.getValue();System.out.println(key+"-->"+value);}}
}

运行结果如图:

5 HashMap存储自定义类型键值

  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。

  • 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。

代码运行如下:

package Demo02;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*HashMap存储自定义类型键值Map集合保证key是唯一的:作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一*/
public class Demo01HashMapSavePerson {public static void main(String[] args) {show01();show02();}/*HashMap存储自定义类型键值key:String类型String类重写hashCode方法和equals方法,可以保证key唯一value:Person类型value可以重复(同名同年龄的人视为同一个)*/private static void show01() {//创建HashMap集合HashMap<String,Person> map = new HashMap<>();//往集合中添加元素map.put("北京",new Person("张三",18));map.put("上海",new Person("李四",19));map.put("广州",new Person("王五",20));map.put("北京",new Person("赵六",18));//往集合中添加元素Set<String> set = map.keySet();for (String key :set) {Person value = map.get(key);System.out.println(key+"-->"+value);}System.out.println("==================");}/*HashMap存储自定义类型键值key:Person类型Person类就必须重写hashCode方法和equals方法,以保证key唯一value:String类型可以重复*/private static void show02(){//创建HashMap集合HashMap<Person, String> map = new HashMap<>();//往集合中添加元素map.put(new Person("女王",18),"英国");map.put(new Person("秦始皇",18),"秦国");map.put(new Person("普京",38),"俄罗斯");map.put(new Person("女王",18),"毛里求斯");//使用entrySet和增强for遍历Map集合Set<Map.Entry<Person,String >> set = map.entrySet();for (Map.Entry<Person, String> entry:set){Person key = entry.getKey();String value = entry.getValue();System.out.println(key+"===>"+value);}}
}
import java.util.Objects;public class Person {private String name;private  int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

运行结果如图:

5.1 LinkedHashMap

在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构,可以保证有序。

代码运行如下:

package Demo03;import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;/*java.util.LinkedHashMap<K,V> entends HashMap<K,V>Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。底层原理:哈希表+链表(记录元素的顺序)*/
public class Demo02LinkedHashMap {public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put("a","a");map.put("c","c");map.put("b","b");map.put("a","b");System.out.println(map);System.out.println("===================");LinkedHashMap<String, String> linked = new LinkedHashMap<>();linked.put("a","a");linked.put("c","c");linked.put("b","b");linked.put("a","b");System.out.println(linked);System.out.println("===================");LinkedHashMap<String, String> map1 = new LinkedHashMap<String, String>();map1.put("邓超", "孙俪");map1.put("李晨", "范冰冰");map1.put("刘德华", "朱丽倩");Set<Map.Entry<String, String>> entrySet = map1.entrySet();for (Map.Entry<String, String> entry : entrySet) {System.out.println(entry.getKey() + "  " + entry.getValue());}}
}

运行结果如图:

java之Map集合总结相关推荐

  1. 1.6 Java遍历Map集合

    Java遍历Map集合的四种方式 Map 集合的遍历与 List 和 Set 集合不同.Map 有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历.Map 以及实现 Map ...

  2. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  3. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  4. 黑马程序员----------------java基础-----------------Map集合

     ------- <a href="http://www.itheima.com" target="blank">android培训</a ...

  5. JAVA中Map集合的使用举例

    首先创建一个Emp类,再将几个Emp对象添加到Map集合中. Emp的id作为Map的键,并将id为"005"的对象从集合中删除. package com.han;import j ...

  6. [Java基础]Map集合的遍历

    Map集合是Java中非常常用的一个集合,通过Map集合可以实现对数据的快速检索和插入删除等操作:同样对Map集合的遍历也是十分重要的:如果你之前学过C++,那么对于Map的遍历操作可就不能像是C++ ...

  7. java map集合遍历方法,Java的Map集合的三种遍历方法

    集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 1. package com.myTest.MapText; import java.util.Collection; i ...

  8. java akiba,Map集合的遍历(java)

    Map集合通过entrySet 和 keySet都可以使用迭代器 以及for循环拿到key和value: import java.util.HashMap; import java.util.Iter ...

  9. java用map集合实现随机抽奖源码

    import java.util.HashMap; import java.util.Random;//用map实现抽奖 public class demo3 {public static void ...

  10. java基础—Map集合的常见方法操作(java集合八)

    Map集合的常见方法操作 Map集合中的元素取出并打印的三种方式 import java.util.Collection; import java.util.HashMap; import java. ...

最新文章

  1. 用深度学习就不怕买到山寨奢侈品?LeCun投了这样一家公司
  2. 如何摧毁一个 Python 程序员?
  3. Redis集群Twemproxy
  4. python list 去重_Python中对列表list去重
  5. Exploring Micro-frameworks: Spring Boot--转载
  6. MySQL五大约束详解(我有多详细只有我知道小白都能懂哦)
  7. 步步为营VS 2008 + .NET 3.5系列文章索引
  8. pitr 原理_PostgeSQL 数据库备份与恢复实验 (PITR)
  9. 一位程序员从业余项目被收购中所学到的
  10. 2018年单招理科考计算机吗,2018高职单招考试难吗 单招考试的内容
  11. 关于stm32优先级大小的理解
  12. oc语言的优缺点有哪些
  13. html文本框虚线并加上文字,文字边框虚线样式用css怎么写?(示例)
  14. java上传文件怎么设置成777权限_如何修改文件夹777权限
  15. 【计网】(一) 集线器、网桥、交换机、路由器等概念
  16. Web Scraper入门
  17. 学习笔记28(凹凸贴图,法线贴图,位移贴图)
  18. 解决ConstraintLayout两个组件挤压问题
  19. 软件开发实训(720科技)――产品经理能力模型
  20. 绝佳表现电商各类促销活动插画素材|玩转大促购物节

热门文章

  1. 测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法
  2. 亿愿数据库文章中医中药知识宝库阅读器
  3. MEMS传感器的6大种类简介-传感器专题
  4. Dubbo远程传输协议详解
  5. 40了解云计算平台的高可用架构,如 AWS 的多可用区、GCP 的负载均衡器
  6. 一劳永逸批量启动Jar包
  7. 关于博客的论文php,基于php的个人博客系统毕业设计论文
  8. 长程蓝牙温湿度及光照度传感器 , 带四通道开关及指示灯(集成太阳能微能量采集功能)
  9. 用c语言编写打猎小游戏,使用c语言编写简单小游戏.docx
  10. 用最小二乘法来拟合数据