hashmap与hashtable最大的不同在于前者是线程不安全的,而后者是线程安全的。
问题是我们为什么要让一个线程不安全的代替线程安全的呢?他们第二个不同在于前者key和value都可以插入null,而后者不行。这个是书面上说的。
Map hashtable = new Hashtable();
hashtable.put(null, null);
但是我像上面这么写也没报错啊?

解决方案 »

  1.   

    还有 Hashtable比HashMap效率稍低一点, 毕竟线程安全(同步)是有代价的
      

  2.   

    速度、效率API确实写着不可以,如果LZ试了可以的话,可能jre版本有变化了
      

  3.   

    速度、效率问题,HashMap效率高
      

  4.   

    在一般编程中我们常用的是hashmap,因为它的效率比较高,而且一般情况下我们是不需要考虑线程安全问题的。如果你需要考虑线程安全的时候,那你就不能用hashmap了。
      

  5.   

    Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的 synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的 HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。 
    因为你输入的是空值,Hashmap可以存在空值,所以肯定不报错!你的做法没有错误!
    同时如果你还不知道错误的话,可以try .catch一下!
      

  6.   

    线程安全是有代价的,增加的synchronized控制对效率有影响。当在hashtable的作用域在一个方法中,
    同步控制无疑是种浪费,不存在多线程共享此hashtable,用hashmap更合适。new Hashtable().put(null,null);会报空指针错误的!