`

HashMap和Hashtable的实验比较结果

 
阅读更多

面试题中常有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) + " 毫秒 ");
    }
}

 

分享到:
评论

相关推荐

    java实验04.pdf

    实验的结果部分展示了如何实现上述功能的关键代码和运行结果,例如ArrayList的add、remove、get方法,HashMap的put、get、remove方法,以及Vector的add和get方法的使用。 总的来说,这个实验全面地覆盖了Java集合...

    java实验04.docx

    实验报告的评估部分涉及实验态度、结果、理论掌握和操作技能的评价,这有助于反馈学生在实验过程中的表现和理解程度。通过完成这样的实验,学生可以深入理解Java集合框架和泛型的概念,并提高实际编程能力。

    实验七:Java集合与泛型

    Map接口的实现类HashMap、TreeMap和HashTable各有特点。HashMap是无序的,允许空值键和值,查找和插入操作非常快速。HashTable是线程安全的,但在Java 5以后,通常推荐使用ConcurrentHashMap来替代,因为它的并发...

    java程序设计--实验报告(5)

    2. **哈希表对象**:哈希表在Java中主要通过`HashMap`类和`Hashtable`类来实现,它们提供了高效的键值对存储和检索功能。哈希表通过哈希函数将键映射到存储位置,实现快速查找。在实验中,可能涉及到如何创建哈希表...

    hashtable-lab-Soulhae:GitHub课堂创建的hashtable-lab-Soulhae

    您只能修改文件hashmap.c和main.c 您可以查看test.c文件以了解代码中的错误要测试您的代码,您必须单击“运行”▸ 不允许使用git命令(除非得到老师的指导) 要测试完成的代码,您可以像这样编译和运行main: gcc ...

    java常用集合类总结

    Map接口有两个常用的实现类:HashMap和Hashtable。HashMap是以哈希表的形式存储键值对,速度快,但不允许键值对重复。Hashtable是Dictionary类的替代品,提供了按键取值的功能。 Iterator接口是Java集合类中的一种...

    hashtable-lab-nicobrevis:GitHub Classroom创建的hashtable-lab-nicobrevis

    您只能修改文件hashmap.c和main.c 您可以查看test.c文件以了解代码中的错误要测试您的代码,您必须单击“运行”▸ 不允许使用git命令(除非得到老师的指导) 要测试完成的代码,您可以像这样编译和运行main: gcc ...

    hashtable-lab-OkitaDev:GitHub Classroom创建的hashtable-lab-OkitaDev

    您只能修改文件hashmap.c和main.c 您可以查看test.c文件以了解代码中的错误 要测试您的代码,您必须单击“运行”▸ 不允许使用git命令(除非得到老师的指导) 要测试完成的代码,您可以像这样编译和运行main: ...

    hashtable-lab-eyl-lana:GitHub Classroom创建的hashtable-lab-eyl-lana

    您只能修改文件hashmap.c和main.c 您可以查看test.c文件以了解代码中的错误 要测试您的代码,必须单击“运行”▸ 不允许使用git命令(除非得到老师的指导) 要测试完成的代码,您可以像这样编译和运行main: ...

    hashtable-lab-suazo-jara:GitHub Classroom创建的hashtable-lab-suazo-jara

    您只能修改文件hashmap.c和main.c 您可以查看test.c文件以了解代码中的错误要测试您的代码,必须单击“运行”▸ 不允许使用git命令(除非得到老师的指导) 要测试完成的代码,您可以像这样编译和运行main: gcc ...

    hashtable-lab-vicho-bece:GitHub Classroom创建的hashtable-lab-vicho-bece

    您只能修改文件hashmap.c和main.c 您可以查看test.c文件以了解代码中的错误要测试您的代码,必须单击“运行”▸ 不允许使用git命令(除非得到老师的指导) 要测试完成的代码,您可以像这样编译和运行main: gcc ...

    中兴软创笔试题目(华南农业大学考试)

    5. `HashMap`与`Hashtable`的区别:`HashMap`允许键或值为`null`,而`Hashtable`不允许。`HashMap`是非同步的,`Hashtable`是线程安全的。此外,`HashMap`的迭代顺序是不确定的,而`Hashtable`的迭代顺序是固定的...

    《java程序设计上机实验报告》.docx

    - 集合框架包括数组列表(ArrayList)、链表(LinkedList)、哈希映射(HashMap)等,如`J_HashTable.java`涉及到了数据存储和查找的高效实现。 5. **字符串操作** - Java中的`String`类提供了丰富的字符串操作...

    java数据结构课件与分析

    通过"WorkshopApplets.ZIP"和"ExamplePrograms.ZIP"这两个压缩包,我们可能会找到相关的实验程序和实例,这些可以帮助我们更直观地理解上述概念,并提供实践操作的机会。学习过程中,动手编写代码并运行调试是加深...

    java实现DBMS

    Java中可以使用`HashMap`或`HashTable`等数据结构来实现哈希表,提供O(1)的平均时间复杂度。 再者,Java的序列化和反序列化是对象持久化的重要手段。在这个项目中,使用`ObjectOutputStream`和`ObjectInputStream`...

    MapsSets-Collections:用于练习映射和集合的 Java 2 实验室

    常见的`Map`实现有`HashMap`(非同步)、`TreeMap`(按自然排序或自定义比较器排序)和`Hashtable`(同步)。在实际编程中,`Map`常用于创建关联数据,例如配置文件、数据库缓存等。 **Set接口** `Set`接口代表了不...

    Java集合框架使用总结

    - **HashMap**: 基于哈希表的实现,允许使用`null`键和值,但不是线程安全的。 - **TreeMap**: 实现`SortedMap`接口,基于红黑树实现。保证映射按照键的自然顺序排序。 - **Hashtable**: 早期的哈希表实现,线程安全...

    JVM系列之String.intern的性能解析

    实验结果显示,`String.intern()` 的性能可能会受到并发量的影响,当操作次数增加时,它的性能可能不如 `ConcurrentHashMap`。这是因为 `HashMap` 和 `ConcurrentHashMap` 提供了线程安全的插入和查找操作,而 `...

Global site tag (gtag.js) - Google Analytics