• 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()方法,否则无效。

    原文地址:https://www.cnblogs.com/alsf/p/6230956.html
  • 相关阅读:
    前导问题word使用技巧解决Word 生成目录时前导符不一致的问题(即通常所谓的目录中省略号大小不一致)
    安装用户debian7安装oracle11g
    字节文件MP3格式音频文件结构解析
    Linux下硬盘分区的最佳方案
    802.1x客户端软件 2.4版破解支持多网卡
    z9jpz.dll、gq0aku0.exe、cms2cmw.sys病毒
    Ghost批处理文件的基本格式
    利用ASP远程注册DLL的方法
    dllhost.exe系统进程介绍
    Unicode 和多字节字符集 (MBCS)
  • 原文地址:https://www.cnblogs.com/jpfss/p/11124715.html
Copyright © 2020-2023  润新知