Java常见集合框架(二十二): Map之Dictionary、Hashtable
来源:互联网 发布:php网站源码怎么修改 编辑:程序博客网 时间:2024/05/22 08:12
Dictionary
public abstract class Dictionary
- Dictionary 类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。
- 任何非 null 对象都可以用作键或值。
- 此类已过时。新的实现应该实现 Map 接口,而不是扩展此类。
构造方法
public Dictionary() {}
定义了七个抽象方法,没有默认实现。
Hashtable
public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable
- 实现一个哈希表,该哈希表将键映射到相应的值。
- 任何非 null 对象都可以用作键或值。
- 用作键的对象必须实现 hashCode 方法和 equals 方法。
- 有两个参数影响其性能:初始容量 和 加载因子。
成员变量
/** * key-value以Entry形式存入此table中. */ private transient Entry[] table; /** * key-value对数. */ private transient int count; /** * 下一次扩容时的阀值 */ private int threshold; /** * 加载因子 */ private float loadFactor; /** * 修改次数 */ private transient int modCount = 0;
常用方法
public synchronized V get(Object key) { Entry<?,?> tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) { return (V)e.value; } } return null; } 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; @SuppressWarnings("unchecked") Entry<K,V> entry = (Entry<K,V>)tab[index]; for(; entry != null ; entry = entry.next) { if ((entry.hash == hash) && entry.key.equals(key)) { V old = entry.value; entry.value = value; return old; } } addEntry(hash, key, value, index); return null; }
由于Hashtable已不建议使用,故不多作源码阐述,从源码看出,Hashtable中很多方法是以synchronized修饰的,即同步的、线程安全的。
Hashtable与HashMap区别:
1. Hashtable由synchronized实现线程安全,HashMap非线程安全。
2. Hashtable不允许key或value为null,HashMap允许。
3. Hashtable的enumerator迭代器不是fail-fast的,HashMap的迭代器(Iterator)是fail-fast迭代器。
4. Hashtable继承自Dictionary,HashMap继承自AbstractMap。
5. Hashtable有contains方法,HashMap因其效率低去掉了。
6. Hashtable默认初始容量11,HashMap默认初始容量16。
7. Hashtable扩容大小:oldCapacity * 2 + 1,HashMap扩容大小:oldCapacity * 2。
阅读全文
0 0
- Java常见集合框架(二十二): Map之Dictionary、Hashtable
- Java常见集合框架(二十): Map之LinkedHashMap、SortedMap、NavigableMap、TreeMap
- Java常见集合框架(十二):Set之ConcurrentSkipListSet、EnumSet
- Java常见集合框架(二十一): Map之ConcurrentMap、ConcurrentHashMap
- Java常见集合框架(十九): Map之Map、AbstractMap、HashMap
- Java常见集合框架(十):Set之TreeSet、HashSet
- Java常见集合框架(十七):Queue总结
- Java常见集合框架(十八): Deque之Deque、BlockingDeque、LinkedBlockingDeque、ArrayDeque
- Java常见集合框架(十四):Queue之Queue、BlockingQueue、AbstractQueue
- Java常见集合框架(十五):Queue之ArrayBlockingQueue、LinkedBlockingQueue
- Java常见集合框架(十六):Queue之DelayQueue、PriorityQueue、PriorityBlockingQueue
- 集合框架之二 泛型-Map
- 二、Java:集合,Map接口框架图
- java集合框架(二)Map
- Java集合框架之Map--Hashtable和Properties源码分析
- 《Java源码解析》集合框架Map之HashTable
- Java常见集合框架(七):List之Stack
- Java常见集合框架(九):Set之Set、AbstractSet
- 前端之必备软件
- 《Effective C++》条款07总结
- mysqldumpslow 分析mysql慢查询
- 期望极大算法:Expectation Maximization Algorithm
- C++ 多态,虚函数
- Java常见集合框架(二十二): Map之Dictionary、Hashtable
- iOS 获取通讯录的4种方式详解
- IOC,控制反转的意思,DI是依赖注入
- 得到任意长度的随机字符串
- Navicat新建并运行存储过程
- angular的$q返回一个可链式调用的promise
- 全局异常捕获
- sb.Append("<br>/");------在字符串sb后面加上fname转换后的string并且换行
- Java程序员如何月薪达到两万,需要技术水平达到什么程度?