2-2 HashTable-LinkedHashMap-各个map的区别-hashset
上一篇:
2-1 HashMap-ConcurrentHashMap
这里是easy的java基础面试
下面是总的阅览:
java基础
java集合
JVM
多线程
mysql_数据库
计算机网络
nosql_redis
设计模式
操作系统
消息中间件activeMq
SSM框架面试题
服务中间件Dubbo
1-HashTable
1-1-参数
(1) table 是一个 Entry[]数组类型,而 Entry 实际上就是一个单向链表。哈希表的
"key-value 键值对"都是存储在 Entry 数组中的。
(2)count 是 Hashtable 的大小,它是 Hashtable 保存的键值对的数量。
(3)threshold 是 Hashtable 的阈值,用于判断是否需要调整 Hashtable 的容量。
threshold 的值=“容量*加载因子”。
(4)loadFactor 就是加载因子。 == 0.75
(5)modCount 是用来实现 fail-fast 机制的 modCount是修改次数
注意: hashtable在 hashmap的基础上 给 get put remove方法加上 synchronized修饰。并且key value 都不为null
扩容: 默认容量为 11 ,扩容增量为2 * 原始数组长度 + 1
线程安全,但是有同步操作,会很慢。
2-hastable和hashmap的区别
类别 | hashtable | hashmap |
---|---|---|
方法 | 同步方法 | 未同步 |
允许Null | key/value都不允许为 null | 允许(key / value) |
遍历方式 | 比map多个elements方法。通过values返回一个Collection遍历 / entryset遍历 | 没有elements方法 |
使用 | Enumeration | iterator |
哈希值的不同使用 | 直接使用对象的hashcode | 重新计算 hash值 |
数组大小及扩容 | 默认为11, 2 * 原始大小 + 1 | 2^n 2^n * 2 |
基于类 | 基于Dictionary类 | 基于abstractMap类 |
3-ConcurrentHashMap和hashTable区别
类别 | ConcurrentHashMap | HashTable |
---|---|---|
锁定范围 | 仅仅锁定的是 map的某个部分 | 锁定整个map |
具体的措施 | 1.7分段锁,每一把锁只锁定容器的某个部分,且锁在代码块中。多线程下,访问容器不同数据段的数据,就不会造成锁竞争。提高了并发访问率。 | 使用synchronized 保证线程安全,但效率非常低下。多线程下,会造成阻塞/轮训状态,如使用put ,另一线程不能put新元素,也不能get。 竞争会越来越激烈,效率越低。 |
4-LinkedHashMap重要(Lru算法的实现哦)
结构: 由hashmap + linkedList(双向链表)实现。
https://blog.csdn.net/justloveyou_/article/details/71713781
4-1LinkedHashMap与hashMap的区别
类别 | LinkedHashMap | HashMap |
---|---|---|
类 | 是 hashmap的子类 | extends abstractMap |
节点 | 在 Entry中增加了 before 和 after指针,分别维护双向链表。 | |
put | 在hashmap中插入新的entry时,还会addBefore方法,将其加入双向链表中,给双向链表head添加一份。 | 正常 |
扩容 | 对其中的重哈希过程transfer方法重写。(因为有双向链表) | 正常 |
get方法 | getEntry获取 Entry 在此基础上,进一步获取指定键对应的值。 |
5-HashSet
5-1 原理
对于 HashSet 而言,它是基于 HashMap 实现的
Hashset 源码 http://zhangshixi.iteye.com/blog/673143
Hashset 如何保证集合的没有重复元素?
可以看出 hashset 底层是 hashmap 但是存储的是一个对象,hashset 实际将该元
素 e 作为 key 放入 hashmap,当 key 值(该元素 e)相同时,只是进行更新 value,并不会新增
加,所以 set 中的元素不会进行改变。
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
add() 方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
5-2hashmap和hashset区别
hashmap | hashset |
---|---|
实现了map接口 | 实现了 set接口 |
存储键值对 | 存储对象 |
调用put 向map中放入值 | add方法 |
hashmap使用key计算hashcode | 直接使用成员对象来计算hashcode |
hashmap相对 hashset较快,因为他是使用唯一键获取对象 | hashset较 hashmap来说比较慢。 |
下一篇:
2-3 Collections.Sort-Iterator-ArrayList和Vector和LinkedList-深拷贝浅拷贝