Map接口及其实现类

      Map接口,是和Collection接口并列的一个接口,它其实是一个有着映射关系的集合"key-value(也可以叫entry)"(就像数学中的函数一样),由于key存储时用的是set来存储,所以key是不可重复的,而value是用Collection存储的,它是可重复的,整个的key-value是用set来存放的,即一个key有唯一一个对应的value(就像y = k(x)一样),所以它也是不可重复的。
     Map接口中具体有以下几个实现类:
1、 HashMap(Map接口的主要实现类,允许key与value的值都为null)
2、LinkedHashMap
3、TreeMap
4、Hashtable
 一、下面具体来说说Map的主要实现类HashMap:
     其实HashMap中的的很多方法都和Collection很是类似,具体的方法如下:
①Object  put(Object key, Object value); //向当前集合中添加一个key-value对,若当前集合已存在相同的key值时则覆盖
Object  get(Object key); //根据对应的key值返回其对应的value值
③boolean  containsKey(Object key); //判断对应key值的key-value是否存在于当前集合中
④boolean  containsValue(Object value); //判断对应value值的key-value是否存在与当前集合中
⑤int  size();  //返回当前集合中的元素个数
⑥void  clear();  //清空当前集合   
⑦Object  remove(Object key); //移除对应key值的key-value对,并返回value的值;
⑧boolean  isEmpty();  //判断当前集合是否为空
⑨void putAll(Map m); //将一个Map集合m中的所有entry对全部填入当前集合中去
equals(Map e); //判断两个Map集合是否完全相同
下面说一个注意事项
import  java.util.HashMap;
import  java.util.Map;

import  org.junit.Test;

public  class  TestHashMap {
@Test
         public  void  HashMapTest1(){
       Map  A  =  new  HashMap ();
         A .put( "A"  , 123);
         A .put( "C"  , 321);
         A .put( "R"  , 345);
         A .put( "F"  , 123);
         A .put( new  Woman( "美女" ,18), 456);
         A .put( new  Woman( "美女" ,18), 654);
       System.  out .println( A  );
}
class  Woman{
         private  String  name  ;
         private  int  age  ;
         public  Woman() {
                super ();
       }
         public  Woman(String  name  ,  int  age ) {
                super ();
                this . name  =  name  ;
                this . 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 ;
              Woman  other  = (Woman)  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 ;
       }
         @Override
         public  String toString() {
                return  "Woman [name="  +  name  +  ", age="  +  age  +  "]"  ;
       }      
}
}// {A=123, R=345, C=321, F=123, Woman [name=美女, age=18]=654}
     在上面的例子我们可以看到,在我存入集合A中的时候有几个key值重复和value重复的对象,在我们向HashMap中添加一个元素时,会先调用存入对象所属类的equals方法去判断当前集合中是否有key值与该元素相同,若存在,则后来的元素会覆盖前面的元素,因此被当做key值存入对象所属类必须重写equals()方法和HashCode()方法(具体重写方法请参考我的其他文章),而values只需要重写equals(Object e)方法;而当存入key值不同,但value相同的entry时,HashMap是允许我们这样做的
          下面我们来谈谈Map的遍历方法
      虽然Map接口是和Collection并行的一个接口,但是它的遍历方法与Collection接口截然不同,因为在Map中存的都是一个个的entry,也就是说它是成对存在的,所以遍历时就不会显得像Collection那么容易了,具体的遍历方法有以下几个:
          ①Set keySet()  用于遍历key值,与values()的遍历结果一一对应
          ②Collection values()  用于遍历value值
          ③Set entrySet()  用于遍历每一个entry
具体遍历实现如下:
          ①遍历key集(承接上一个例子)
           Set  set  =  A  .keySet();
         //遍历key集
         for (Object  each  : set  ){
       System.  out .println( each  );
       }
          ②遍历value
              Collection  col  = A  .values();
         //遍历value集
         for (Object  each  : col  )
       {
              System.  out .println( each  );
       }
          ③遍历key-value集
                //方法一  利用Map的get(Object key)方法
         for (Object  each  : set  )
       {
          System.  out .println( each  + "--->"  + A  .get( each  ));
       }
          //方法二  利用entrySet()方法遍历
       Set  set1  =  A  .entrySet();
         for (Object  each  : set1  )
       {
          Map.Entry  obj  = (Map.Entry) each  ;
              System.  out .println( obj  );
       }
二、关于LinkedHashmap
     其实LinkedHashmap与HashMap的不同之处就在于LinkedHashMap使用了链表进行添加和插入的维护,也就是说在遍历的时候是按照添加顺序遍历的,但在存储的时候依旧按照Set存储一样是无序的
三、关于TreeMap
     TreeMap与TreeSet类似,他有以下特点:
          ①存入TreeMap的Key必须是同一类型的
          ②可以按照key的属性进行自然排序和定制排序,和TreeSet一样,TreeMap要求存入的key值所在的自定义类要么实现Comparable接口中的colpareTo(Object e)方法并重写(自然排序),要么自定义类中实现Comparator接口中的compare(Object e1,Object e2)并重写,具体重写方法可以参考: http://blog.csdn.net/qq_38785658/article/details/72512652
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值