Map的实现类

来源:互联网 发布:高分一号数据在哪下载 编辑:程序博客网 时间:2024/05/16 10:32

Map没有继承Collection接口,Map提供key到value的映射,你可以通过键查找值,一个Map不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
方法put(Object key,Object value)添加一个值(想要得到东西)和与”值”相关联的”键”key(使用它来查找)get(Object key),返回与给定键相关联的”值”。
可以用containsKey()和containsValue()测试Map中是否包含某个键或值

Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。Hashtable是同步的。添加数据使用 put(key, value) ,取出数据使用get(key)。
使用 Hashtable 的简单示例如下,将 1 ,2 ,3 放到 Hashtable 中,他们的 key 分别是 ”one” , ”two” , ”three” :

     Hashtable numbers =new  Hashtable();     numbers.put(“one”, new Integer(1));     numbers.put(“two”, new Integer(2));     numbers.put(“three”, new Integer(3));  要取出一个数,比如 2 ,用相应的 key :     Integer n = (Integer)numbers.get(“two”);     System.out.println(“two= ”+ n);

由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode方法和equals方法。
hashCode 方法和 equals 方法继承自根类 Object ,如果你用自定义的类当作 key 的话,要相当小心,按照散列函数的定义,如果两个对象相同,即 obj1.equals(obj2)=true
,则它们的 hashCode 必须相同,但如果两个对象不同,则它们的 hashCode 不一定不同,如果两个不同对象的 hashCode 相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的 hashCode() 方法,能加快哈希表的操作。
如果相同的对象有不同的 hashCode ,对哈希表的操作会出现意想不到的结果(期待的 get 方法返回null ),要避免这种问题,只需要牢记一条:要同时复写 equals 方法和 hashCode 方法,而不要只写其中一个。
HashTable是同步的。

HashMap类
HashMap类和Hashtable类类似,也是基于hash散列表的实现,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。

HashMap和Hashtable的区别
1 HashMap不是线程安全的

HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。

2 HashTable是线程安全。

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差

添加,删除操作

Object put(Object key, Object value): 向集合中加入元素
Object remove(Object key): 删除与KEY相关的元素
void putAll(Map t): 将来自特定映像的所有元素添加给该映像
void clear(): 从映像中删除所有映射

查询操作

Object get(Object key): 获得与关键字key相关的值
Map集合中的键对象不允许重复,也就说,任意两个键对象通过equals()方法比较的结果都是false. 但是可以将任意多个键独享映射到同一个值对象上。
Conllections : 集合实用类
Conllections提供了供JAVA集合实用的静态方法

结论:最常用的是ArrayList,HashSet,HashMap,Array。而且,我们也会发现一个规律,用TreeXXX都是排序的。

注意:
1:Collection没有get()方法来取得某个元素,只能通过iterator()遍历元素
2:Set和Collection拥有一模一样的接口
3:List可以通过get()方法来一次取出一个元素,使用数字来选择一堆对象中的一个,get(0)
4:Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。
5:Map中元素,可以将key序列,value序列单独抽取出来。
使用keySet()抽取key序列,将map中的所有keys生成一个Set。
使用values()抽取value序列,将map中的所有values生成一个Collection。

为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。

参考博客:http://blog.csdn.net/hguisu/article/details/7644395