黑马程序员_集合(Map)

来源:互联网 发布:java 敏感词检测 编辑:程序博客网 时间:2024/04/29 11:40

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

Map

一、Map集合

Map集合:该集合存储键值对(键值对,就是存在映射关系两个对象,比如A指向BC指向D,知道A就知道B,知道C就知道D),一对一对往里存,而且要保证键的唯一性。

Map集合的结构,看图:

 

二、Map集合的共性方法

1、  添加

V put ( K key , V  value)

void putAll(Map<? extends K , ? extend V>, m)

2、  删除

void clear()

V remove(Object key)

3、  判断

boolean containsValue(Object value)

boolean containsKey(Object key)

boolean isEmpty()

4、  获取

V  get(Object key)

int size()

Collection<V>  values()

注意两个重要方法:entrySet()和keySet()

 

                基于上面共有的方法,看一个注意的点,先看程序:                          map.put("01","zhangsan01");                map.put("01","zhangsan04");

                mapput方法会返回一个value值。看上面程序,当我们添加第一个键值对的时候,会返回null,当添加第二键值对后,会返回zhangsan01。通过这个现象,我可以得出,添加元素,如果添加时,出现相同的键,那么后添加的值会覆盖原有键对应的值,并用返回被覆盖的值。

 

三、Map集合的取出方式

 

方式一:使用keySet方法

keySet方法可以将Map集合中所有的键存入到Set集合中。因为Set集合具有迭代器,所有可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值。

看示例:

Map<String,String> map =new HashMap<String,String>();                     map.put("01","zhangsan01");                map.put("01","zhangsan04");                                                                          System.out.println("containsKey:"+map.containsKey("02"));           System.out.println("remove:"+map.remove("02"));

       Set<String>key = map.keySet();

       Iteratorit = key.iterator();

                while(it.hasNext()) {

                String key = it.next();

                String value = key.get(key);}

 

                方式二:使用entrySet

                entrySet方法的放回类型是Set<Map.Entry<K,V>。这个方式是将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry

看一个示例程序:

                                                                                                                                      Set<Map.Entry<String,String>>entrySet = map.entrySet();

                Iterator<Map.Entry<String,String>>it = key.iterator();

                while(it.hasNext()){

                Map.Entry<String,String>entry= it.next();

                String key = entry.getKey();

                String value = entry.getValue();}

这里,在Map.Entry中,有getKeygetValue方法,用这两个方法就可以取出keyvalue

 

Map.Entry<K,V>的理解:

              首先,entrySet方法是将Map集合中的映射关系取出来了,把这个映射关系视为一个整体,而这个关系就是Map.Entry。每一个映射关系,就是Map.Entry的实例对象。形象的来说,key就是丈夫,value就是妻子,映射关系就是结婚证,结婚证就是Map.Entry类型。

                其次,程序上来说,Map.Entry其实也是一个接口,它是Map接口中的一个内部接口:

                interface Map{

                          public staticInterface Entry{                                                     

                          }

}

最后,子类实现接口:

class HashMap implements Map{

class Hahs implements Map.Entry{

}

}

                                                                                                                                     

那么为什么它是Map中的接口呢,因为Map.Entry代表一种关系,就是说,只有建立的Map的对象,这种关系才会有,所有这就是内部规则,这就符合了之前学习的内部类定义规则。

 

 

 

四、Map的拓展

关于Map的拓展,简单来说就是嵌套。实际例子中,我们用的是一对一,比如String类型对Integer类型,这样的比较好理解,但实际中,好多都是一对一个整体,比如一个学校会对应多个学院,而每个学院里不同学科对应有不同的学生。在程序上来说,就是String类型变量,对应一个Map集合,而这两个整体关系时一个大的Map集合。

TreeMap<String,HashMap<String,Integer>>tm=newTreeMap<String,HashMap<String,Integer>>();

看这个程序,在TreeMap集合中,key是对应String类型,而value对应的是一个HashMap

HashMap中又有键值对,这就是嵌套。

 

 

 

 

 

 

 

总结:

1、  Map集合也是集合中的一种,存储的也是对象。但存储的和Collection集合不同的是,它存储的是键值对,就是以一个键对应一个值,以这种映射关系存储的。而且要保证键的唯一性。

2、  注意Map集合,添加元素是用put方法,这个方法返回的是value。添加元素,如果添加时,出现相同的键,那么后添加的值会覆盖原有键对应的值,并用返回被覆盖的值。remove方法,在移除key锁对应的映射关系的同时,返回时这个key所对应的value

3、  Map集合有三个常用实现类:HashtableHashMapTreeMap。注意比较的是,前两者的区别,Hashtable是早先出现的,不可以存入null键和null值,而且同步;HashMap是后出现的,可以存入null键和null值,是不同的步的。相对来说,后者效率更高。

4、  HashtableHashMapTreeMap的命名上,可以看出存储方式,前两者是按哈希表存储的,后者是按二叉树结构存储的。其他和Set集合中的类似。当我们自定义类时,要注意复写hashCodeequals方法,还有实现Comparable(实现接口compareTo)。

5、  Map集合中没有类似Collection中的迭代器,但有两种方式可以去除元素,整体来说都是转成Set集合。一、keySet方法,把Map集合中的key取出来,放入Set集合,用Set集合中的迭代器取出key,用Mapget方法取出值即可。二、entrySet方法,把Map集合中的映射关系取出,成对的放入Set集合中,注意这个关系时Map.Entry,就是说映射关系时Map.Entry的对象。

6、  Map.Entry实际上是Map集合中的内部接口。

Map集合的拓展,就是不仅限于一对一的映射关系,更多的是一
0 0
原创粉丝点击