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);
    
      }
    
    
    
    
    
  • 相关阅读:
    centos crash debug
    go get Unknown SSL protocol error in connection to gopkg.in
    Tensorflow serving with Kubernetes
    Spring 集成 Swagger UI
    Docker Registry V2 Garbage Collection
    Docker Registry V2 with Nginx
    Zabbix磁盘性能监控
    Zabbix CPU utilization监控参数
    Windows挂载Gluster复制卷
    Redis持久化存储(三)
  • 原文地址:https://www.cnblogs.com/wishyouhappy/p/3669143.html
Copyright © 2011-2022 走看看