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) 时就扩容 |
二、吐槽
又到周六了,要考试了,紧张。
近期评论