1.总体介绍
Map接口的常用实现类主要有HashMap和TreeMap,HashMap通过哈希码对其内部的映射关系进行快速查找,而TreeMap中的映射关系存在一定的顺序,如果希望在遍历集合时是有序的,则应该使用由TreeMap类实现的Map集合,否则建议使用由HashMap类实现的Map集合,因为由HashMap类实现的Map集合对于添加和删除映射关系更高效。
Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Map集合中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断。
2. 两种常规Map实现
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
(1)HashMap(): 构建一个空的哈希映射
(2)HashMap(Map m): 构建一个哈希映射,并且添加映像m的所有映射
(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映射
(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映射
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
(1)TreeMap():构建一个空的映射树
(2)TreeMap(Map m): 构建一个映射树,并且添加映射m中所有元素
(3)TreeMap(Comparator c): 构建一个映射树,并且使用特定的比较器对关键字进行排序
(4)TreeMap(SortedMap s): 构建一个映像树,添加映射树s中所有映射,并且使用与有序映像s相同的比较器排序
3.两种常规Map性能
HashMap:适用于在Map中插入、删除和定位元素,时间复杂度O(1)。
Treemap:适用于按自然顺序或自定义顺序遍历键(key),时间复杂度O(log2N)。
4.常用代码
1)声明一个map: Map map = new HashMap();
2)向map中放值,注意:map是key-value的形式存放的.
如:map.put("sa","dd");
3)从map中取值:
String str = map.get("sa").toString();
结果是:str = "dd";
4)遍历一个map,从中取得key和value .
Map m = new HashMap();
for(Object o :map.keySet())
{
map.get(o);
}
5.详细代码参考
1)下面的代码首先创建一个由HashMap类实现的Map集合,并依次向Map集合中添加一个值对象为null和“马先生”的映射;然后分别通过get()和containsKey()方法执行这两个键对象;最后执行一个不存在的键对象。
关键代码如下:
public static void main(String[] args)
{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(220180, null);
map.put(220181, "http://");
System.out.println("get()方法的返回结果:");
System.out.print("------ " + map.get(220180));
System.out.print(" " + map.get(220181));
System.out.println(" " + map.get(220182));
System.out.println("containsKey()方法的返回结果:");
System.out.print("------ " + map.containsKey(220180));
System.out.print(" " + map.containsKey(220181));
System.out.println(" " + map.containsKey(220182));
}
执行上面的代码,在控制台将输出如下信息:
get()方法的返回结果:
------ null http://169it.com null
containsKey()方法的返回结果:
------ true true false
2)参考代码2
import java.util.*;
public class Exp1 {
public static void main(String[] args){
HashMap h1=new HashMap();
Random r1=new Random();
for (int i=0;i<1000;i++){
Integer t=new Integer(r1.nextInt(20));
if (h1.containsKey(t))
((Ctime)h1.get(t)).count++;
else
h1.put(t, new Ctime());
}
System.out.println(h1);
}
}
class Ctime{
int count=1;
public String toString(){
return Integer.toString(count);
}
}