`
JackyCheng2007
  • 浏览: 253311 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于Hashtable和HashMap, Vector和ArrayList

 
阅读更多
在功能上讲Hashtable和HashMap, Vector和ArrayList有着几乎相同的功能。他们的主要区别在于:
Hashtable和HashMap的区别,先看put方法的源代码
Hashtable
public synchronized V put(K key, V value) {
	// Make sure the value is not null
	if (value == null) {
	    throw new NullPointerException();
	}

	// Makes sure the key is not already in the hashtable.
	Entry tab[] = table;
	int hash = key.hashCode();
	int index = (hash & 0x7FFFFFFF) % tab.length;
	for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
	    if ((e.hash == hash) && e.key.equals(key)) {
		V old = e.value;
		e.value = value;
		return old;
	    }
	}

	modCount++;
	if (count >= threshold) {
	    // Rehash the table if the threshold is exceeded
	    rehash();

            tab = table;
            index = (hash & 0x7FFFFFFF) % tab.length;
	}

	// Creates the new entry.
	Entry<K,V> e = tab[index];
	tab[index] = new Entry<K,V>(hash, key, value, e);
	count++;
	return null;
    }

HashMap
public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

从源代码上看,区别就很明显了:
1. Hashtable里面的方法是同步的(synchronized),而HashMap不是。换句话说Hashtable是线程安全的,HashMap不是。在单线程条件下,HashMap比Hashtable快。
2. Hashtable不接受null值,HashMap接受。Hashtable也不接受null key,而HashMap接受。运行下面的代码,就知道Hashtable 的put会抛出NullPointerException。只是在源代码中对value的null做了check,并且显示的抛出异常,而对于key,这是在调用int hash = key.hashCode();的时候自动抛出的。
HashMap hm = new HashMap();
		hm.put(null, null);
		Hashtable ht = new Hashtable();
		ht.put("OK", null);
		ht.put(null, "OK");


Vector和ArrayList也类似,他们唯一的区别就是Vector里面的方法是同步的(synchronized),而ArrayList不是。

JDK5 开始引入了concurrent包,里面包含ConcurrentHashMap,可以用在多线程环境下来代替Hashtable。
但是为什么没有一个类来代替Vector呢?
1
9
分享到:
评论
2 楼 king520 2012-05-02  
很基础!温故而知新~
1 楼 jyjava 2012-05-01  
Vector这个东东在学校里学习的时候用过

相关推荐

    经典讲解List和ArrayList和Vector和HashTable和HashMap区别

    在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较Vector、ArrayList和hashtable hashmap

    - HashMap 和 Hashtable 都实现了 Map 接口,HashMap 更快但不是线程安全的,而 Hashtable 是线程安全但较慢。WeakHashMap 则使用弱引用作为键,有助于防止内存泄漏。 - 在选择使用哪种数据结构时,需要考虑性能需求...

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List和ArrayList的区别。List是一个接口,而ArrayList是一个实现了...

    Hashtable和HashMap的区别:

    其中,`ArrayList` 和 `Vector` 都实现了 `List` 接口,但是 `ArrayList` 不是线程安全的,而 `Vector` 是线程安全的。同样地,`LinkedList` 也不是线程安全的。 #### 七、总结 综上所述,`Hashtable` 和 `HashMap...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    Vector与ArrayList类似,但它提供了一种线程安全的实现,这意味着在多线程环境中,多个线程可以同时访问和修改Vector,而不会导致数据不一致。然而,由于其同步机制,Vector的性能通常低于ArrayList。 3. Map接口与...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的容器类是非常重要的。 Collection接口是Java中最基本的集合...

    Arraylist、Hashtable、Vector

    在Java编程语言中,ArrayList、Hashtable和Vector是三种常见的数据结构,它们都用于存储和管理对象,但各有特点和适用场景。以下是对这三个容器的详细解释: ArrayList是Java集合框架中的一部分,它实现了List接口...

    浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别

    ArrayList和Vector,以及HashMap和Hashtable,都是常用的容器,但它们之间存在一些关键的区别,这将影响到在不同场景下的选择和使用。 首先,我们来看ArrayList和Vector的区别: 1. **同步性**: - `ArrayList` ...

    hashmap 实例

    在本文中,我们将深入理解 HashMap 的实例及其工作原理,并与其他数据结构如 Vector、ArrayList、LinkedList 和 Hashtable 进行对比。 首先,我们来看 HashMap 的实例代码: ```java HashMap hashmap = new ...

    各种类集 的区别1

    本篇文章主要探讨了两个重要的类集实现:HashMap与Hashtable,以及ArrayList和Vector的区别。 首先,我们来看HashMap与Hashtable的区别: 1. **线程安全性**:HashMap是非线程安全的,它不保证在多线程环境下的...

    ArrayList数组列表[借鉴].pdf

    总结来说,ArrayList和Vector在并发环境下的使用需谨慎,HashMap和Hashtable的选择取决于是否需要线程安全。Properties类是处理字符串键值对的理想选择。理解这些类的特性对于优化代码性能和保证数据安全性至关重要...

    各容器与迭代器的用法.pdf

    例如,ArrayList、Vector、Hashtable和HashMap都可以通过Iterator进行迭代,也可以使用for-each循环,通过`size()`和`get()`方法访问元素。同时,这些容器还支持`toString()`方法以字符串形式展示内容,以及`isEmpty...

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    ArrayList和Vector都是List接口的实现,但ArrayList在大多数情况下性能优于Vector,因为它的扩容策略更有效。 ArrayList是基于动态数组实现的,其底层源码(JDK 1.7和1.8)显示,它通过在需要时增加数组大小来扩展...

    map,list,set,stack,queue,vector等区别和特点1

    在Java编程语言中,集合框架是处理对象组织和操作的...在多线程环境中,线程安全的实现如Vector和Hashtable是必要的,但在单线程或性能要求较高的情况下,非线程安全的实现如ArrayList、LinkedList和HashMap通常更优。

    java集合类面试题总结

    List 中包括 ArrayList、LinkedList、Vector 等,Set 中包括 HashSet、LinkedHashSet 等,Map 中包括 HashMap、Hashtable 等。 List、Set、Map 是否继承自 Collection 接口 List 和 Set 继承自 Collection 接口,...

    在J2ME环境下把JSON解析为Hashtable

    在Java ME(J2ME)环境中,由于资源限制,我们不能直接使用Java SE中的HashMap或ArrayList。在这种情况下,使用Hashtable和Vector作为数据容器是理想的选择,因为它们是J2ME平台支持的数据结构。本篇文章将详细介绍...

    java中集合的用法与区别.docx

    List接口的实现类包括ArrayList、LinkedList和Vector。ArrayList是一个基于数组实现的列表,提供了快速的随机访问,但插入和删除操作相对较慢。LinkedList通过链表结构实现,对于插入和删除操作有较高的效率,但随机...

    阿里巴巴电话面试试题(含答案).doc

    以下是对Java集合框架、Hashtable与HashMap以及ArrayList和LinkedList的一些关键知识点的详细解释: 1. **Java集合框架**: Java集合框架是一个统一的接口,提供了一种组织和操作对象的方式。它包括了接口(如List...

Global site tag (gtag.js) - Google Analytics