zoukankan      html  css  js  c++  java
  • Map接口使用注意事项

    1,Map接口对象本身不能直接使用迭代进行输出的。因为map每个位置存放的是一对值。

    而iterator每次只能找到一个值。如果一定要迭代输出,可以通过以下步骤。:

    但是,Map接口只作为查找使用,输出操作毕竟属于少数

    package 类集;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    import java.util.WeakHashMap;
    public class test1{
        public static void main(String args[]){
            Map<String,String> map = null; // 声明Map对象,其中key和value的类型为String
            map = new HashMap<String,String>() ;
            map.put("mldn","www.mldn.cn") ;    // 增加内容
            map.put("zhinangtuan","www.zhinangtuan.net.cn") ;    // 增加内容
            map.put("mldnjava","www.mldnjava.cn") ;    // 增加内容
            Set<Map.Entry<String,String>> allSet = null ;
            allSet = map.entrySet() ;
            Iterator<Map.Entry<String,String>> iter = null ;
            iter = allSet.iterator() ;
            while(iter.hasNext()){
                Map.Entry<String,String> me = iter.next() ;
                System.out.println(me.getKey() + " --> " + me.getValue()) ;
            }
        }
    };

    输出结果:

    mldn --> www.mldn.cn
    zhinangtuan --> www.zhinangtuan.net.cn
    mldnjava --> www.mldnjava.cn

    这种输出方式最终还是以collection形式输出,只是以Map.Entry作为内容的操作类型

    Map的key和value的类型也可以用非系统类!

    package 类集;
    import java.util.HashMap;
    import java.util.Map;
    class Person{
        private String name ;
        private int age ;
        public Person(String name,int age){
            this.name = name ;
            this.age = age ;
        }
        public String toString(){
            return "姓名:" + this.name + ";年龄:" + this.age ;
        }
    };
    public class test1{
        public static void main(String args[]){
            Map<String,Person> map = null ;
            map = new HashMap<String,Person>() ;
            map.put("zhangsan",new Person("张三",30));    // 增加内容
            System.out.println(map.get("zhangsan")) ;      //getKey()方法
        }
    };

    输出结果:

    姓名:张三;年龄:30

    但是如果非系统类作为key的类型呢?

    package 类集;
    import java.util.HashMap;
    import java.util.Map;
    class Person{
        private String name ;
        private int age ;
        public Person(String name,int age){
            this.name = name ;
            this.age = age ;
        }
        public String toString(){
            return "姓名:" + this.name + ";年龄:" + this.age ;
        }
    };
    public class test1{
        public static void main(String args[]){
            Map<Person,String> map = null ;
            map = new HashMap<Person,String>() ;
            map.put(new Person("张三",30),"zhangsan");    // 增加内容
            System.out.println(map.get(new Person("张三",30))) ;
        }
    };

    输出结果:

    null

    此时只是将自定义类作为key的时候,返回结果为空。那么为什么作为value的类型时候可以呢?

    对于这种匹配过程,有一个特点,即,对象要一样才可以将内容查询出来

    以上的Put和get方法里面的new Person()匿名方法得到的对象是不一样的

    实例:

    package 类集;
    import java.util.HashMap;
    import java.util.Map;
    class Person{
        private String name ;
        private int age ;
        public Person(String name,int age){
            this.name = name ;
            this.age = age ;
        }
        public String toString(){
            return "姓名:" + this.name + ";年龄:" + this.age ;
        }
    };
    public class test1{
        public static void main(String args[]){
            Map<Person,String> map = null ;
            map = new HashMap<Person,String>() ;
            Person per = new Person("张三",30) ;
            map.put(per,"zhangsan");    // 增加内容
            System.out.println(map.get(per)) ;
        }
    };

    输出结果:

    zhangsan

    可是这不是解决方法的最好,因为不能 将person和per对象带着走,应该像String一样,可以使用匿名对象形式找到内容。

    那么此时需要按照与Set接口中判断重复元素的形式一样,进行方法的覆写

    如果要使用非系统类作为Key,则此类必须覆写Object类的以下两个方法:

    hashCode()

    equals()

    package 类集;
    import java.util.HashMap;
    import java.util.Map;
    class Person{
        private String name ;
        private int age ;
        public Person(String name,int age){
            this.name = name ;
            this.age = age ;
        }
        public String toString(){
            return "姓名:" + this.name + ";年龄:" + this.age ;
        }
        public boolean equals(Object obj){        //覆写equals()
            if(this==obj){
                return true ;
            }
            if(!(obj instanceof Person)){
                return false ;
            }
            Person p = (Person)obj ;
            if(this.name.equals(p.name)&&this.age==p.age){
                return true ;
            }else{
                return false ;
            }
        }
        public int hashCode(){                //覆写hashCode()
            return this.name.hashCode() * this.age ;  //自定义hashCode。
        }
    };
    public class test1{
        public static void main(String args[]){
            Map<Person,String> map = null ;
            map = new HashMap<Person,String>() ;
            map.put(new Person("张三",30),"zhangsan");    // 增加内容
            System.out.println(map.get(new Person("张三",30))) ;
        }
    };

    输出结果:

    zhangsan

    发现此时使用匿名对象能够取出内容。作为对象的时候,实际上是依靠hashCode()和equals()来判断对象是否相等,这一点由系统内部自动完成。

    总结:Map可以使用迭代输出:

          map->entrySet->Set->Iterator->Map.Entry->key和value。

      非系统类作为key,则保证一定要覆写equals()和hashCode()方法,否则无效。

  • 相关阅读:
    (引)spring学习笔记1.什么是控制反转
    Arduino 各种模块篇 步进电机 step motor 舵机 servo 直流电机 总复习
    Raspberry Pi Wireless Adaptor
    Pyramid 使用总结1
    Arduino 各种模块篇 人体红外感应模块 proximity sensor
    Pyramid 使用总结2
    Webcam Streaming Desktop Recording on Linux for ubuntu or its destros
    Arduino 各种模块篇 步进电机 step motor( 不用库,不用shield, 纯)
    Arduino 各种模块篇 motor shield 电机扩展板(舵机、直流电机、步进电机party)
    转载 stepper motors
  • 原文地址:https://www.cnblogs.com/alsf/p/6230956.html
Copyright © 2011-2022 走看看