黑马程序员Java知识回顾之集合_map

------------------ <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、

<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
1 Map集合与Collection集合的区别:

       1.1Map中一次存储是键值对,称为双列集合。Collection中一次存储是单个元素,称为单列元素;

       1.2Map的存储使用的put方法;Collection的存储使用的是add方法;

       1.3Map的取出,是将Map转成Set,在使用迭代器取出。Collection取出,使用就是迭代器;

1.4如果对象很多,必须使用集合存储,如果元素存在着映射关系,可以优先考虑使用Map存储或

       者用数组,如果没有映射关系,可以使用Collection存储;

2,Map集合的特点:

       Map集合中存储的就是键值对,必须保证键的唯一性。

3,Map常用方法:

       添加:value put ( key , value ) ;返回前一个和key关联的值,如果没有返回null.

               void putAll ( Map<? extends k , ? extends v> m ) ;

       删除:void clear ( ) ;清空Map集合;

               value remove ( key ) ;根据指定的key删除这个键值对。

       判断:boolean containsKey ( key ) ;

               boolean containsValue ( value ) ;

               boolean isEmpty ( ) ;

获取:value get ( key ) ;通过键取值,如果没有该键返回null.可通过返回null,判断是否包含指定键

               int size ( ) ;获取键值对的个数。

                    Set<k> keySet ( ) ;

                    Collection<V> values ( ) ;

                    Set<Map.Entry<K,V>> entrySet ( ) ;

 

4Map常用的子类:

         Hashtable:内部结构是哈希表,同步的,不允许null作为键和值;

                   |--prorerties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。

         HashMap:内部结构是哈希表,不同步,允许null作为键和值;

         TreeMap:内部结构是二叉树,不同步,可以对Map集合中的键进行排序;

       Hashtable类

Hashtable实现了一种哈希表,它是Java早期版本提供的一个存放键/值对的实现类,现在也属于集合框架。但哈希表对象是同步的,即是线程安全的。

任何非null对象都可以作为哈希表的关键字和值。但是要求作为关键字的对象必须实现hashCode()方法和equals()方法,以使对象的比较成为可能。

一个Hashtable实例有两个参数影响它的性能:一个是初始容量(initial capacity),另一个是装填因子(load factor)。

Hashtable的构造方法有:

·          Hashtable() 使用默认的初始容量(11)和默认的装填因子(0.75)创建一个空的哈希表,

·          Hashtable(int initialCapacity) 使用指定的初始容量和默认的装填因子(0.75)创建一个空的哈希表。

·          Hashtable(int initialCapacity,float loadFactor) 使用指定的初始容量和指定的装填因子创建一个空的哈希表。

·          Hashtable(Map<? extends K, ?extends V> t) 使用给定的Map对象创建一个哈希表。

Hashtable类的常用方法有:

·          public V put(K key, V value) 在哈希表中建立指定的键和值的映射,键和值都不能为null。

·          public V get(Object key) 返回哈希表中指定的键所映射的值。

·          public V remove(Object key) 从哈希表中删除由键指定的映射值。

·          public Enumeration<K>keys() 返回键组成的一个Enumeration(枚举)对象。

·          public Enumeration<V>elements() 返回值组成的一个Enumeration(枚举)对象。在返回的对象上使用Enumeration接口的方法可以顺序取出对象。

上面两个方法返回类型都是Enumeration接口类型的对象,该接口中定义了两个方法,如下所示:

·          boolean hasMoreElements() 测试枚举对象中是否还含有元素,如果还含有元素返回true,否则返回false。

·          E nextElement() 如果枚举对象中至少还有一个元素,它返回下一个元素。

下面的代码创建了一个包含数字的哈希表对象,使用数字名作为关键字:

Hashtable numbers = new Hashtable();

numbers.put("one", new Integer(1));

numbers.put("two", new Integer(2));

numbers.put("three", new Integer(3));

要检索其中的数字,可以使用下面代码:

Integer n = (Integer)numbers.get("two");

  if (n != null) {

    System.out.println("two = " + n);

  }

HashMap类与LinkedHashMap类

HashMap类的构造方法有:

·          HashMap() 创建一个空的映射对象,使用缺省的装填因子(0.75)。

·          HashMap(int initialCapacity) 用指定的初始容量和缺省的装填因子(0.75)创建一个映射对象。

·          HashMap(int initialCapacity,float loadFactor) 用指定的初始容量和指定的装填因子创建一个映射对象。

·          HashMap(Map t) 用指定的映射对象创建一个新的映射对象。

下面的程序从命令行输入一组单词,然后产生一个单词频率表,该表中记录每个单词与其出现的次数。

程序Frequency.java

import java.util.*;

 

public class Frequency {

    public static voidmain(String args[]) {

        Map<String,Integer> m = new HashMap<String, Integer>();

        // 由命令行参数初始化单词频率表

        for (String a : args){

            Integer freq =m.get(a);

            m.put(a, (freq == null ? 1 : freq + 1));

        }

       System.out.println(m.size() + " distinct words:");

        System.out.println(m);

    }

}

_____________________________________________________________________________▃

使用下面的命令行运行该程序:

C:\>java Frequency if it is to be it is up to me to delegate

程序运行结果为:

8 distinct words:

{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}

LinkedHashMap是HashMap类的子类,它保持键的顺序与插入的顺序一致。它的构造方法与HashMap的构造方法类似。对程序Frequency.java,如果希望频率表按照单词输入的顺序输出,可以使用LinkedHashMap类创建映射对象。

2. TreeMap类

TreeMap类实现了SortedMap接口,SortedMap接口能保证各项按关键字升序排序。TreeMap类的构造方法如下:

·          TreeMap() 创建根据键的自然顺序排序的空的映射。

·          TreeMap(Comparator c) 根据给定的比较器创建一个空的映射。

·          TreeMap(Map m) 用指定的映射创建一个新的映射,根据键的自然顺序排序。

·          TreeMap(SortedMap m) 在指定的SortedMap对象创建新的TreeMap对象。

对程序Frequency.java的例子,假设希望频率表按字母顺序输出,仅将HashMap改为TreeMap即可。输出结果为:

{be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}

这里,键的顺序是字母顺序输出的。.

Map对象与Hashtable对象的区别如下:

(1)Map提供了集合查看方法而不直接支持通过枚举对象(Enumeration)的迭代。集合查看大大地增强了接口的表达能力;

(2)Map允许通过键、值或键/值对迭代,而Hashtable不支持第三种方法;

(3)Map提供了安全的方法在迭代中删除元素,而Hashtable不支持该功能。

(4)Map修复了Hashtable的一个小缺陷。在Hashtable中有一个contains()方法,当Hashtable包含给定的值,该方法返回true。该方法可能引起混淆,因此Map接口将该方法改为containsValue(),这与另一个方法containsKey()实现了一致。

5.Map中所有元素的获取:

原理:Map中是没有迭代器的,Collection具备迭代器,只要将Map集合转成Set集合,就可以使用迭代器了。之所以转成Set,是因为Map几何具备键唯一性,其实Set集合就来自于Map,Set集合底层其实用的就是Map的方法。

实现:把Map集合转成Set

1 keySet ( )方法:可以将Map集合中的键都取出存放到set集合中,对Set集合进行迭代,同时通过get方法对获取到的键进行值获取。

  Set keySet = map.keySet();

      Iterator it = keySet.iterator();

     while(it.hasNext()) {

         Object key = it.next();

         Object value = map.get(key);

     }

2entrySet()方法。Entry就是Map接口中的内部接口(简直映射关系);为什么要定义在map内部呢?entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。

Set entrySet =map.entrySet();

        Iterator it =entrySet.iterator();

        while(it.hasNext()) {

            Map.Entry  me = (Map.Entry)it.next();

        }

 

 

 

 

 

 

 

 

------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、

<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值