HashMap和Hashtable的实验比较结果

面试题中常有HashMap和Hashtable的异同比较题,今天闲着无事,做了一点小比较,实验结果如下:

 HashMapHashtable
允许空键允许不允许
允许空值允许不允许
以空键取值能取到值 
取空值能取得 
插值速度稍高稍低
取值速度
遍历速度两者差不多两者差不多

 

测试代码如下:

package com.sitinspring;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, String> hashMap = new HashMap<String, String>();
        Map<String, String> hashTable = new Hashtable<String, String>();

        // 测试一:往两者中放空键,hashMap允许,hashTable不允许,第二句会抛出空指针异常
        hashMap.put(null, "value");
        hashTable.put(null, "value");

        // 测试二:往两者中放空值,hashMap允许,hashTable不允许,第二句也会抛出空指针异常
        hashMap.put("key", null);
        hashTable.put("key", null);

        // 测试三:以空键取hashMap中的值,结果能够取到"value"
        String value = hashMap.get(null);
        System.out.println("取出的值等于" + value);

        // 测试四:以键"key"取hashMap中的值,结果能够取到null
        String value2 = hashMap.get("key");
        System.out.println("取出的值等于" + value2);
        
        // 测试五:插值速度比较,两者差别不大
        int max=100000;
        
        TimeTest tableTimeTest=new TimeTest();
        setValuesToMap(hashTable,max);
        tableTimeTest.end("往hashTable插"+max+"值耗时");
        
        hashMap.clear();// 清楚掉原来加入的值        
        TimeTest mapTimeTest=new TimeTest();
        setValuesToMap(hashMap,max);
        mapTimeTest.end("往hashMap插"+max+"个值耗时");        
        
        // 测试六:取值速度比较,hashTable速度平均约为hashMap的四分之一到七分之一
        TimeTest tableTimeTest2=new TimeTest();
        getValuesFromMap(hashTable,max);
        tableTimeTest2.end("从hashTable取"+max+"值耗时");
        
        TimeTest mapTimeTest2=new TimeTest();
        getValuesFromMap(hashMap,max);
        mapTimeTest2.end("往hashMap取"+max+"个值耗时");    
        
        // 测试七:遍历速度比较,hashTable速度和hashMap的差不多
        TimeTest tableTimeTest3=new TimeTest();
        traversalMap(hashTable);
        tableTimeTest3.end("遍历hashTable耗时");
        
        TimeTest mapTimeTest3=new TimeTest();
        traversalMap(hashMap);
        mapTimeTest3.end("遍历hashMap耗时");
    }
    
    private static void setValuesToMap(Map<String,String> map,int max){
        for(int i=0;i<max;i++){
            String str=String.valueOf(i);
            map.put(str, str);
        }
    }
    
    private static void getValuesFromMap(Map<String,String> map,int max){
        for(int i=0;i<max;i++){
            String str=map.get(i);
        }
    }
    
    private static void traversalMap(Map<String,String> map){
        Iterator it=map.keySet().iterator();
        
        while(it.hasNext()){
            String key=(String)it.next();
            String value=map.get(key);
        }
    }
}

 

   时间测试类:

  

package com.sitinspring;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class TimeTest {
    private Calendar startTime;

    public TimeTest() {
        startTime = new GregorianCalendar();
    }

    public void end(String functionName) {

        Calendar endTime = new GregorianCalendar();

        int miniteSpan = endTime.get(Calendar.MINUTE)
                - startTime.get(Calendar.MINUTE);
        int secondSpan = endTime.get(Calendar.SECOND)
                - startTime.get(Calendar.SECOND);
        int msecondSpan = endTime.get(Calendar.MILLISECOND)
                - startTime.get(Calendar.MILLISECOND);

        System.out.println(functionName + " " + String.valueOf(miniteSpan)
                + " 分 " + String.valueOf(secondSpan) + " 秒 "
                + String.valueOf(msecondSpan) + " 毫秒 ");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值