继往开来 吐故纳新
日历
网志分类
· 所有网志 (1024)
· 个人作品 (64)
· 软件设计 (33)
· 面向对象编程 (22)
· JavaAPI (44)
· Java开源工具 (36)
· Swing (34)
· Java语法细节 (39)
· 样式表CSS (12)
· XML (9)
· J2EE(JavaEE) (23)
· 算法数据结构 (64)
· 正则表达式 (4)
· 软件知识 (6)
· Java线程 (9)
· Web开发.Jsp/Servlet/Struts (20)
· 程序随想录 (7)
· Hibernate (7)
· Spring (5)
· J2SE 高级 (2)
· J2SE 高级 (0)
· Web开发.Ajax (16)
· Web开发.JavaScript (48)
· DB4O (2)
· Web开发.CSS/Html (22)
· C# (20)
· ERP (4)
· JDBC (1)
· 编程资源 (16)
· 编程感悟 (29)
· DB/Sql (13)
· VB (29)
· VC (2)
· 桌面脚本 (3)
· 新兴软件 (3)
· 英语学习 (21)
· 网文转载 (163)
· 职场风云 (40)
· 诗词歌赋 (32)
· 生活感言 (79)
· 生活常识 (0)
· 奇文共赏 (15)
· 财经纵横 (9)
· 未分类 (17)
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 偶要雷锋
· 豆瓣
· nczonline
· 当当网
· easyjf中文站
· Donews
· 天极Java文章列表
· W3CSchool
· taiten的BLOG
· Dojo中国
· Dojo
· Extjs.com
· Lifehack中文网志
· JaveEye的一个AS专题
· Banq's JDon
· Java 中文网址大全
· 梦想Java
· 360Doc个人图书馆
· java开源大全
· 我在硅谷动力的软件下载站
· 站长中国
· 随意贴
· CSS教学素材站
· java 参考中文站
· 面向构件与SOA社区
· 彩字生成
· 派派小说论坛
· 如坐春风
· 英语学习网
· BBC CHina
· www.dlbang.com
· 古文竖排格式在线转化工具
· 免费家谱
· 图片上传基地
· 风景壁纸
· 和风细雨
· MyC#BlogInCsdn

订阅 RSS

0250083

歪酷博客

开此博一为经验积累,二为资料收集,三为同道交流,四为资源共享.
« 上一篇: [原创]用点积和叉乘解决空间中固定朝向物体的摆放问题 下一篇: [原创]Java 正则表达式的总结和一些小例子 »
Junglesong @ 2007-12-16 21:00

面试题中常有HashMap和Hashtable的异同比较题,今天闲着无事,做了一点小比较,实验结果如下:
   HashMap  Hashtable
 允许空键  允许  不允许
 允许空值  允许  不允许
 以空键取值  能取到值  
 取空值  能取得  
 插值速度  稍高  稍低
 取值速度  高  低
 遍历速度  两者差不多 两者差不多

测试代码如下:
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) + " 毫秒 ");
    }
}

代码下载:
http://www.blogjava.net/Files/sitinspring/HashMapHashtable20071215212107.rar


曾经的这一天...



评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定