再谈HashMap与HashTable,引入TreeMap浅谈

(1)首先说明HashMap与HashTable:

HashMap是线程不安全的,是对HashTable的轻量级实现,都是对双列数据的存储。HashMap是在jdk1.2引进的对Map的实现,HashTable出现较早。

HashMap允许null-key && null-value,但是HashTable不允许。

HashMap把HashTable的contains方法去掉了,改为了containsKey,containsValue,避免误解。

最大的不同点:

HashMap线程不安全,允许null-key,null-value;HashTable线程安全(方法加synchronized),且不允许null-key,null-value;

正因为HashMap不安全,所以在多线程使用时需要考虑同步的问题,而HashTable不需要。

(2)TreeMap

HashMap和HashTable里存储的数据都是无序的,TreeMap里的数据是有序的,所以这个是他们之间的最大特点!TreeMap使用二叉树排序,HashMap使用哈希表,所以HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。 

测试代码:

import java.util.Map;    
import java.util.HashMap;    
import java.util.Set;    
import java.util.HashSet;    
import java.util.Iterator;    
import java.util.Hashtable;    
import java.util.TreeMap;    
class  HashMaps    
{    
       public static void main(String[] args)     
      {    
            Map map=new HashMap();                
            map.put("a", "aaa");    
            map.put("b", "bbb");    
            map.put("c", "ccc");    
            map.put("d", "ddd");    
               
            Iterator iterator = map.keySet().iterator();                
            while (iterator.hasNext()) {    
             Object key = iterator.next();    
             System.out.println("map.get("+key+") is :"+map.get(key));    
            }           
            /**
             * HashMap和TreeMap有什么区别。HashMap通过hashcode对其内容进行快速查找,
             * 而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个
             * 有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
             */
            Hashtable tab=new Hashtable();                
            tab.put("a", "aaa");    
            tab.put("b", "bbb");    
            tab.put("c", "ccc");    
            tab.put("d", "ddd");    
            Iterator iterator_1 = tab.keySet().iterator();    
            while (iterator_1.hasNext()) {    
             Object key = iterator_1.next();    
             System.out.println("tab.get("+key+") is :"+tab.get(key));    
            }             
                
            TreeMap tmp=new TreeMap();                
            tmp.put("a", "aaa");    
            tmp.put("b", "bbb");    
            tmp.put("c", "ccc");    
            tmp.put("d", "ddd");    
            Iterator iterator_2 = tmp.keySet().iterator();    
            while (iterator_2.hasNext()) {    
             Object key = iterator_2.next();    
             System.out.println("tmp.get("+key+") is :"+tmp.get(key));    
            }             
       }    
}


详细出处参考:http://www.jb51.net/article/32652.htm

(3)HashMap通过HashCode对其内容进行快速查找,而TreeMap中所有的元素都保持着固定的顺序。如果要得到有序的结果就使用Treemap。HashMap的子类LinkedHashMap也可以实现有序排列。

Object中的hashCode返回值相当于当前的地址,也就是说对于不同对象,即使他们的内容完全相同,但HashCode却不相同。如果比较HashMap中存储的Value对象内容是否相等,则需要覆盖hashCode()和equals()方法。

8、 怎样使Hashmap同步?

HashMap可以通过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。

10、为什么Vector类认为是废弃的或者是非官方地不推荐使用?或者说为什么我们应该一直使用ArrayList而不是Vector

你应该使用ArrayList而不是Vector是因为默认情况下你是非同步访问的,Vector同步了每个方法,你几乎从不要那样做,通常有想要同步的是整个操作序列。同步单个的操作也不安全(如果你迭代一个Vector,你还是要加锁,以避免其它线程在同一时刻改变集合).而且效率更慢。当然同样有锁的开销即使你不需要,这是个很糟糕的方法在默认情况下同步访问。你可以一直使用Collections.sychronizedList来装饰一个集合。

事实上Vector结合了“可变数组”的集合和同步每个操作的实现。这是另外一个设计上的缺陷。Vector还有些遗留的方法在枚举和元素获取的方法,这些方法不同于List接口,如果这些方法在代码中程序员更趋向于想用它。尽管枚举速度更快,但是他们不能检查如果集合在迭代的时候修改了,这样将导致问题。尽管以上诸多原因,oracle也从没宣称过要废弃Vector.


你可能感兴趣的:(再谈HashMap与HashTable,引入TreeMap浅谈)