共同点 : 都是Map接口的实现类,底层结构都是哈希表 异同点 : 1.继承体系不同 2.线程是否安全不同 HashMap 线程不安全|不同步 Hashtable 线程安全的|同步的 3.扩容机制不同 HashMap扩容机制 : 每次扩容原容量的2倍 int newCap = oldCap << 1 Hashtable扩容机制 : 原容量的2倍+1 int newCapacity = (oldCapacity << 1) + 1; 4.键值对数据null值的要求不同 HashMap 可以存储null值的key与value Hashtable key与value都不为null 5.计算hash值与位桶索引index的算法不同 HashMap : int hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); int index = (n - 1) & hash Hashtable : int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; 如何处理HashMap线程不安全问题: 1.使用Hashtable 2.使用Collections工具类中staticMap synchronizedMap(Map m) 返回由指定映射支持的同步(线程安全)映射。 3.juc高级并发编程包 ConcurrentHashMap -> 线程安全的哈希表
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)