------------------ <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>、期待与您交流! ----------------------