Java 2中的Collections框架 -- Map

原创 2004年09月20日 12:47:00

Java 2的Collections框架中,主要包括两个接口及其扩展和实现类:Collection接口和Map接口。两者的区别在于前者存储一组对象,后者则存储一些关键字/值对。

public interface java.util.Map {

    //Altering Methods
      public Object put(Object key, Object value);    
      public Object remove(Object key);              
      public void putAll(java.util.Map);             
      public void clear();   

    //Querying Methods
      public Object get(Object key);           
      public int size();                     
      public boolean isEmpty();                  
      public boolean containsKey(Object);          
      public boolean containsValue(Object);          
      public boolean equals(Object);                 

    //Viewing Methods
      public java.util.Set keySet();                  //Gets keys
      public java.util.Collection values();           //Gets values
      public java.util.Set entrySet();                //Gets mappings

      public static interface java.util.Map.Entry {   //a map-entry (single key/value pair)
         public Object getKey();                    //returns current entry key
         public Object getValue();                  //returns current entry value
        public Object setValue(Object value);      
  public boolean equals(Object);             
  public int hashCode();                         }
}
Map接口提供了方便易用的方法,通过这些方法可以查询、查看、修改当前Map的内容。注意对于Map接口的keySet()方法返回一个Set,Set是Collection接口的一个扩展,包含不重复的一组对象。因为Map中的key是不可重复的,所以得到所有key的keySet()方法返回一个Set对象。Map接口本身还包含了一个Map.Entry接口,一个Map.Entry就是Map中的一个关键字/值对。Map接口中的entrySet()方法就返回了一个集合对象,其中每一个元素都实现了Map.Entry接口。Map接口的get(Object key),put(Object key,Object value),和remove(Object key)方法都有同一个问题。他们的返回类型都是Object,当返回null时,可以猜测为调用那个方法前那个key不存在。但是只有在null不允许作为Map的值时可以这样猜测。所有Map接口的通用实现都允许null作为key或者value,这就说当返回一个null值,就可以意味着很多事情。只是因为通用实现允许null值,你不能下那个映射有null值的结论。如果你确知没有null值,那返回null值就意味着调用那个方法前,映射里并没有那个键。否则,你必须调用containsKey(Object key)来看看那个Key是否存在。

Hashtable


java.util.Hashtable实现了Map接口,在Hashtable中使用key对象的hashCode()作为对应的对象的相对存储地址,以便实现根据关键字快速查找对象的功能。所以只有一个实现了hashCode()和equals()方法的对象才可作为Hashtable的key。null值不能作为关键字或值。
public class java.util.Hashtable extends Dictionary implements Cloneable, Map, Serializable {

     //Hashtable constructors
     //construct a default Hashtable with default capacity and load of 0.75
     public Hashtable();                     
     //construct a Hashtable with passed capacity and default load of 0.75 
     public Hashtable (int initialCapacity); 
     //construct Hashtable with passed capacity and load 
     public Hashtable(int initialCapacity, float load); 
     //construct Hashtable with passed mapping 
     public Hashtable(Map);                  
     
     //Hashtable specific methods
     //checks if Object is in Hashtable 
     public boolean contains(Object);        
     //returns Enumeration of elements in Hashtable 
     public Enumeration elements();          
     //returns Enumeration of keys in hashtable
     public Enumeration keys();              
     //creates shallow copy of Hashtable(structure copied, but not key/values)
     public Object clone();                  
     //prints out key/value pairs of Hashtable elements
     public String toString();               
     //reorganizes all elements in Hashtable, and increases Hashtable capacity 
     protected void rehash();                
     
     //get Value from passed in key 
     public Object get(Object);              
     //insert key/value pair
     public Object put(Object key, Object value);      

}
Hashtable是Java 2集合框架推出之前的一个老的工具类,在新的Java 2集合框架下,已经被HashMap取代。Hashtable和HashMap的区别主要是前者是同步的,后者是快速失败机制保证不会出现多线程并发错误(Fast-Fail)。在初始化一个Hashtable时,可以指定两个参数:初始容量、负荷,这两个参数强烈的影响着Hashtable的性能。容量是指对象的个数,负荷是指散列表中的实际存储的对象个数和容量的比率。如果初始容量太小,那么Hashtable需要不断的扩容并rehash(),而这是很耗时的;如果初始容量太大,又会造成空间的浪费。负荷则相反,负荷太小会造成空间浪费,负荷太大又会耗时(因为这会造成较多的关键字的散列码重复,Hashtable使用一个链接表来存储这些重复散列码的对象)。容量的缺省值是11,负荷的缺省值是0.75,一般情况下你都可以使用缺省值来生成一个Hashtable。另外,在Hashtable中的大部分的方法都是同步的。

HashMap


HashMap基本实现了Map接口的全部方法。方法的签名大家看上面的Map接口。这儿主要说说几个Map接口中的方法。
按照集合框架的实现,哈希表是单链表作为元素的数组,有着同样索引值的两个或更多入口被一起链结到单链表中。哈希表声明如下:
    private Entry[] table;
组件类型Entry是Map.Entry接口的实现,Map.Entry声明于Map接口内。下边是Map.Entry接口的简化实现:
    private static class Entry implements Map.Entry{
        int hashCode;
        Object key;
        Object value;
        Entry next;

        Entry(int hashCode,Object key,Object value,Entry next){
            This.hashCode=hashCode;
            This.key=key;
            This.value=value;
            This.next=next;
}
public Object getKey(){
    return key;
}
public Object getValue(){
    return value;
}
public Object setValue(Object value){
    Object oldValue=this.value;
    This.value=value;
    Return oldValue;
}
}

SortedMapMap接口的子接口,SortedMap的标准实现是TreeMap,实现了一个排序的Map。这儿不再做说明。本站翻译的《Java 规则》(Java Rules)中对Java2的集合框架有深入的研究。本文限于篇幅,只及皮毛。有兴趣的朋友,请参考Java2源码中的集合实现代码和API doc。

常用JAVA集合框架(Collection、List、Set、Map)

1.常用集合框架结构 2. List   2.1 ArrayList List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List ...
  • sdauzxl
  • sdauzxl
  • 2016年07月29日 20:17
  • 1844

Collection接口和Collections类的区别

1.Collection:   是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。   Collection接口时Set接口和List接口的父接口   ...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2016年09月26日 10:34
  • 1853

介绍Collection框架的结构;Collection 和 Collections的区别

集合框架: Collection:List列表,Set集 Map:Hashtable,HashMap,TreeMap   Collection  是单列集合 List   元素是有序的、可重复 有序的...
  • ITzhanghao
  • ITzhanghao
  • 2015年07月13日 17:43
  • 5964

JAVA——集合框架的工具类Collections

Collections:它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。Collections.sort(list);//list集合进行元素的自然顺序排序。Coll...
  • Jungle_hello
  • Jungle_hello
  • 2016年05月15日 21:39
  • 1135

collection类的工具类,collections,二分查找,折半查找,collections的常用方法,MAP的使用,

Collections:collection类的工具类。用来操作collection类 1:Static  int  binarySearch(List  list, Object  key);:二...
  • boss_way
  • boss_way
  • 2017年10月26日 20:59
  • 147

集合框架(Map和Collections)

Map是一种存储键值对的存储容器,而且保证键的唯一性。提供一种以“键”标识“值”的数据存储方式。接口形式为:Map,其中K是此映射所维护的键的类型,V是映射值的类型。其有两个常用子类,HashMap和...
  • Decting
  • Decting
  • 2015年08月18日 13:00
  • 839

【Java】Java中的Collections类——Java中升级版的数据结构

一般来说课本上的数据结构包括数组、单链表、堆栈、树、图。我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组、二维数...
  • yongh701
  • yongh701
  • 2015年01月28日 10:48
  • 1893

Collection,List,Set和Map用法和区别

Collection,List,Set和Map用法和区别 作者:zccst     Java spring MVC框架的调用关系是弄明白了,可是发现后面要走的路还很长,有很多东西对我还是很神秘...
  • an341221
  • an341221
  • 2016年01月14日 08:42
  • 3880

Java集合框架之Map实例解析

1、Map概述1.1 什么是Map Map是将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map 接口提供三种collection 视图,允许以键集(keySet())...
  • qq_28261343
  • qq_28261343
  • 2016年09月22日 23:42
  • 2368

Collections 随机排序方法Shuffle源码说明

import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.R...
  • tanksyg
  • tanksyg
  • 2015年11月19日 14:45
  • 1538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 2中的Collections框架 -- Map
举报原因:
原因补充:

(最多只允许输入30个字)