DESKTOP-JM545O1_20200911-李东鹏

一、问题

1、HashMap与Hashtable的区别

相同

两者都实现 Map 接口,用于存放<键-值对>

内部都采用 哈希表 实现,都采用 哈希算法计算<键-值对>的存放位置

区别

  • HashMap 非线程安全,内部采用一个单独的方法根据 key.hashCode() 重新计算一个哈希值后再确定元素存放位置,支持 null 键 和 null 值,HashMap 类继承 AbstraceMap 类,默认大小为16,每次扩容为原来的两倍。
  • Hashtable 线程安全,内部直接采用 key.hashCode() 来确定元素存放位置,Hashtable 不支持 null 键 和 null 值,Hashtable 类继承 Dictionary 类,默认大小为11,每次扩容为原来的2n+1。

2、

比较 List Set Map
继承接口 Collection Collection
实现类 AbstractList(其常用子类有ArrayList、LinkedList、Vector) AbstractSet(其常用子类有HashSet、LinkedHashSet) HashMap、Hashtable
常见方法 add()、remove()、clear()、get()、contains()、size() add()、remove()、clear()、contains()、size() put()、get()、remove()、clear()、containsKey()、containsValue()、keySet()、Values()、size()
元素 可重复 不可重复 键(key)不可重复、值(value)可以重复
顺序和可排序 有序,可排序 无序(实际上由HashCode决定
线程安全 Vector线程安全 Hashtable线程安全
是否含有null元素 可以含有null HashSet可以包含null HashMa键和值都可以是null、
Hashtable键和值都不能为 null
扩容方式 ArrayList扩容: oldCapacity + oldCapacity >> 1 、
Vector扩容: oldCapacity + capacityIncrement
HashMap扩容: newCapacity = oldCapacity << 1
Hashtable扩容: 当 Entry 个数超过 阈值(threshold) 时就扩容

二、吐槽

又到周六了,要考试了,紧张。