`
liubey
  • 浏览: 105483 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Hashmap、Hashtable、Arraylist的区别

    博客分类:
  • Java
阅读更多

Array有多少元素是确定的,比如足球队上场的队员有11名,是固定的,就用array。
ArrayList是不固定的,比如用sql查询数据库,不知道有多少记录返回,用Arraylist。
Enumeration 是用来一个一个列举Collection的元素的,但java2后被Iterator替代。
Hashtable用在比如你想查中国队的10号是谁,首先put(new Interger(10),new String(“海东”)),再String name=get(new Interger(10));对于简单的key--value对来说,hashtable很有用,使用索引来取值。

HashMap/Hashtable 和 Vector/ArrayList 都是放一组对象,一个是用key object来定位element, 另一个是用index定位element.
推荐使用HashMap和ArrayList的原因一样,因为他们不是Synchronized,因为不需要obtain lock each time,它们相对快很多。Synchronized在最底层是没有意义的,在这里不想多讲。
我本人更加推荐是用LinkedList而不是 ArrayList.因为在更多的时候,我们很少真的从一个List里拿出某一个element,相对的,遍例整个List的情况最多,在这种情况下用 Iterator是最高效的。
Vector是一个一维的容器。HashTable、HashMap都是二维的。
和数组的区别是hash……不用向数组那样事先定义长度。而可以随意追加。它是key和value对应的。用key作为检索。
HashTable和Vector 都是Synchronized都是旧的Java平台的集合类,ArrayList和HashMap由于少了Synchronized的开销,速度比较快。一般不牵涉到线程之间数据共享的问题都用ArrayList和HashMap吧,当然也可以用LinkedList,用listIterator来遍历.
HashTable ,HashMap
上面两个用起来差不多,不过建议使用HashMap,因为hashtable被淘汰了


Vector,ArrayList
Vector 比 ArrayList慢,是因为vector本身是同步的,而arraylist不是
所以,没有涉及到同步的推荐用arraylist.



再谈ArrayList和LinkedList:
ArrayList的缺点是,当the underlying Array reaches the maximum capacity,一个新的双倍长的array has to be initialized,紧跟着的是Array Copy,很慢。同样,remove到1/4length时,array shrinks by creating a new shorter array and array copy all elements.所以,如果你要用的List打下常常改变,绝对不应该用ArrayList.
LinkedList的缺点是当去取某个 indexed element时,必须做一次遍历。但是,这种情况我发现在real life project里很少。

Hashtable与HashMap的区别:

   1. Hashtable是基于陈旧的Dictionary的子类;HashMap是Java1.2引进的Map接口的一个实现类。
   2. Hashtable中的方法是同步的,线程安全的;而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:Map Collections.synchronizedMap(Map m);使用如下:Map map=Collections.synchronizedMap(new HashMap())。这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
   3. 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。而Hashtable中不允许null值。
List和Set的区别:

   1. List用来处理序列,而Set用来处理集。
   2. List中的内容可以重复,而Set则不行。
5
5
分享到:
评论
3 楼 woniu1983 2010-07-05  
另外: LinkedList的缺点是当去取某个 indexed element时,必须做一次遍历。但是,这种情况我发现在real life project里很少。

确实是做了一次遍历,但遍历的长度不是整个List的长度,做了简单的二分:index < (size >> 1) => 判断index和1/2 size的大小

JDK 1.5中LinkedList的代码:

public E get(int index) {
        return entry(index).element;
    }

/**
     * Return the indexed entry.
     */
    private Entry<E> entry(int index) {
        if (index < 0 || index >= size)
            throw new IndexOutOfBoundsException("Index: "+index+
                                                ", Size: "+size);
        Entry<E> e = header;
        if (index < (size >> 1)) {
            for (int i = 0; i <= index; i++)
                e = e.next;
        } else {
            for (int i = size; i > index; i--)
                e = e.previous;
        }
        return e;
    }
2 楼 woniu1983 2010-07-05  
补充说明: 上面的代码是 JDK 1.5
1 楼 woniu1983 2010-07-05  
当ArrayList的当前容量达到最大值时, 会重新分配新的容量,但是这个容量是原来的1.5倍,不是双倍增长吧? 双倍增长的是Vector。

不知道我们说的是不是同一回事? 呵呵

附Code:
ArrayList:
public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
	    elementData = (E[])new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, size);
	}
    }


Vector:
private void ensureCapacityHelper(int minCapacity) {
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object[] oldData = elementData;
	    int newCapacity = (capacityIncrement > 0) ?
		(oldCapacity + capacityIncrement) : (oldCapacity * 2);
    	    if (newCapacity < minCapacity) {
		newCapacity = minCapacity;
	    }
	    elementData = new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, elementCount);
	}
    }

相关推荐

Global site tag (gtag.js) - Google Analytics