zoukankan      html  css  js  c++  java
  • 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));
            }
        }    
    }

    三个方法结果分别为:

     

     

  • 相关阅读:
    Path类的最全面具体解释
    数据挖掘之分类算法---knn算法(有matlab样例)
    Android View框架的measure机制
    2017年本博客知识体系引导(更新至2017.8.11)
    [DevExpress]DevExpress 中 汉化包 汉化方法
    盗墓笔记第一季全(12集)下载地址
    浅谈spring——注解配置(九)
    git使用系列(一)
    算法与数据结构(一)
    phpstrom 2016.2 注册服务器地址
  • 原文地址:https://www.cnblogs.com/hzhjxx/p/10251023.html
Copyright © 2011-2022 走看看