Hashmap 是线程安全的吗?Hashtable为什么是线程安全的?
HashMap是线程不安全的,而Hashtable是线程安全的,因为它的所有CRUD操作都被synchronized修饰,这种实现是十分缓慢的。Hashtable不允许出现key和值为null,但是hashmap允许。
下面解释一下什么是线程安全,什么是线程不安全。
线程安全:所谓线程安全简单的讲就是控制多个线程对某个资源的有序访问或修改。就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全:线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
HashMap和Hashtable使用内部类Entry<K,V>来存储数据。这个条目是一个具备两个额外数据的键值对
1、一个对其它Entry的引用,这样HashMap就可以像单链表一样存储条目
2、一个哈希值展示了键的哈西值。存储这个值目的在于避免每次HashMap需要这个值时进行重复计算。
hashmap底层采用链表来存储数据,并用一个entry数组存放所有的链表。
hashmap中的put方法:https://blog.youkuaiyun.com/weixin_38480293/article/details/79405352
1.先计算key的hashcode值,将hash值与数组的长度减一进行按位与运算,得到索引位置(桶的位置)
2.判断索引位置的值,诺为空,则直接插入,不为空,判断桶的结构是红黑树还是链表,如果是链表,遍历链表中的key,如果不存在相同的key,则插入链表,判断插入链表后的长度是否大于等于8,如果是则转为红黑树;如果是红黑树,则遍历判断key即可。
hashmap中的get方法:这个操作的原理就比较简单,只需要根据key
的hashcode
算出元素在数组中的下标,之后遍历Entry
对象(jdk8之后变为Node了)链表,直到找到元素为止。(通过equals方法进行key的判断)
深入理解hashmap原理:http://www.jfh.com/jfperiodical/article/2037?