本篇是Collection与Map学习笔记第三篇,主要来总结Map接口及其实现类。

1.Map综述

Map接口用来储存“键值对”。Map接口主要有四个实现类:HashMap、TreeMap、Hashtable、WeakHashMap.

Map的子接口有:AbstractMap、SortedMap、NavigableMap.

AbstractMap是个抽象类,继承了Map大部分接口。

SortedMap除集成Map的接口以外,还可以进行排序。排序利用的方法是比较器(Comparator).所以实现SortedMap的类储存的是有序的键值对。

NavigableMap是SortedMap的子接口,除了可以排序以外,还提供了一系列导航方法:如"获取大于/等于某对象的键值对"、“获取小于/等于某对象的键值对”等等。 

HashMap继承了AbstractMap,但没有实现Navigable接口,存储的是“键值对,但无序”。

TreeMap继承了AbstractMap,还实现Navigable接口,存储的是“键值对,并且有序”。

Hashtable集成了Dictionary,并实现了Map接口。存储的是“键值对,但无序”。与HashMap相比,Hashtable是线程安全的。并且支持通过Enumeration遍历。

WeakHashMap也继承与AbstractMap,与HashMap不同的是WeakHashMap的键是“弱键”。

1.1Map接口的API

clear()    清除对象中所有元素

put(k,v)   将一个键值对加入键值对集合。

putAll(Map<> map>   讲一个键值对集合放入

entrySet()    键值对集合的所有键值对的Set集合

keySet()          键值对集合的key 的Set集合

values()           键值对集合的value集合,返回值类型为Collection

size()               键值对集合的大小

isEmpty()         键值对集合是否为空

get(key)          通过key获得对应的value

remove(key)    删除对应key的键值对

containskey(key)    是否包含key

containsvalue(value)   是否包含value

hashCode()            获得哈希值

equals(Object obj)   判断是否相等

1.2Map.Entry

Map.Entry是Map内部的接口,Map.Entry是键值对。Map的实现类对象,可以通过entrySet()方法获得键值对集合。然后可以利用Map.Entry提供方法获得key/value/重置value等操作。

常用方法有:

getKey()

getValue()

setValue(newvalue)

hashCode()

equals(Object obj)

1.3Map的遍历方式

Map的实现类有三种遍历方法,分别是对键值对集合进行遍历、对键集合进行遍历、对值集合进行遍历。下面以HashMap类对象为例说明

a.对键值对集合进行遍历

 //假设map为HashMap类对象,key类型为String,value类型为Integer

Iterator iter=map.entrySet().iterator();

String key=null;

Integer integ=null;

while(iter.hasNext()){

Map.Entry entry=(Map.Entry)iter.next();

key=entry.getKey();

integ=entry.getValue();

}

b.通过键集合进行遍历

Iterator iter=map.keySet().iterator();

String key=null;

Integer integ=null;

while(iter.hasNext()){

key=iter.next();

integ=map.get(key);

}

c.通过值集合进行遍历

Iterator iter=map.values().iterator();

Integer integ=null;

while(iter.hasNext()){

integ=iter.next();

}

2.HashMap

HashMap继承自AbstractMap,存储的键值对为无序的键值对。

HashMap是最基本Map实现类,具有上文Set接口所属的功能,在此不再赘述。

3.TreeMap

TreeMap继承自AbstractMap/NavigableMap,存储的价值对,且是有序的。

3.1构造函数

a.HashMap()   创建一个空的HashMap对象

b.HashMap(Comparator<> c>   利用某个比较器创建一个HashMap对象

c.HashMap(Map<>  map)          带Map的构造器,其中map是创建的对象的一个子集

d.HashMap<SortedMap<> map)   带SortedMap的构造器,其中map是创建的对象的一个子集

3.2常用方法

a.firstEntry()   lastEntry()  lowerEntry()   higherEntry()   floorEntry()   ceilingEntry()  poolFirstEntry()  poolLastEntry()

上述方法都是通过继承NavigableMap类获得的,都是获得一个键值对,及返回值类型为Map.Entry。

firstEntry()    返回第一个键值对

lastEntry()    返回最后一个键值对

 lowerEntry(k)  返回一个键是小于k的,且是最大的一个键的键值对

higherEntry(k)  返回一个键是大于k的,且是最小的一个键的键值对

floorEntry(k)    返回一个键是小于等于k的,且是最大的一个键的键值对

ceilingEntry(k)    返回一个键是大于等于k的,且是最大的一个键的键值对

poolFirstEntry()   删除并返回第一个键值对

poolLastEntry()   删除并返回最后一个键值对

 b.firstKey()   lastKey()  lowerKey()   higherKey()   floorKey()   ceilingKey() 

这些方法都是用来获取key。方法和a类的获取键值对类似,在此不再赘述。

c.反向函数

descendingMap()  获取一个反向的TreeMap

descendingEntrySet()   获取一个反向的键值对集合

d.集合函数

entrySet()   keySet( )  values()

e.Map接口函数

clear()        size()       put()  putAll()    remove()     get()    containsKey()      containsValue()    isEmpty()

3.3遍历方法

遍历方法为通用遍历方法即:遍历键值对、遍历键、遍历值

4.Hashtable

Hashtable继承自Dictionary,并实现了Map接口,储存的也为键值对,且为无序的。与HashMap不同的是,Hashtable为线程安全的,并且可以通过美居Enumeration遍历。

4.1Hashtable的构造器

Hashtable()     创建一个空的构造器

Hashtable(int initialCapacity)     创建一个初始容量为initialCapacity的构造器

Hashtable(Map<>  map)            利用map创建一个Hashtable对象

4.2常用方法

a.Map方法

clear()      put()    putAll()        isEmpty()         get()        size()       remove()      containsKey()        containsValue() 

b.集合方法

entrySet()      keySet()         values()

c.枚举方法

elements()       keys()

4.3遍历方法

遍历键值对集合、遍历键集合、遍历值集合、遍历键枚举、遍历值枚举

a.遍历键值对集合

String key=null;

Integer integ=null;

Iterator iter=table.entrySet().iterator();

while(iter.hasNext()){

Map.Entry  entry=(Map.Entry)iter.next();

key=entry.getKey();

integ=entry.getValue();

}

 

 

b.遍历键集合

String key=null;

Integer integ=null;

Iterator iter=table.keySet().iterator();

while(iter.hasNext()){

key=inter.next();

integ=hashtable.get(key);

}

c.遍历值集合

Integer integ=null;

Iterator iter=table.valuest().iterator();

while(iter.hasNext()){

integ=iter.next();

}

d.遍历值枚举

Enumeration enum=table.elements();

while(enum.hasMoreElements()){

System.out.println(enum.nextElement();

}

e.遍历键枚举

Enumeration enum=table.keys();

while(enum.hasMoreElements()){

system.out.println(enum.nextElement());

}