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

时间: 2024-08-27 01:58:54

Map接口使用注意事项的相关文章

Java容器之Map接口

Map 接口: 1. 实现 Map 接口的类是用来存储键-值(key-value)对: 2. Map 接口的实现类有 HashMap 和 TreeMap 等: 3. Map 类中存储的键-值对,通过键来标识,所以键值不能重复. 4. Map 接口的常用方法如下:    4.1 object put(K key, V value):将指定的值与此映射中的指定键关联(可选操作); 4.2 object get(Object key):返回指定键所映射的值: 4.3 object remove(Obj

Java集合之Map接口

Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到 一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap 1)HashMap 基于哈希表(哈希表学习地址)的Map接口实现.允许使用null值和null键,不保证映射的顺序,特 别是不保证顺序恒久不变.它除了非同步和允许使用null外,与Hashtable大致相同. HashMap实现原理: 1.HashMap默认数组大小为16,加载因子为0.75

Java集合中Map接口的使用方法

Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值. Map支持泛型,形式如:Map<K,V> Map中使用put(K key,V value)方法添加 HashMap类 HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现

Map接口及其子类

Map接口操作的是一对对象,即二元偶对象,Map接口中的每个元素都使用"key--value"的形式存储在集合中. SortedMap接口是排序接口,只要是实现了此接口的子类,都属于排序的子类.TreeMap就是此接口的一个子类 Map接口常用的子类: HashMap:无序存放,新的操作类,key不允许重复 Hahtable:无序存放,旧的操作类,key不允许重复 TreeMap:可以排序的Map集合,按集合的key排序,key不允许重复 WeakHashMap:弱引用的Map集合,清

JAVA集合详解(Collection和Map接口)

在Java的util包中有两个所有集合的父接口Collection和Map,它们的父子关系:            java.util        +Collection 这个接口extends自 --java.lang.Iterable接口           +List 接口               -ArrayList 类              -LinkedList 类              -Vector 类     此类是实现同步的 +Queue 接口         

java map接口

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: 1.Map中的键值对以Entry类型的对象实例形式存在: 2.建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值. 3.Map支持泛型,形式如:Map<K,V> 4.map 接口和c# 中的Dictionary相近 一.基本用法 Map<String,String>map=new HashMa

Java集合框架总结(5)——Map接口的使用

Java集合框架总结(5)--Map接口的使用 Map用于保存具有映射关系的数据(key-vlaue).Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false Map中包含了一个keySet()方法,用于返回Map所以key组成的Set集合. Map集合与Set集合元素的存储形式很像,如Set接口下有HashSet.LinkedHashSet.SortedSet(接口).TreeSet.EnumSet等实现类和子接口,而Map接口下则有HashMa

Java中map接口 遍历map

java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接口和类 Collection和Map是Java集合框架的根接口 List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问. Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因). Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value. Map接口 Map

Java从零开始学二十三(集合Map接口)

一.Map接口 Collection.Set.List接口都属于单值的操作,即:每次只能操作一个对象,而Map与它们不同的是,每次操作的是一对对象,即二元偶对象,Map中的每个元素都使用key à value的形式存储在集合之中 二.常用方法 No. 方法或类 类型 描述 1 public void clear() 普通 清空Map集合 2 public boolean containsKey(Object key) 普通 判断指定的key是否存在 3 public boolean contai