服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java基础:java的collections框架的理解

在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;
    }
}


sortedmap是map接口的子接口,sortedmap的标准实现是treemap,实现了一个排序的map。
这里翻译的是对《java 规则》(java rules)中对java2的集合框架的研究。
详细可以参考java2源码中的集合实现代码和api doc。


扫描关注微信公众号