Map集合

Map集合是双列集合。

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

我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如:

Map集合与Collection集合的比较:

1.Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储;Map中的聚合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过可以找所对应的值。

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

注意事项:

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

Map集合特点:

1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value);

2.Map集合中的元素,key和value的数据类型可以相同,也可以不同;

3.Map集合中的元素,key是不允许重复的,value是可以重复的;

4.Map集合中的元素,key和value是一一对应的。

Map接口中的常用方法:

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

注意:此处返回的V是该键对应的原先的值,如果以前没有,就返回null,以前有,替换掉,返回被替换前的值。

private static void show01() {
    // 创建Map集合,使用多态
    Map<String,String> map = new HashMap<>();
    String v1 = map.put("0","48"); // null
    String v2 = map.put("A","65"); // null
    String v3 = map.put("a","97"); // null
    String v4 = map.put("0","0");
    
    System.out.println("v1:" + v1); // null
    System.out.println("v4:" + v4); // 48,返回被替换前的值
    System.out.println(map); // {0=0, A=65, a=97},重写了toString方法
    
}

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

注意:key存在,返回被删除的值,key不存在,返回null;

private static void show02() {
    // 创建Map对象,key和value类型可以不同
    Map<String,Integer> map = new HashMap<>();
    map.put("0",48); // null
    map.put("A",65); // null
    map.put("a",97); // null
    // 观察可看到,这是一个无序集合
    System.out.println(map); // {0=48, A=65, a=97}
    Integer v = map.remove("0");
    System.out.println(v); // 48
    System.out.println(map); // {A=65, a=97}

    Integer v2 = map.remove("aaa"); // 找不到不报错,返回空
    // NullPointerException
    int v3 = map.remove("aaa"); // 自动拆箱,但报错
    System.out.println(v3); // null
}

boolean containsKey(Object key):根据指定的键,在Map集合中获取对应的值。

注意:key存在,返回对应的值,key不存在,返回null;

public V get(Object key):把指定的键所对应的键值对查找出来,返回值。

注意:key存在,返回对应值,key不存在,返回null;

private static void show03() {
    // 创建Map对象,key和value类型可以不同
    Map<String,Integer> map = new HashMap<>();
    map.put("0",48); // null
    map.put("A",65); // null
    map.put("a",97); // null
    System.out.println(map); // {0=48, A=65, a=97}
    boolean b = map.containsKey("0");
    Integer v = map.get("0");
    System.out.println(b);  //true
    System.out.println(v); // 48
}

主要用于遍历的方法有

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

这种方式主要是通过键来找值:

public static void main(String[] args) {
    Map<String,Integer> map = new HashMap<>();
    map.put("0",48); // null
    map.put("A",65); // null
    map.put("a",97); // null
    System.out.println(map); // {0=48, A=65, a=97}
    // 1.使用Map集合中的方法keySet,把Mao集合中所有的key取出来,存储到一个Set集合中
    Set<String> keySet = map.keySet(); // {0=48, A=65, a=97}
    // 2.遍历set集合,获取Map集合中的每一个key
    Iterator<String> iterator = keySet.iterator();
    while(iterator.hasNext()){
        System.out.println(map.get(iterator.next()));
    }
    System.out.println("---------------");
    // 或者使用增强for循环
    for (String str:keySet) {
        System.out.println(map.get(str));
    }
}

Entry键值对对象

Map里有一个嵌套类(内部类)Map.Entry<K,V>

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

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

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

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

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

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

public static void main(String[] args) {
    Map<String,Integer> map = new HashMap<>();
    map.put("0",48); // null
    map.put("A",65); // null
    map.put("a",97); // null
    System.out.println(map); // {0=48, A=65, a=97}
    // 1.使用Map集合中的方法entrySet,把Map集合中对各Entry对象取出来,存储到一个Set集合中
    // public Set<Map.Entry<K,V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)
    Set<Map.Entry<String,Integer>> set = map.entrySet();
    // 2.迭代遍历Set集合
    // 注意,泛型是一个内部类对象
    Iterator<Map.Entry<String,Integer>> iterator = set.iterator();
    while(iterator.hasNext()){
        // 获取每一个Entry对象
        Map.Entry<String,Integer> entry = iterator.next();
        System.out.print("键:" + entry.getKey());
        System.out.println(",值:" + entry.getValue());
    }
    System.out.println("-----------------");
    // foreach遍历
    for (Map.Entry<String,Integer> entry : set) {
        System.out.print("键:" + entry.getKey());
        System.out.println(",值:" + entry.getValue());
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值