Map接口

1概述

Map接口下的集合与Collection接口下的集合存储数据的形式不同。

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

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

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

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

 

2 Map接口常用方法

 

说明:

1)有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。

  两个泛型变量<K,V>的数据类型可以相同,也可以不同。

2)put方法,添加。

  若指定的键(key)在集合中没有,则没有这个键对应的值,返回null。

  若有重复的键,那么值会被后添加的覆盖。

  值和键不能都重复。

3)get方法,获取指定键(key)所对应的值(value)。

  若没有指定的键,返回null(不会像set集合里那样报异常) 

例:

import java.util.HashMap;
import java.util.Map;

public class MapTest {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
        //
        map.put("a", "12");
        map.put("b", "1");
        map.put("a", "2");
        
        //
        System.out.println(map.get("a"));
        System.out.println(map.get("b"));
        
        //删除
        String v=map.remove("b");
        System.out.println(v);
        System.out.println(map.get("b"));
    }
}

 

3 Map集合遍历

3.1键找值方式

通过元素中的键,获取键所对应的值

 

 

操作步骤:

1)获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键

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

3)根据键,获取键所对应的值

 

例:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MyTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("a", "12");
        map.put("b", "1");
        map.put("c", "2");

        // 遍历--增强for
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key + ":" + map.get(key));
        }

        System.out.println();

        // 遍历--Iterator
        Set<String> keys2 = map.keySet();
        Iterator<String> it = keys2.iterator();
        while (it.hasNext()) {
            String key = it.next();
            String value = map.get(key);
            System.out.println(key + ":" + value);
        }        
    }
}

 

3.2 Entry键值对对象

Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

 

Map是接口,Entry也是接口

Map.entry“结婚证”对象类型

 

获得对象:

 

 

Entry中的方法:

 

 

遍历例子:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MyTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("a", "12");
        map.put("b", "1");
        map.put("c", "2");

        // Entry遍历--增强for
        Set<Map.Entry<String, String>> entrys = map.entrySet();
        for (Map.Entry<String, String> entry : entrys) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + ":" + value);
        }

        System.out.println();

        // 遍Entry遍历--Iterator
        Iterator<Map.Entry<String, String>> it2 = entrys.iterator();
        while (it2.hasNext()) {
            Map.Entry<String, String> entry = it2.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + ":" + value);
        }
    }
}

 

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

 

4 Map接口中常用集合

4.1HashMap<K,V>

存储数据采用的哈希表结构,元素的存取顺序不能保证一致。

由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

(见HashSet解释)

 

4.2LinkedHashMap<K,V>

LinkedHashMap,存储数据采用的哈希表结构+链表结构。

通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

 

例:HashMap和LinkedHashMap存储自定义类型键值

如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法)

public class Person {
    private String name;
    private int age;
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = 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;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }        
}

 

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class PersonTest {
    public static void main(String[] args) {
        method01();
    }
    
    public static void method01(){
        Map<String,Person> map=new HashMap<String,Person>();
        map.put("java0601", new Person("小红",20));
        map.put("java0601", new Person("小明",21));
        map.put("java0929", new Person("小兰",17));
        map.put("java0929", new Person("小花",30));
        
        Set<String> clas=map.keySet();
        for(String s:clas){
            System.out.println(s+":"+map.get(s));
        }
    }
    
    public static void method02(){
        Map<Person,String> map=new HashMap<Person,String>();
        map.put(new Person("小红",20),"java0601");
        map.put(new Person("小明",21),"java0601");
        map.put(new Person("小兰",17),"java0929");
        map.put(new Person("小花",30),"java0929");
        map.put(new Person("小花",30),"java0929");
        
        Set<Person> clas=map.keySet();
        for(Person s:clas){
            System.out.println(s+":"+map.get(s));
        }
    }
    
    //有序
    public static void method03(){
        Map<Person,String> map=new LinkedHashMap<Person,String>();
        map.put(new Person("小红",20),"java0601");
        map.put(new Person("小明",21),"java0601");
        map.put(new Person("小兰",17),"java0929");
        map.put(new Person("小花",30),"java0929");
        map.put(new Person("小花",30),"java0929");
        
        Set<Person> clas=map.keySet();
        for(Person s:clas){
            System.out.println(s+":"+map.get(s));
        }
    }    
}

 

三个方法结果分别为:

 

 

posted @ 2019-01-10 16:55  后知后觉0107  阅读(153)  评论(0编辑  收藏  举报