zoukankan      html  css  js  c++  java
  • HashTable与HashMap使用总结

    1.HashTable和HashMap比较

    1)继承的父类不同。

    Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

    public class Hashtable  
    extends Dictionary  
    implements Map, Cloneable, Serializable  
      
    public class HashMap  
    extends AbstractMap  
    implements Map, Cloneable, Serializable  

    2)线程安全性不同。

    Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。

    3)是否提供contains方法

    HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。

    Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

    4)key和value是否允许null值。

    其中key和value都是对象,并且不能包含重复key,但可以包含重复的value。

    Hashtable中,key和value都不允许出现null值。

    HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应 的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

    5)两个遍历方式的内部实现上不同。

    Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

    6)hash值不同。

    哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

    7)内部实现使用的数组初始化和扩容方式不同。

    Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

    HashMap中hash数组的默认大小是16,而且一定是2的指数。

     

    2.HashMap和HashSet

    1、HashSet底层是采用HashMap实现的:

    public HashSet() {  
        map = new HashMap<</span>E,Object>();  
        } 

    2、调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量。

    private static final Object PRESENT = new Object();  
    public boolean add(E e) {  
        return map.put(e, PRESENT)==null;  
        }  
    public boolean remove(Object o) {  
        return map.remove(o)==PRESENT;  
        } 

     

    3.HashMap使用

    1)简要说明

    • public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
    • HashMap继承AbstractMap,实现了Map接口,Map接口定义了所有Map子类必须实现的方法。
    • HashMap的实例有两个参数影响其性能:初始容量和加载因子。初始容量只是哈希表在创建时的容量。加载因子是哈希表再其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作(扩容操作)。

    2)构造方法

    • HashMap()            构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 
    • HashMap(int initialCapacity)      构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。 
    • HashMap(int initialCapacity, float loadFactor)  构造一个带指定初始容量和加载因子的空 HashMap。 
    • HashMap(Map< ? extends K,? extends V > m) 
    • eg:HashMap hm=new HashMap();

    3)hashmap加入元素

    • put(K key, V value)    在此映射中关联指定值与指定键。
    • eg:hm.put(a,b); //插入值为b,key值为a

    4.)hashmap修改元素

    • 插入相同key值得元素即可
    • eg:hm.put(a,c); //修改值为c,key值为a

    5)hashmap取得元素

    • get(key)
    • hm.get(key); //返回值为value

    6)判断Hashmap中是否存在某元素

    • .在HashMap中,null可以作为键,这样的键只有一个(hashtable中不允许);可以有一个或多个键所对应的值为null。
    • 当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断
    7)遍历(entrySet效率高于keySet)
      Map map = new HashMap();
    
      Iterator iter = map.entrySet().iterator();
    
      while (iter.hasNext()) {
    
      Map.Entry entry = (Map.Entry) iter.next();
    
      Object key = entry.getKey();
    
      Object val = entry.getValue();
    
      }   
    Map map = new HashMap();
    
      Iterator iter = map.keySet().iterator();
    
      while (iter.hasNext()) {
    
      Object key = iter.next();
    
      Object val = map.get(key);
    
      }
    
    
    
    
    
  • 相关阅读:
    【简报】一款使用静态图片生成动画的jQuery插件:JZoopraxiscope
    使用jQuery timelinr和animate.css创建超酷的CSS动画时间轴特效
    超酷信息图分享:你属于哪类geek?
    数据库操作优化
    android R.java aapt
    xml sax 解析 & 符号
    sql server2000 完全卸载
    cmd 命令总结
    手动打包 解释
    bat 执行 java jar包
  • 原文地址:https://www.cnblogs.com/wishyouhappy/p/3669143.html
Copyright © 2011-2022 走看看