Map接口概述:

  现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口

Map接口与Collection接口的区别:

  

  Collection 中的集合,元素是孤立存在的(可以理解为单身),向集合中存储元素采用一个个元素的方式存储。

  Map 中的集合,元素是成对存在的(可以理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的 值。

  Collection 中的集合称为单列集合, Map 中的集合称为双列集合。

  需要注意的是,Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

Map常用子类:

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

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

Map接口中的常用方法

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

    public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。

    public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的 值。

    public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

    public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。

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

 package demosummary.map;

 import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
*
*     public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
*     
* public V remove(Object key) : 把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
*
*     public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
*
*     public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
*/
public class MapMethods {
public static void main(String[] args) {
/**
* public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
*/
//创建map集合
HashMap<String, String> map = new HashMap<>();
//添加元素
map.put("蛮王", "艾希");
map.put("盖伦", "卡特琳娜");
map.put("卡牌", "寡妇");
//打印map集合
System.out.println(map);//{卡牌=寡妇, 蛮王=艾希, 盖伦=卡特琳娜} /**
* public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
*/
String result = map.get("蛮王");
System.out.println(result);//艾希 /**
* public V remove(Object key) : 把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
*/
String result1 = map.remove("蛮王");
System.out.println(result1);//艾希
System.out.println(map);//{卡牌=寡妇, 盖伦=卡特琳娜} /**
* public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
*/
Set<String> set = map.keySet();
System.out.println(set);//[卡牌, 盖伦] /**
* public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
*/
Set<Map.Entry<String, String>> set1 = map.entrySet();
System.out.println(set1);//[卡牌=寡妇, 盖伦=卡特琳娜] }
}

    注意:使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到 集合中;若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

Map集合遍历键找值方式

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

    分析步骤:
      1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()

      2. 遍历键的Set集合,得到每一个键。

      3. 根据键,获取键所对应的值。方法提示: get(K key)

 package demosummary.map;

 import java.util.HashMap;
import java.util.Set; public class MapFor {
/**
* 键找值方式:即通过元素中的键,获取键所对应的值
* 分析步骤:
* 1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
* 2. 遍历键的Set集合,得到每一个键。
* 3. 根据键,获取键所对应的值。方法提示: get(K key)
*/
public static void main(String[] args) {
//创建map集合
HashMap<String, String> map = new HashMap<>();
//添加元素
map.put("蛮王", "艾希");
map.put("德玛", "卡特琳娜");
map.put("卡牌", "寡妇");
//获取键
Set<String> keys = map.keySet();
//遍历键
for (String key : keys) {
//通过键获取值
String s = map.get(key);
System.out.println(s);
/**
* 运行结果
* 寡妇
* 卡特琳娜
* 艾希
*/
}
}
}

Entry键值对对象

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

  方法:

    public K getKey() :获取Entry对象中的键。

    public V getValue() :获取Entry对象中的值。

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

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

  操作步骤与图解:
    1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet() 。

    2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象

    3. 通过键值对(Entry)对象,获取Entry对象中的键与值。  方法提示: getkey() getValue()

 package demosummary.map;

 import java.util.HashMap;
import java.util.Map;
import java.util.Set; public class MapEntry {
public static void main(String[] args) {
//创建map集合
HashMap<String, String> map = new HashMap<>();
//添加元素
map.put("蛮王", "艾希");
map.put("德玛", "卡特琳娜");
map.put("卡牌", "寡妇");
//获取entry对象
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//遍历得到entry对象
for (Map.Entry<String, String> es : entrySet) {
String key = es.getKey();
String value = es.getValue();
System.out.println(key + "的CP是" + value);
/**
* 执行结果
* 卡牌的CP是寡妇
* 德玛的CP是卡特琳娜
* 蛮王的CP是艾希
*/
}
}
}

HashMap存储自定义类型键值

  

 package demosummary.map;

 import java.util.HashMap;
import java.util.Objects;
import java.util.Set; public class MapStudent {
private String name;
private Integer age; public MapStudent() {
} public MapStudent(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MapStudent that = (MapStudent) o;
return Objects.equals(name, that.name) &&
Objects.equals(age, that.age);
} @Override
public int hashCode() {
return Objects.hash(name, age);
} @Override
public String toString() {
return "MapStudent{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} public static void main(String[] args) {
//创建HashMap集合对象
HashMap<MapStudent, String> map = new HashMap<>();
//添加元素
map.put(new MapStudent("A", 20),"北京");
map.put(new MapStudent("B", 21),"上海");
map.put(new MapStudent("C", 22),"深圳");
map.put(new MapStudent("D", 20),"广州");
//获取keySet对象
Set<MapStudent> ms = map.keySet();
//遍历得到的Key
for (MapStudent m : ms) {
String s = map.get(m);
System.out.println(s);
}
/**
* 执行结果
* 广州
* 北京
* 上海
* 深圳
*/
}
}

 LinkedHashMap 

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

 package demosummary.map;

 import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set; public class LinkedMapDemo {
public static void main(String[] args) {
//创建LinkedHashMap集合
LinkedHashMap<String, String> map = new LinkedHashMap<>();
//添加元素
map.put("蛮王", "艾希");
map.put("德玛", "卡特琳娜");
map.put("卡牌", "寡妇");
//获取entrySet对象
Set<Map.Entry<String, String>> me = map.entrySet();
//遍历获取的键
for (Map.Entry<String, String> sse : me) {
System.out.println(sse.getKey()+"=="+sse.getValue());
}
/**
* 执行结果
* 蛮王==艾希
* 德玛==卡特琳娜
* 卡牌==寡妇
*/
}
}

Map接口---Day20的更多相关文章

  1. [Day20]Map接口、可变参数、Collections

    1.Map接口-元素成对存在,每个元素由健与值两部分组成,通过键可以找所对应的值 1.1 Map子类 (1)HashMap<K,V>:存储数据所用的哈希表结构,元素的存取数据顺序不能保证一 ...

  2. java中集合类中Collection接口中的Map接口的常用方法熟悉

    1:Map接口提供了将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.Map接口中同样提供了集合的常用方法. 2:由于Map集合中的元素是通过key,value,进行存储的,要 ...

  3. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  4. Map接口使用注意事项

    1,Map接口对象本身不能直接使用迭代进行输出的.因为map每个位置存放的是一对值. 而iterator每次只能找到一个值.如果一定要迭代输出,可以通过以下步骤.: 但是,Map接口只作为查找使用,输 ...

  5. Map接口,Map.Entry,hashMap类,TreeMap类,WeakHashMap。

    Collection接口之前接触过,每次保存的对象是一个对象,但是在map中保存的是一对对象,是以key->value形式保存的. 定义: public interface Map<K,V ...

  6. List接口、Set接口、Map接口的方法

    一.Collection接口中的方法介绍 int size();返回此Collection中的元素数 boolean isEmpty(); 判断是否为空 boolean containsAll(Col ...

  7. Java集合中Map接口的使用方法

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...

  8. JAVA ,Map接口 ,迭代器Iterator

    1.    Map 接口概述 java.util.Map 接口描述了映射结构, Map 接口允许以键集.值集合或键 - 值映射关系集的形式查看某个映射的内容. Java 自带了各种 Map 类. 这些 ...

  9. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

随机推荐

  1. hdu1801 01翻转 贪心

    题目描述: 对于给出的一个n*m的矩形,它由1和0构成,现在给你一个r*c的矩形空间可以选择,且可以选择无数次(被选中的范围内01翻转),要求问将这个01矩阵全部变成0的最少需要翻多少次,且如果无法实 ...

  2. ubuntu无法连接网络

    一,先说一下VMware软件和linux镜像的版本: VMware Workstation 14 Pro ubuntu-14.04.6-desktop-amd64.iso 二,遇到的问题 在第一次安装 ...

  3. openpose开发(1)官方1.5版本源码编译

    环境 WIN10系统,联想Y7000配置,8G内存 VS2019 cuda10 cudnn10 opencv4.11没有扩展库 显卡 1050TI 用到的库(提前下载好的模型,依赖库,user_cod ...

  4. vmtools的功能

    1.vmtoools是vmware公司的组件 2.vmtools主要安装在Guest OS中 3.在workstation版本中可以是选件安装,但在vsphere中却是必选安装 4.vmtools可以 ...

  5. Bring JavaScript to your Java enterprise with Vert.x

    转自:https://opensource.com/article/18/4/benefits-javascript-vertx If you are a Java programmer, chanc ...

  6. Salesforce 开发整理(三)权限共享

    Salesforce提供对象的访问权限可以通过 安全性控制 → 共享设置,可以查看每个对象在系统内部默认的访问权限 共用读写:对象的记录任何用户都可以进行读写操作 公用只读:对象的记录任何用户都可以查 ...

  7. RedHat linux服务器对外开放指定端口

    为了能够远程访问这台机器上的MySQL,需要开放3306端口: [root@localhost ~]# service iptables status Redirecting to /bin/syst ...

  8. Spring 事物隔离级别,事物传播行为

    Spring 框架中对于事物的管理,主要定义了一下四种属性: 事物的隔离(Isolation)级别 事物的传播行为(Propagation Behavior) 事物的超时时间(TImeout) 是否为 ...

  9. pytest 学习笔记一 入门篇

    前言 之前做自动化测试的时候,用的测试框架为Python自带的unittest框架,随着工作的深入,发现了另外一个框架就是pytest (官方地址文档http://www.pytest.org/en/ ...

  10. c# 创建socket连接辅助类

    using AD.SocketForm.Model; using NLog; using System; using System.Net; using System.Net.Sockets; nam ...