Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代久的。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作。 HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。 这里HashSet就是其实就是HashMap的一个视图。HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。
往hashset中插入对象其实只不过是内部做了
public boolean add(Object o) {
return map.put(o, PRESENT)==null;
}
HashMap为散列映射,它是基于hash table的一个实现,它可在常量时间内安插元素,或找出一组key-value pair.HashSet为散列集,它把查找时间看的很重要,其中所有元素必须要有hashCode()
HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)
HashSet, TreeSet都是集合类型,如果对存储的数据没有顺序要求,两者可混用;但TreeSet可以对存储的数据进行排序和滚动,适合处理对数据经常分析的情况。
其他如果要同步可以通过Collections来实现,如:
SortedSet chaterNameSet ;
SortedMap nameToBean ;
chaterNameSet = Collections.synchronizedSortedSet(new TreeSet()) ;
nameToBean = Collections.synchronizedSortedMap(new TreeMap()) ;
//返回一个被new TreeSet()支持的安全线程列表
chaterNameSet = Collections.synchronizedSortedSet(new TreeSet()) ;
//返回一个被new TreeMap()支持的安全线程映射
nameToBean = Collections.synchronizedSortedMap(new TreeMap()) ;
synchronizedSortedSet()和synchronizedSortedMap()被用来获得各种类集的同步(安全线程)拷贝。因为没有任何一个标准类集实现是同步的。必须使用同步算法来为其提供同步。
另一种观点:同步类集的迭代函数必须在synchronized块内使用
分享到:
相关推荐
### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...
Map接口则不同于Collection,它是键值对存储的接口,常见的实现类有HashMap、TreeMap、Hashtable、ConcurrentHashMap和Properties。 集合框架的主要优点在于其提供的数据结构和算法。例如,ArrayList和LinkedList...
Map接口用于存储键值对,HashMap、TreeMap和Hashtable是最常用的实现。HashMap提供了高效的查找性能,通过哈希表存储键值对,但不保证键的顺序。TreeMap按键的自然顺序或自定义比较器进行排序,而Hashtable是古老的...
2. Map接口:键值对集合的父接口,实现类有HashMap、TreeMap、HashTable等。 3. Set接口:无序、不可重复、唯一,实现类有HashSet、TreeSet、LinkedHashSet等。 4. List接口:有序、可重复、多个null元素,实现类有...
HashMap 是一个基于哈希表的集合类,HashTable 是一个线程安全的基于哈希表的集合类,TreeMap 是一个基于树形结构的集合类。 三、Collections Collections 是 Java 中提供的一个工具类,提供了对集合类的操作方法...
本文主要探讨了几个关键的集合接口和实现类的底层源码,包括List、HashMap、HashSet等,以及它们的基本操作。 首先,Collection接口是所有单值集合的父接口,提供了增加、删除、遍历元素的基本方法。例如,`add()`...
Java集合详解4:HashMap和HashTable Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb
HashMap和TreeMap分别基于哈希表和红黑树,而Hashtable是线程安全的HashMap。 使用集合框架的优点包括: - 容量自增长:集合可以自动扩展其大小以适应更多的元素。 - 高性能的数据结构和算法:集合框架内置了高效的...
- **Set**:无序且不允许重复元素的集合,如HashSet和TreeSet。 - **Queue**:遵循先进先出(FIFO)原则的数据结构,如LinkedList可以作为队列使用。 - **Map**:存储键值对的数据结构,如HashMap和TreeMap。 2....
Map接口用于存储键值对的集合,常用的实现类有HashMap、TreeMap、HashTable和ConcurrentHashMap。HashMap在JDK 1.7中基于数组+链表实现,在JDK 1.8中引入了红黑树以优化链表过长导致的性能问题。当链表长度超过8,且...
Java 集合框架详解 Java 集合框架是 Java 语言中用于存储和操作数据的重要组件。它提供了一些预定义的...Map 接口的实现类主要有 HashMap、TreeMap、Hashtable 等,分别基于数组+链表、红黑树和数组+链表结构实现的。
Map接口是双值集合,存储键值对,如HashMap、TreeMap和Hashtable。HashMap是基于哈希表实现的,提供了快速的查找,但不保证键的顺序。TreeMap使用红黑树实现,保证了键的排序。Hashtable是古老的线程安全Map,但在...
HashMap和TreeMap分别基于HashSet和TreeSet实现。HashMap提供了快速的键值查找,但不保证有序。TreeMap则按照键的自然顺序或Comparator进行排序。Properties是Hashtable的一个特例,常用于读取和修改配置文件。 在...
实现Map接口的主要类包括HashMap、TreeMap、Hashtable和Properties。HashMap提供了最快的查找速度,而TreeMap保持键的排序。Hashtable是线程安全的,但它是同步的,因此比HashMap慢。Properties类继承自Hashtable,...
- Set中的HashSet基于HashMap实现,LinkedHashSet基于HashMap并维护插入顺序,TreeSet基于红黑树。 - Map中的HashMap在JDK1.8之前是数组+链表,1.8后引入红黑树优化冲突处理,LinkedHashMap额外维护插入或访问顺序...
4. 映射(Map)接口:Map接口存储键值对,如HashMap、TreeMap和Hashtable。HashMap提供快速的查找,而TreeMap保持键的排序。 三、常用操作 1. 添加元素:add() 方法用于向集合添加元素,对于Set,如果元素已存在,...
集合框架的底层数据结构主要有:ArrayList(Object数组)、LinkedList(双向循环链表)、HashSet(基于HashMap实现的)、LinkedHashSet(继承于HashSet,内部采用LinkedHashMap实现)、TreeSet(红黑树)、HashMap...