zoukankan      html  css  js  c++  java
  • 关于HashMap和Hashtable的区别

    Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable。可能你觉得Hashtable很好用,为什么不用呢?这里简单分析他们的区别。

    1.Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

    查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,当然,注释除外。

    2.Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以,但是key只能有一个为空)。

    3,关于两者的遍历方式大同小异,Hashtable仅仅比HashMap多一个elements方法。

    /**a test for Hashtable values can or not be null**/
    public class Test {
        public static void main(String[]args){
            Hashtable<String,String> table=new Hashtable<String,String>();
            table.put("a-key","a-values");
            table.put("b-key","b-values");
            table.put("c-key","c-values");
            //table.put("d-key",null);//java.lang.NullPointerException
            //System.out.print(table);
            /**用values的方式遍历**/
            Collection zzy=table.values();
            Iterator it=zzy.iterator();
            while(it.hasNext()){
                String obj=(String)it.next();
                System.out.println(obj);
            }
            /**用entrySet的方式遍历**/
            Set set = table.entrySet();  
            Iterator its = set.iterator();  
            while (its.hasNext()) {  
            Entry entry = (Entry) its.next();  
            System.out.println(entry.getKey() + " - " + entry.getValue()); 
            }  
        }
    }

    /**a test for HashMap values can or not be null**/
    public class Test1 {
            public static void main(String[]args){
                HashMap<String,String> table=new HashMap<String,String>();
                table.put("a-key","a-values");
                table.put("b-key","b-values");
                table.put("c-key","c-values");
                table.put(null,null);
                table.put("d-key",null);//java.lang.NullPointerException
                //System.out.print(table);
                /**用values的方式遍历**/
                Collection zzy=table.values();
                Iterator it=zzy.iterator();
                while(it.hasNext()){
                    String obj=(String)it.next();
                    System.out.println(obj);
                }
                /**用entrySet的方式遍历**/
                Set set = table.entrySet();  
                Iterator its = set.iterator();  
                while (its.hasNext()) {  
                Entry entry = (Entry) its.next();  
                System.out.println(entry.getKey() + " - " + entry.getValue());  
                  
                }  
            }
    }

    4.HashTable使用Enumeration,HashMap使用Iterator

    以下这两点是从内部实现机制上来进行比较

    5.哈希值的使用不同

    6.Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

  • 相关阅读:
    fitnesse的安装
    elasticsearh 迁移
    网络基础之 二层三层网络通讯
    ansible 基本使用之3 palybook
    ansible-基本使用-2
    ansible 基本使用-1
    k8s 机器搭建之etcd
    http 状态码之3xx
    mysql 主从相关
    redis 主从及哨兵模式
  • 原文地址:https://www.cnblogs.com/41ZZY/p/5360757.html
Copyright © 2011-2022 走看看